TransformMesh() Comment ça fonctionne ?

Généralités sur la programmation 3D
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

TransformMesh() Comment ça fonctionne ?

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: TransformMesh() Comment ça fonctionne ?

Message 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.
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: TransformMesh() Comment ça fonctionne ?

Message par falsam »

"Applies a scale factor on the X axis to the mesh" idem pour Y et Z. Effectivement. Merci G-Rom.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: TransformMesh() Comment ça fonctionne ?

Message 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 
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
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: TransformMesh() Comment ça fonctionne ?

Message par falsam »

Merci pour ton aide Comtois :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: TransformMesh() Comment ça fonctionne ?

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre