Page 1 sur 1

[?] Scrolling ou simple décalage de materiel

Publié : mer. 03/juil./2013 16:12
par falsam
Cette extrait de code permet de faire un scrolling horizontale de texture quand on uilise le flag #PB_Material_Animated

Code : Tout sélectionner

 ... 
ScrollMaterial(Material, 1, 0, #PB_Material_Animated, 0) 
...
Je pensais que si on utilisait le flag #PB_Material_Fixed, alors la texture serait juste décalait à droite par exemple. Mais ce n'est pas le cas.

Un peu de code pour illustrer le scrolling horizontale. Barre d'espace pour déclencher le scrolling.

Code : Tout sélectionner

; 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,"")
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)

; Un MESH (La forme)
Mesh = CreateCube(#PB_Any, 2)

; Une TEXTURE
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,128,256,RGB(255, 68, 0))
Box(128,0,128,256,RGB(0, 255, 0))
StopDrawing()

; Un MATERIEL sur lequel on applique la 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)
CameraBackColor(Camera, RGB(128, 128, 128))
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)
      ScrollMaterial(Material, 1, 0, #PB_Material_Animated, 0) 
  EndIf
    
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
    
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend
Maintenant remplacer

Code : Tout sélectionner

ScrollMaterial(Material, 1, 0, #PB_Material_Animated, 0) 
par

Code : Tout sélectionner

ScrollMaterial(Material, 10, 0, #PB_Material_Fixed, 0) 
L'appui sur la barre d'espace ne provoque pas le décalage à droite de la texture.

Re: [?] Scrolling ou simple décalage de materiel

Publié : mer. 03/juil./2013 17:34
par falsam
Merci pour ton aide Spock. je viens d'essayer mais il est vrai que c'est guère pratique. En tout cas ça dépanne. Mais j'aimerais bien comprendre à quoi sert le flag #PB_Material_Fixed :)

ça m'aiderait bien pour le calage de textures dans des meshs un peu complexe.

Re: [?] Scrolling ou simple décalage de materiel

Publié : mer. 03/juil./2013 18:27
par comtois
Apparemment c'est la fonction Ogre qui merdouille ? Faudrait essayer si ça fait pareil dans un script (scroll x y)

Sinon une solution c'est encore une fois d'utiliser GetMeshData() et SetMeshData()

Code : Tout sélectionner

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

Dim MeshData.PB_MeshVertex(0)

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

window = OpenWindow(#PB_Any,0,0,1024,768,"")
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)

; Un MESH (La forme)
Mesh = CreateCube(#PB_Any, 2)
GetMeshData(Mesh, 0, MeshData(), #PB_Mesh_UVCoordinate, 0, MeshVertexCount(Mesh)-1)

; Une TEXTURE
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,128,256,RGB(255, 68, 0))
Box(128,0,128,256,RGB(0, 255, 0))
StopDrawing()

; Un MATERIEL sur lequel on applique la 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)
CameraBackColor(Camera, RGB(128, 128, 128))
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)
    For i=0 To ArraySize(MeshData())
      MeshData(i)\u + 10/TextureWidth(Texture)   
    Next  
    SetMeshData(Mesh, 0, MeshData(), #PB_Mesh_UVCoordinate, 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: [?] Scrolling ou simple décalage de materiel

Publié : mer. 03/juil./2013 18:29
par falsam
Merci Comtois c'est génial :)