Afficher un sprite3D au dessus d'une scene 3D

Généralités sur la programmation 3D
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Afficher un sprite3D au dessus d'une scene 3D

Message par Progi1984 »

Voilà, j'essaie d'afficher un sprite 3D au dessus d'une scene 3D mais impossible alors que je n'ai aucun probleme avec un sprite tout court !

Code : Tout sélectionner

; Comtois 01/05/06
; Progi1984 After

;{ Macros
Macro MyRGB(Rouge,Vert,Bleu)
  Rouge << 16 + Vert << 8 + Bleu
EndMacro
;}
;{ Structures
Structure Vertex
   px.f
   py.f
   pz.f
   nx.f
   ny.f
   nz.f
   co.l
   u.f
   v.f
EndStructure
Structure FTriangle
   f1.w
   f2.w
   f3.w
EndStructure
Structure s_Mesh
   No.l
   *VBuffer.Vertex
   *Ibuffer.FTriangle
EndStructure
;}
;{ Decls Variables
Global Angle.f,Pas.f, CameraMode.l
Global *VBuffer,*IBuffer

Define.s_Mesh CubeMesh
;}
Structure  QTest
  state.l
  texture.l
  entity.l
  size.l
  bgcolor_red.l
  bgcolor_green.l
  bgcolor_blue.l
  fgcolor_red.l
  fgcolor_green.l
  fgcolor_blue.l
  font.s
  font_name.s
  font_size.l
  alpha.f
  delimiter.s
  trigger.l
  Version.s
EndStructure
Structure QTest_Line
  QLine.s
  QType.l
EndStructure

Global NewList TTest.QTest()
Global NewList TTest_Line.QTest_Line()
Global Test
Global Test_3D

Declare CreateColorMeshCube(*Mesh.s_Mesh, Color.l)
Declare Test_Init()
Declare Test_Update()
; Initialisation
If InitEngine3D() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
   End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 Or InitSprite3D() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
EndIf


OpenWindow(0,0, 0, 800 , 600 ,"Cube 3D",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0)

;{ 3D
; Mesh
CubeMesh\No = 0
CreateColorMeshCube(@CubeMesh, MyRGB(0,128,128))

; Texture
CreateTexture(0,128, 128)
StartDrawing(TextureOutput(0))
  Box(0, 0, 128, 128, $FFFFFF)
  Box(1, 1, 126, 126, $880000)
StopDrawing()

; Material
CreateMaterial(0,TextureID(0))
MaterialAmbientColor(0,-1)

; Entity
CreateEntity(0,MeshID(0),MaterialID(0))
ScaleEntity(0,90,90,90)

; Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-400)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))

; Light
AmbientColor(RGB(255,255,255))
;}

Test_Init()

Repeat
  ClearScreen(RGB(0,0,64))
  While WindowEvent() : Wend

  Angle + 0.8
  RotateEntity(0,angle,angle/2,-Angle)
  If ExamineKeyboard()
  
  EndIf

  
  ;DisplayTransparentSprite(0, 0, 30)
    RenderWorld()
  
  Test_Update()
  
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

Procedure Test_Init()
  Test=CreateSprite(#PB_Any,300,300, #PB_Sprite_Texture)
  
  If StartDrawing(SpriteOutput(Test))
    Box(0,0,300,300,RGB(128,0,128))
    StopDrawing()
  EndIf
  Test_3D= CreateSprite3D(#PB_Any,Test)
  
EndProcedure
Procedure Test_Update()
  ;DisplayTransparentSprite(Test, 0, 0)
  Start3D()
    DisplaySprite3D(Test_3D,0,0,255)
  Stop3D()
EndProcedure
Procedure CreateColorMeshCube(*Mesh.s_Mesh, Color.l)
   *Mesh\VBuffer=AllocateMemory(SizeOf(Vertex)*24)
   *Mesh\IBuffer=AllocateMemory(SizeOf(FTriangle)*12)
   CopyMemory(?Vertices , *Mesh\VBuffer, SizeOf(Vertex)*24)
   CopyMemory(?Triangles, *Mesh\IBuffer, SizeOf(Vertex)*24)
     
   If CreateMesh(*Mesh\No,100)
      Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color
      SetMeshData(*Mesh\No, Flag         , *Mesh\VBuffer, 24)
      SetMeshData(*Mesh\No, #PB_Mesh_Face, *Mesh\IBuffer, 12)
;      ProcedureReturn 1
   Else
      ProcedureReturn 0   
   EndIf
  *Mem.Vertex = *Mesh\VBuffer
  For i = 0 To 23
    *Mem\co=Color
    *Mem + SizeOf(Vertex)
  Next i
  Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color
  SetMeshData(*Mesh\No, Flag  , *Mesh\VBuffer, 24)
  ProcedureReturn 1
EndProcedure

DataSection
;{
Vertices:
;Dessus 0 à 3
Data.f -0.5,0.5,-0.5, 0,1,0, 0, 0,0
Data.f 0.5,0.5,-0.5,0,1,0,0,0,1
Data.f 0.5,0.5,0.5,0,1,0,0,1,1
Data.f -0.5,0.5,0.5, 0,1,0, 0, 1,0

;Dessous 4 à 7
Data.f -0.5,-0.5,0.5,0,-1,0,0,0,0
Data.f 0.5,-0.5,0.5,0,-1,0,0,0,1
Data.f 0.5,-0.5,-0.5,0,-1,0,0,1,1
Data.f -0.5,-0.5,-0.5,0,-1,0,0,1,0

;Devant 8 à 11
Data.f -0.5,0.5,0.5,0,0,1,0,0,0
Data.f 0.5,0.5,0.5,0,0,1,0,0,1
Data.f 0.5,-0.5,0.5,0,0,1,0,1,1
Data.f -0.5,-0.5,0.5,0,0,1,0,1,0

;Derrière 12 à 15
Data.f 0.5,0.5,-0.5,0,0,-1,0,0,0
Data.f -0.5,0.5,-0.5,0,0,-1,0,0,1
Data.f -0.5,-0.5,-0.5,0,0,-1,0,1,1
Data.f 0.5,-0.5,-0.5,0,0,-1,0,1,0

;Cote gauche 16 à 19
Data.f -0.5,0.5,-0.5,-1,0,0,0, 0,0
Data.f -0.5,0.5,0.5, -1,0,0, 0, 0,1
Data.f -0.5,-0.5,0.5, -1,0,0, 0, 1,1
Data.f -0.5,-0.5,-0.5, -1,0,0, 0, 1,0

;Cote droit 20 à 23
Data.f 0.5,0.5,0.5, 1,0,0, 0, 0,0
Data.f 0.5,0.5,-0.5, 1,0,0, 0, 0,1
Data.f 0.5,-0.5,-0.5, 1,0,0, 0, 1,1
Data.f 0.5,-0.5,0.5, 1,0,0, 0, 1,0

Triangles:
;0 à 3
Data.w 2,1,0
Data.w 0,3,2
;4 à 7
Data.w 6,5,4
Data.w 4,7,6
;8 à 11
Data.w 10,9,8
Data.w 8,11,10
;12 à 15
Data.w 14,13,12
Data.w 12,15,14
;16 à 19
Data.w 18,17,16
Data.w 16,19,18
;20 à 23
Data.w 22,21,20
Data.w 20,23,22
;}
EndDataSection
Anonyme

Message par Anonyme »

Ton code marche, je vois bien un carré de couleur (128,0,128).


@++
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Avec un cube qui tourne derrière ?
Anonyme

Message par Anonyme »

bah oui ^^ , je peut même faire jouer la transparence.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oui moi aussi je vois un carré violet affiché par dessus un cube 3D bleu
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ca fonctionne ici.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Chez moi le carré est blanc à cause des dimensions du Sprite3D
En revanche en modifiant les fonctions concernée pas de souci ca fonctionne bien

Code : Tout sélectionner

Procedure Test_Init()
  Test=CreateSprite(#PB_Any,256,256, #PB_Sprite_Texture)
 
  If StartDrawing(SpriteOutput(Test))
    Box(0,0,256,256,RGB(128,0,128))
    StopDrawing()
  EndIf
  Test_3D= CreateSprite3D(#PB_Any,Test)
 
EndProcedure
Procedure Test_Update()
  ;DisplayTransparentSprite(Test, 0, 0)
  Start3D()
    DisplaySprite3D(Test_3D,100,100,192)
  Stop3D()
EndProcedure
Dri
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Pour moi aussi, ça fonctionne bien

A+
Guimauve
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Sans le truc du Dr DRI un cube bleu tourne derièrre une surface carrée mauve
Avec le truc du Dr DRI un cube bleu tourne derièrre une surface carrée mauve qui devient transparente au dessus du cube bleu
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Faut le faire, je suis le seul à rien voir !
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Progi1984 a écrit :Faut le faire, je suis le seul à rien voir !
Non pareil, sur le PC du taff : Win 2003 Serveur
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre