Page 1 sur 1

TransformMesh() Comment ça fonctionne ?

Publié : lun. 01/juil./2013 21:27
par falsam
J'ai voulu utiliser l'instruction TransformMesh() pour modifier la taille d'un Mesh à un point d'un programme puis modifier à nouveau ce même mesh à un autre point de mon code.

Hors je n'ai pas le résultat escompté. Pour en être sur j'ai fait un petit code qui ne fait que donner la meme taille au mesh pressant la touche Espace et chose surprenante ..... la taille augmente !!

Aurais-je mal compris la fonctionnalité de TransformMesh() ?

Code : Tout sélectionner

;Naissance d'un cube 

; Coordonnées x,y,z de la caméra
Define.f CamX, CamY, CamZ

InitEngine3D()
Parse3DScripts()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Histoire d'un cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Les axes 
Red = RGB(255, 0, 0) ;Couleur de l'axe x
Green = RGB(0, 255, 0) ;Couleur de l'axe y
Blue = RGB(0, 255, 255) ;Coleur de l'axe z

AxeX = CreateLine3D(#PB_Any, -10,0,0, Red, 10, 0, 0, Red) 
AxeY = CreateLine3D(#PB_Any, 0,-10,0, Green, 0, 10, 0, Green) 
AxeZ = CreateLine3D(#PB_Any, 0,0,-10, Blue, 0, 0, 10, Blue) 

;
; Naissance d'un cube 

; Une forme : C'est notre MESH qui ici sera un cube
Mesh = CreateCube(#PB_Any, 1) 

; Une texture (Cette texture peut être loader avec l'instruction LoadTexture()
Texture = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture))
Box(0,0,512,512,RGB(0, 0, 0))
Box(1,1,510,510,RGB(255, 216, 0))
StopDrawing()

; Un MATERIEL c'est la partie visible de notre cube qui sera constitué de notre texture
Material = CreateMaterial(#PB_Any,TextureID(texture))

; Création de notre entité : ENTITE = MESH + MATERIEL
; Par défaut il se positionne au point de coordonnée 0,0,0
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))

;
; Une camera 
Camera = CreateCamera(#PB_Any,0,0,100,100)
CamX=2.0
CamY=1.0
CamZ=15

; La caméra regarde en dirextion d'un point au coordonnées x=0, y=0, z=0
CameraLookAt(camera,0,0,0)


While #True
  
  Event = WindowEvent()
    
  ExamineKeyboard()  
  
  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf  
  
  If KeyboardPushed(#PB_Key_Left)
    CamX-0.2  
  ElseIf KeyboardPushed(#PB_Key_Right)
    CamX+0.2
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
    CamY+0.2  
  ElseIf KeyboardPushed(#PB_Key_Down)
    CamY-0.2
  EndIf
  
  If KeyboardPushed(#PB_Key_Space)
    TransformMesh(Mesh, 0,0,0, 1.01,1.01,1.01, 0,0,0)
  EndIf 
  
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend 
Le souci est le même avec les rotations.

Re: TransformMesh() Comment ça fonctionne ?

Publié : lun. 01/juil./2013 21:36
par G-Rom
Le scale , est un facteur , une fois transformé , la référence redeviens 1 , comme tu met 1,01 , ton mesh grossi.
il faudrait que tu sauvegarde la taille au début de ton programme , et que tu joue avec un produit en croix.

Re: TransformMesh() Comment ça fonctionne ?

Publié : lun. 01/juil./2013 21:38
par falsam
"Applies a scale factor on the X axis to the mesh" idem pour Y et Z. Effectivement. Merci G-Rom.

Re: TransformMesh() Comment ça fonctionne ?

Publié : lun. 01/juil./2013 21:45
par comtois
tu peux le faire avec les nouvelles fonctions GetMeshData() et SetMeshData(). Avec un second tableau pour garder le mesh d"origine, tu dois pouvoir faire ce que tu veux

Code : Tout sélectionner

;Naissance d'un cube

; Coordonnées x,y,z de la caméra
Define.f CamX, CamY, CamZ
Global  Dim MeshData.PB_MeshVertex(0)

InitEngine3D()
Parse3DScripts()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Histoire d'un cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Les axes
Red = RGB(255, 0, 0) ;Couleur de l'axe x
Green = RGB(0, 255, 0) ;Couleur de l'axe y
Blue = RGB(0, 255, 255) ;Coleur de l'axe z

AxeX = CreateLine3D(#PB_Any, -10,0,0, Red, 10, 0, 0, Red)
AxeY = CreateLine3D(#PB_Any, 0,-10,0, Green, 0, 10, 0, Green)
AxeZ = CreateLine3D(#PB_Any, 0,0,-10, Blue, 0, 0, 10, Blue)

;
; Naissance d'un cube

; Une forme : C'est notre MESH qui ici sera un cube
Mesh = CreateCube(#PB_Any, 1)
GetMeshData(Mesh, 0, MeshData(), #PB_Mesh_Vertex, 0, MeshVertexCount(Mesh)-1)

; Une texture (Cette texture peut être loader avec l'instruction LoadTexture()
Texture = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture))
Box(0,0,512,512,RGB(0, 0, 0))
Box(1,1,510,510,RGB(255, 216, 0))
StopDrawing()

; Un MATERIEL c'est la partie visible de notre cube qui sera constitué de notre texture
Material = CreateMaterial(#PB_Any,TextureID(texture))

; Création de notre entité : ENTITE = MESH + MATERIEL
; Par défaut il se positionne au point de coordonnée 0,0,0
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))

;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CamX=2.0
CamY=1.0
CamZ=15

; La caméra regarde en dirextion d'un point au coordonnées x=0, y=0, z=0
CameraLookAt(camera,0,0,0)


While #True
  
  Event = WindowEvent()
  
  ExamineKeyboard() 
  
  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf 
  
  If KeyboardPushed(#PB_Key_Left)
    CamX-0.2 
  ElseIf KeyboardPushed(#PB_Key_Right)
    CamX+0.2
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
    CamY+0.2 
  ElseIf KeyboardPushed(#PB_Key_Down)
    CamY-0.2
  EndIf
  
  If KeyboardPushed(#PB_Key_Space)
    ;TransformMesh(Mesh, 0,0,0, 1.01,1.01,1.01, 0,0,0)
    For i = 0 To ArraySize(MeshData())
      MeshData(i)\x * 1.01
      MeshData(i)\y * 1.01
      MeshData(i)\z * 1.01      
    Next  
    SetMeshData(Mesh, 0, MeshData(), #PB_Mesh_Vertex, 0, MeshVertexCount(Mesh)-1)
  EndIf
  
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend 

Re: TransformMesh() Comment ça fonctionne ?

Publié : lun. 01/juil./2013 21:54
par falsam
Merci pour ton aide Comtois :)

Re: TransformMesh() Comment ça fonctionne ?

Publié : lun. 01/juil./2013 22:35
par falsam
Dans l'exemple ci-dessus il est inutile de faire une copy de l'array MeshData. Mais c'est ce que je vais faire pour un autre code. Encore merci Comtois.

Touche + (Clavier Numérique) et - (Clavier numérique) pour augmenter ou diminuer la taille du cube.

Code : Tout sélectionner

;Naissance d'un cube

; Coordonnées x,y,z de la caméra
Define.f CamX, CamY, CamZ

Global Dim MeshData.PB_MeshVertex(0)

InitEngine3D()
Parse3DScripts()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Histoire d'un cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Les axes
Red = RGB(255, 0, 0) ;Couleur de l'axe x
Green = RGB(0, 255, 0) ;Couleur de l'axe y
Blue = RGB(0, 255, 255) ;Coleur de l'axe z

AxeX = CreateLine3D(#PB_Any, -10,0,0, Red, 10, 0, 0, Red)
AxeY = CreateLine3D(#PB_Any, 0,-10,0, Green, 0, 10, 0, Green)
AxeZ = CreateLine3D(#PB_Any, 0,0,-10, Blue, 0, 0, 10, Blue)

;
; Naissance d'un cube

; Une forme : C'est notre MESH qui ici sera un cube
Mesh = CreateCube(#PB_Any, 1)

GetMeshData(Mesh, 0, MeshData(), #PB_Mesh_Vertex, 0, MeshVertexCount(Mesh)-1)

; Une texture (Cette texture peut être loader avec l'instruction LoadTexture()
Texture = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture))
Box(0,0,512,512,RGB(0, 0, 0))
Box(1,1,510,510,RGB(255, 216, 0))
StopDrawing()

; Un MATERIEL c'est la partie visible de notre cube qui sera constitué de notre texture
Material = CreateMaterial(#PB_Any,TextureID(texture))

; Création de notre entité : ENTITE = MESH + MATERIEL
; Par défaut il se positionne au point de coordonnée 0,0,0
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))

;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CamX=2.0
CamY=1.0
CamZ=15

; La caméra regarde en dirextion d'un point au coordonnées x=0, y=0, z=0
CameraLookAt(camera,0,0,0)


While #True
  
  Event = WindowEvent()
  
  ExamineKeyboard() 
  
  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf 
  
  If KeyboardPushed(#PB_Key_Left)
    CamX-0.2 
  ElseIf KeyboardPushed(#PB_Key_Right)
    CamX+0.2
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
    CamY+0.2 
  ElseIf KeyboardPushed(#PB_Key_Down)
    CamY-0.2
  EndIf
  
  If KeyboardPushed(#PB_Key_Add)
    For i = 0 To ArraySize(MeshData())
      MeshData(i)\x * 1.01
      MeshData(i)\y * 1.01
      MeshData(i)\z * 1.01      
    Next  
    
    SetMeshData(Mesh, 0, MeshData(), #PB_Mesh_Vertex, 0, MeshVertexCount(Mesh)-1)

  EndIf
  
  If KeyboardPushed(#PB_Key_Subtract)
    For i = 0 To ArraySize(MeshData())
      MeshData(i)\x / 1.01
      MeshData(i)\y / 1.01
      MeshData(i)\z / 1.01      
    Next  
    
    SetMeshData(Mesh, 0, MeshData(), #PB_Mesh_Vertex, 0, MeshVertexCount(Mesh)-1)

  EndIf  
  
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend