Aide sur la 3D
Aide sur la 3D
Bonjour à tous,
Je ne peux vous montrer des exemples en PB mais je vais vous donner quelques éléments pour comprendre.
Premier cas :
Je souhaite utiliser un Entity avec MoveEntity(x,y,z,#PB_Local).
Pour bouger l'entité plusieurs fois de suite avec MoveEntity(x,y,z,#PB_Absolute) ou MoveEntity(x,y,z,#PB_Relative) cela marche parfaitement bien mais avec le #PB_Local cela ne marche qu'une seule fois.
Donc pour ce cas je suis obligé de détruire l'entité et de le recréer pour bouger sa place, ce qui n'est pas naturel pour moi.
Deuxième cas :
Je souhaite faire une rotation de la matière avec RotateMatériel(#matiere,xxx_Fixed).
Cela marche parfaitement bien mais une seule fois également.
Comme je souhaite annuler la rotation (par exemple pour une nouvelle partie je dois remettre la matière de l'entité à son point de départ).
J'ai eu l'idée de détruire la matière (freeMatiere(#matiere)) et de recréer la matière par exemple avec ReloadMatiere(xxx) mais cela ne fonctionne pas non plus.
Alors je me dis comment faire pour que ces deux cas fonctionne bien.
Quelqu'un aurait-il une idée à me soumettre ?
Je ne peux vous montrer des exemples en PB mais je vais vous donner quelques éléments pour comprendre.
Premier cas :
Je souhaite utiliser un Entity avec MoveEntity(x,y,z,#PB_Local).
Pour bouger l'entité plusieurs fois de suite avec MoveEntity(x,y,z,#PB_Absolute) ou MoveEntity(x,y,z,#PB_Relative) cela marche parfaitement bien mais avec le #PB_Local cela ne marche qu'une seule fois.
Donc pour ce cas je suis obligé de détruire l'entité et de le recréer pour bouger sa place, ce qui n'est pas naturel pour moi.
Deuxième cas :
Je souhaite faire une rotation de la matière avec RotateMatériel(#matiere,xxx_Fixed).
Cela marche parfaitement bien mais une seule fois également.
Comme je souhaite annuler la rotation (par exemple pour une nouvelle partie je dois remettre la matière de l'entité à son point de départ).
J'ai eu l'idée de détruire la matière (freeMatiere(#matiere)) et de recréer la matière par exemple avec ReloadMatiere(xxx) mais cela ne fonctionne pas non plus.
Alors je me dis comment faire pour que ces deux cas fonctionne bien.
Quelqu'un aurait-il une idée à me soumettre ?
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Aide sur la 3D
Bonjour Pat.
■ N'ayant pas bien compris le premier cas, je vais m'abstenir de répondre.
(Une heure après) Finalement je vais quand même répondre
Concernant le déplacement d'une entité, utilise l'option #PB_Relative qui te permet de dire que tu fais un déplacement avec un pas de 0.05 Unités par exemple par rapport à la position précédente de ton entité.
Exemple avec le code suivant
■ Quand à ton deuxième cas j'ai pensais bêtement qu'un RotateMaterial(Material, 0.1, #PB_Material_Animated) pour démarrer la rotation du materiel et un RotateMaterial(Material, 0, #PB_Material_Animated) (Angle à 0) pour stopper cette rotation allez de soi ......... et bien non c'était trop facile.
La solution que je te propose ne me plait pas mais elle fonctionne.
Le principe est de supprimer la couche materiel puis de la remettre pour stopper la rotation.
Pour démarrer à nouveau cette rotation, même principe que pour la stopper et on ajoute un angle de rotation.
Un code de démonstration.
Touche R pour démarrer la rotation et Espace pour l'arréter.
j'ai finalement posté ce code sur le forum anglais pour voir si on peut faire mieux.
■ N'ayant pas bien compris le premier cas, je vais m'abstenir de répondre.
(Une heure après) Finalement je vais quand même répondre

Si je lis l'aide, #PB_Local ne peut être combiner qu'avec les options #PB_Relative ou #PB_Absolute.pat a écrit :Je souhaite utiliser un Entity avec MoveEntity(x,y,z,#PB_Local).
Concernant le déplacement d'une entité, utilise l'option #PB_Relative qui te permet de dire que tu fais un déplacement avec un pas de 0.05 Unités par exemple par rapport à la position précédente de ton entité.
Exemple avec le code suivant
Code : Tout sélectionner
EnableExplicit
Enumeration
#Mainform
EndEnumeration
Define.l Event
Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Camera, Texture.i, Material.i, Mesh.i, Entity.i, N.f, StepX.f
InitEngine3D()
InitKeyboard()
InitSprite()
InitMouse()
OpenWindow(#Mainform,0,0,1024,768, "Start/Stop Rotate material", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)
KeyboardMode(#PB_Keyboard_International)
;
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)
;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))
MoveCamera(Camera, 0, 0 , 10, #PB_Absolute)
;
;Un cube (Texture + Material + Mesh + Entité)
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256, RGB(255, 215, 0))
Box(64, 64, 128, 128 ,RGB(0, 0, 0))
StopDrawing()
Material = CreateMaterial(#PB_Any, TextureID(Texture))
Mesh = CreateCube(#PB_Any, 3)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), 0, 0, 0)
StepX=0.05
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
If ExamineKeyboard()
If KeyboardPushed (#PB_Key_Escape)
Break
EndIf
EndIf
N + StepX
If Int(N)=3
StepX=-0.05
ElseIf Int(N)=-3
StepX=0.05
EndIf
MoveEntity(Entity, StepX, 0, 0, #PB_Relative)
; Affiche le rendu de la scène
ClearScreen(RGB(0, 0, 0))
RenderWorld(80)
FlipBuffers()
ForEver
La solution que je te propose ne me plait pas mais elle fonctionne.
Le principe est de supprimer la couche materiel puis de la remettre pour stopper la rotation.
Pour démarrer à nouveau cette rotation, même principe que pour la stopper et on ajoute un angle de rotation.
Un code de démonstration.
Touche R pour démarrer la rotation et Espace pour l'arréter.
Code : Tout sélectionner
Enumeration
#Mainform
EndEnumeration
Define.l Event
Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Texture.i, Material.i, Mesh.i, Entity.i
InitEngine3D()
InitKeyboard()
InitSprite()
InitMouse()
OpenWindow(#Mainform,0,0,1024,768, "Start/Stop Rotate material", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)
KeyboardMode(#PB_Keyboard_International)
;
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)
;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))
MoveCamera(Camera, 2, 5, 15, #PB_Absolute)
CameraLookAt(Camera, 0,0,0)
;
;Un cube (Texture + Material + Mesh + Entité)
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256, RGB(255, 215, 0))
Box(64, 64, 128, 128 ,RGB(0, 0, 0))
StopDrawing()
Material = CreateMaterial(#PB_Any, TextureID(Texture))
Mesh = CreateCube(#PB_Any, 3)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
If ExamineKeyboard()
If KeyboardPushed (#PB_Key_Escape)
Break
EndIf
;Stop la rotation
If KeyboardReleased (#PB_Key_Space)
RemoveMaterialLayer(Material)
AddMaterialLayer(Material, TextureID(Texture), 0)
;RotateMaterial(Material, 0, #PB_Material_Animated)
EndIf
;Redémarre la rotation
If KeyboardReleased (#PB_Key_R)
RemoveMaterialLayer(Material)
AddMaterialLayer(Material, TextureID(Texture), 0)
RotateMaterial(Material, 0.1, #PB_Material_Animated)
EndIf
EndIf
; Affiche le rendu de la scène
ClearScreen(RGB(0, 0, 0))
RenderWorld(80)
FlipBuffers()
ForEver
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Aide sur la 3D
Merci falsam pour tes aides précieuses.
Je peux dire que tes aides sont très appréciées.
Pour le premier cas, je n'ai pas vu, dans ton exemple, le MoveEntity avec le #PB_Local. Ton entité n'a que le #PB_Relative.
Il faut dire que dans mon programme, le MoveEntity avec le #PB_Local fonctionne bien une fois mais comme je veux modifier sa position (dans une boucle), l'entité ne bouge qu'une seule fois.
Pour le deuxième cas, je n'avais pas pensé à ça, et je vais retourner chez moi essayer ton programme.
Cela semble très astuscieux et je pense que cela devrait bien fonctionner.
Pour le premier cas, si le #PB_Local fonctionne en relation avec le #PB_Relative et #PB_Absolute, comment faire pour que dans une boucle cela fonctionne :
For f=1 to 10
MoveEntity(x+f,y+f,z+f,#PB_Local)
Renderworld()
Flipbuffer()
Next f
J'attends que l'entité bouge dix fois mais il ne bouge qu'une fois.
Comment faire pour qu'il bouge 10 fois.
En tout cas, encore merci.
Je peux dire que tes aides sont très appréciées.
Pour le premier cas, je n'ai pas vu, dans ton exemple, le MoveEntity avec le #PB_Local. Ton entité n'a que le #PB_Relative.
Il faut dire que dans mon programme, le MoveEntity avec le #PB_Local fonctionne bien une fois mais comme je veux modifier sa position (dans une boucle), l'entité ne bouge qu'une seule fois.
Pour le deuxième cas, je n'avais pas pensé à ça, et je vais retourner chez moi essayer ton programme.
Cela semble très astuscieux et je pense que cela devrait bien fonctionner.
Pour le premier cas, si le #PB_Local fonctionne en relation avec le #PB_Relative et #PB_Absolute, comment faire pour que dans une boucle cela fonctionne :
For f=1 to 10
MoveEntity(x+f,y+f,z+f,#PB_Local)
Renderworld()
Flipbuffer()
Next f
J'attends que l'entité bouge dix fois mais il ne bouge qu'une fois.
Comment faire pour qu'il bouge 10 fois.
En tout cas, encore merci.
Re: Aide sur la 3D
J'ai été trop vite dans la lecture, tu souhaites qu'à la place de #PB_Local je mette #PB_Relative.
Je vais essayer ça dès que je rentrerai chez moi.
Je vais essayer donc ça mais même un fois #PB_Local et ensuite plusieurs #PB_Relative.
J'espère que cela fonctionnera.
Je t'en dirais plus la semaine prochaine (probablement mardi).
Tu deviens de plus en plus indispensable pour les débutants sur la 3D comme moi.
Je vais essayer ça dès que je rentrerai chez moi.
Je vais essayer donc ça mais même un fois #PB_Local et ensuite plusieurs #PB_Relative.
J'espère que cela fonctionnera.
Je t'en dirais plus la semaine prochaine (probablement mardi).
Tu deviens de plus en plus indispensable pour les débutants sur la 3D comme moi.
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Aide sur la 3D
Je reviens sur la rotation d'une texture. Comme je l'ai dit précédemment
Le code de stop / start rotation de matériel. Touche Espace pour arreter - R pour démarrer à nouveau la rotation.J'ai commenté WorldShadows(#PB_Shadow_Additive). Si on dé-commente cette ligne, la rotation ne fonctionne plus.
Par contre le type d'ombre #PB_Shadow_TextureAdditive et #PB_Shadow_Modulative ne pose pas de probléme.
En effet mon code ne fonctionnait pas. Sur le forum Anglais, on m'a proposé un code basé sur ce principe et qui lui fonctionnait !! J'ai comparé cette version avec la mienne et j'ai constaté que si j'utilisais WorldShadows(#PB_Shadow_Additive) la rotation ne fonctionnait plus.falsam a écrit :j'ai pensais bêtement qu'un RotateMaterial(Material, 0.1, #PB_Material_Animated) pour démarrer la rotation du materiel et un RotateMaterial(Material, 0, #PB_Material_Animated) (Angle à 0) pour stopper cette rotation allez de soi ......... et bien non c'était trop facile.
Le code de stop / start rotation de matériel. Touche Espace pour arreter - R pour démarrer à nouveau la rotation.
Code : Tout sélectionner
Enumeration
#Mainform
EndEnumeration
Define.l Event
Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Texture.i, Material.i, Mesh.i, Entity.i, Rotate.b, Angle.f
InitEngine3D()
InitKeyboard()
InitSprite()
;InitMouse()
OpenWindow(#Mainform,0,0,1024,768, "Start/Stop Rotate material", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)
KeyboardMode(#PB_Keyboard_International)
;
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
;WorldShadows(#PB_Shadow_Additive)
;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))
MoveCamera(Camera, 2, 5, 15, #PB_Absolute)
CameraLookAt(Camera, 0,0,0)
;
;Un cube (Texture + Material + Mesh + Entité)
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256, RGB(255, 215, 0))
Box(64, 64, 128, 128 ,RGB(0, 0, 0))
StopDrawing()
Material = CreateMaterial(#PB_Any, TextureID(Texture))
Mesh = CreateCube(#PB_Any, 3)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
Rotate = #True
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
If ExamineKeyboard()
If KeyboardPushed (#PB_Key_Escape)
Break
EndIf
;Stop la rotation
If KeyboardReleased(#PB_Key_Space)
Rotate = 0
ElseIf KeyboardReleased(#PB_Key_R)
Rotate = 1
EndIf
EndIf
If Rotate = 1
Angle + 1
EndIf
RotateMaterial(Material, Angle, #PB_Material_Fixed)
; Affiche le rendu de la scène
RenderWorld(80)
FlipBuffers()
ForEver
Par contre le type d'ombre #PB_Shadow_TextureAdditive et #PB_Shadow_Modulative ne pose pas de probléme.
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Aide sur la 3D
Bonjour falsam,
J'ai pu répondre plus vite que prévu mais j'ai perdu par inattention ce qui me permettait de voir ton programme.
Je prendrais le tout tout à l'heure.
J'ai pu constater sur mon micro plusieurs choses :
Pour le premier cas :
Mettre le tout en #PB_Relative fait monter (ou descendre) l'entité alors que je veux que l'entité suive l'orientation du sol (que j'ai incliné à 40 degré) (c'est pour cela que j'avais mis un #PB_Local.
J'ai donc fait un MoveEntity avec un #PB_Local et avec plusieurs #PB_Relative et cela marche bien mais l'ombre des entités est décalé nettement et les entités sont plus gros.
En fait, je fais bouger l'entité par l'axe des y seulement avec le #PB_Local et cela suit le sol (comme je le veux).
Deuxième cas :
Je constate que tu abandonnes le RotateEntity avec le #PB_Animate et tu mets, comme moi au début, le #PB_Fixed.
Cela fonctionne très bien mais ce que je veux c'est RETABLIR l'orientation de la matière à son origine et je n'arrive pas à le faire parce que même en détruisant la matière et en la remettant, l'orientation ne veut pas bouger.
Essaies, après avoir fait une rotation de la matière, de remettre la matière à son orientation du début.
Y arriveras-tu ?
En tout cas, je progresse grâce à tes aides et je sais que tu es plus perfectionné que moi sur la 3D.
J'ai pu répondre plus vite que prévu mais j'ai perdu par inattention ce qui me permettait de voir ton programme.
Je prendrais le tout tout à l'heure.
J'ai pu constater sur mon micro plusieurs choses :
Pour le premier cas :
Mettre le tout en #PB_Relative fait monter (ou descendre) l'entité alors que je veux que l'entité suive l'orientation du sol (que j'ai incliné à 40 degré) (c'est pour cela que j'avais mis un #PB_Local.
J'ai donc fait un MoveEntity avec un #PB_Local et avec plusieurs #PB_Relative et cela marche bien mais l'ombre des entités est décalé nettement et les entités sont plus gros.
En fait, je fais bouger l'entité par l'axe des y seulement avec le #PB_Local et cela suit le sol (comme je le veux).
Deuxième cas :
Je constate que tu abandonnes le RotateEntity avec le #PB_Animate et tu mets, comme moi au début, le #PB_Fixed.
Cela fonctionne très bien mais ce que je veux c'est RETABLIR l'orientation de la matière à son origine et je n'arrive pas à le faire parce que même en détruisant la matière et en la remettant, l'orientation ne veut pas bouger.
Essaies, après avoir fait une rotation de la matière, de remettre la matière à son orientation du début.
Y arriveras-tu ?
En tout cas, je progresse grâce à tes aides et je sais que tu es plus perfectionné que moi sur la 3D.
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Aide sur la 3D
Bonjour Pat.
#PB_Material_Fixed associé à un angle de rotation, permet d'incliner la matière de manière absolue, sans tenir compte de l'inclinaison précédente.
Pour que ta matière puisse revenir à sa position initiale, il faut bien entendu arrêter la rotation mais aussi donner un angle à 0°.
le code précédent arrêtait bien la rotation de la matière quand on appuyait sur la barre d'espace mais ne rétablissait pas l'angle à 0°. j'ai modifier le code en insérant Angle = 0.
#PB_Material_Fixed associé à un angle de rotation, permet d'incliner la matière de manière absolue, sans tenir compte de l'inclinaison précédente.
Pour que ta matière puisse revenir à sa position initiale, il faut bien entendu arrêter la rotation mais aussi donner un angle à 0°.
le code précédent arrêtait bien la rotation de la matière quand on appuyait sur la barre d'espace mais ne rétablissait pas l'angle à 0°. j'ai modifier le code en insérant Angle = 0.
Code : Tout sélectionner
Enumeration
#Mainform
EndEnumeration
Define.l Event
Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Texture.i, Material.i, Mesh.i, Entity.i, Rotate.b, Angle.f
InitEngine3D()
InitKeyboard()
InitSprite()
;InitMouse()
OpenWindow(#Mainform,0,0,1024,768, "Start/Stop Rotate material", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)
KeyboardMode(#PB_Keyboard_International)
;
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
;WorldShadows(#PB_Shadow_Additive)
;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))
MoveCamera(Camera, 2, 5, 15, #PB_Absolute)
CameraLookAt(Camera, 0,0,0)
;
;Un cube (Texture + Material + Mesh + Entité)
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256, RGB(255, 215, 0))
Box(64, 64, 128, 128 ,RGB(0, 0, 0))
StopDrawing()
Material = CreateMaterial(#PB_Any, TextureID(Texture))
Mesh = CreateCube(#PB_Any, 3)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
Rotate = #True
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
If ExamineKeyboard()
If KeyboardPushed (#PB_Key_Escape)
Break
EndIf
;Stop la rotation
If KeyboardReleased(#PB_Key_Space)
Rotate = 0
Angle = 0
ElseIf KeyboardReleased(#PB_Key_R)
Rotate = 1
EndIf
EndIf
If Rotate = 1
Angle + 1
EndIf
RotateMaterial(Material, Angle, #PB_Material_Fixed)
; Affiche le rendu de la scène
RenderWorld(80)
FlipBuffers()
ForEver
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Aide sur la 3D
Merci falsam.
Effectivement il ne fallait pas oublier de rétablir l'angle à 0.
Ton aide va m'être très précieuse.
Mille merci pour tes interventions respectives et tes exemples, toujours aussi instructives.
Effectivement il ne fallait pas oublier de rétablir l'angle à 0.
Ton aide va m'être très précieuse.
Mille merci pour tes interventions respectives et tes exemples, toujours aussi instructives.
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Aide sur la 3D
Je ne connais pas le but de ton code, mais j'ai réfléchi un peu sur le trajet de ton entité sur un plan incliné à 45 degrés. Tu devrais peut être utiliser l'objet spline.
■ J'ai essayé de donner une explication sur ce lien.
■ Avec le code ci-dessous, je te propose de faire circuler un cube sur un chemin qui emprunte une passerelle comportant deux plans inclinés à 45 degrés. Ce code n'est pas parfait mais montre les possibilité de l'objet spline. Les points de passage sont matérialisés par des sphères blanches que tu peux supprimer en commentant les lignes CreateMarker()

■ J'ai essayé de donner une explication sur ce lien.
■ Avec le code ci-dessous, je te propose de faire circuler un cube sur un chemin qui emprunte une passerelle comportant deux plans inclinés à 45 degrés. Ce code n'est pas parfait mais montre les possibilité de l'objet spline. Les points de passage sont matérialisés par des sphères blanches que tu peux supprimer en commentant les lignes CreateMarker()
Code : Tout sélectionner
EnableExplicit
Enumeration
#Mainform
EndEnumeration
Define.l Event
Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Camera, Texture.i, Material.i, Mesh.i, Entity.i, N.f, StepX.f
Global SPLine, Time.f, x.f, y.f, z.f, StepValue.f, TimeSinceLastFrame.f
Procedure CreateMarker (x.f, y.f, z.f)
CreateEntity(#PB_Any, MeshID(CreateSphere(#PB_Any, 0.1)), #PB_Material_None, x, y, z)
EndProcedure
InitEngine3D()
InitKeyboard()
InitSprite()
InitMouse()
OpenWindow(#Mainform,0,0,1024,768, "Suivre un chemin", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)
KeyboardMode(#PB_Keyboard_International)
;
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Modulative, 0, RGB(175, 175, 175))
;
;Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))
MoveCamera(Camera, 0, 8 , 15, #PB_Absolute)
CameraLookAt(Camera, 0, 0, 0)
;
;Texture & Material
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(0, 0, 0))
Box(1,1,252,252,RGB(255, 216, 0))
StopDrawing()
Material = CreateMaterial(#PB_Any, TextureID(Texture))
MaterialFilteringMode(Material, #PB_Material_Anisotropic, 6) ;Meilleurs rendu du materiel
;
;Creation du sol
Mesh = CreatePlane(#PB_Any, 50, 50, 1, 1, 6, 6)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
EntityPhysicBody(Entity, #PB_Entity_StaticBody)
;
;Mise en place d'un obstacle à franchir ayant ce profil /¯¯\
;Premier profil /
Entity = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 3)), MaterialID(Material), -2.5,1,0)
ScaleEntity(Entity, 1, 0.05, 1, #PB_Absolute)
RotateEntity(Entity, 0, 0, 45)
;Deuxiéme profil ¯¯
Entity = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 3)), MaterialID(Material), 0,2,0)
ScaleEntity(Entity, 1, 0.05, 1, #PB_Absolute)
;Troisiéme profil \
Entity = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 3)), MaterialID(Material), 2.5,1,0)
ScaleEntity(Entity, 1, 0.05, 1, #PB_Absolute)
RotateEntity(Entity, 0, 0, -45)
;
;Création du cube qui va suivre un chemin passant par cet obstacle
Entity = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 1)), MaterialID(Material))
;
;Création de l'objet chemin
spline = CreateSpline(#PB_Any)
; On indique des points de passages du chemin
; Les différentes coordonnées auraient pu être placées dans une liste ou un tableau
CreateMarker(-8, 0.6, -15) ;Balise coin haut gauche
AddSplinePoint(spline, -8, 0.6, -15)
CreateMarker(-8, 0.6, 0) ;Balise coin bas gauche
AddSplinePoint(spline, -8, 0.6, 0)
CreateMarker(-4, 0.7, 0) ;Balise entrée du premier plan à 45° ./
AddSplinePoint(spline, -4, 0.7, 0)
CreateMarker(-1.5, 2.7, 0) ;Balise bord gauche du plan horizontal °¯¯
AddSplinePoint(spline, -1.5, 2.7, 0)
CreateMarker(1.5, 2.7, 0) ;Balise bord droit du plan horizontal ¯¯°
AddSplinePoint(spline, 1.5, 2.7, 0)
CreateMarker(4, 0.7, 0) ;Balise sortie du deuxiéme plan à 45° \.
AddSplinePoint(spline,4, 0.7, 0)
CreateMarker(8, 0.7, 0) ;Balise coin bas droit
AddSplinePoint(spline, 8, 0.7, 0)
CreateMarker(8, 0.6, -15) ;Balise coin haut droit
AddSplinePoint(spline, 8, 0.6, -15)
;L'entité passera par ces points et reviendra au premier point
AddSplinePoint(spline, -8, 0.6, -15) ;Premier point
;Sa vitesse est déterminée par la valeur du pas (Valeur décimale)
StepValue = 3.00
;Nous voila dans la boucle evenementielle
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
ExamineKeyboard()
If KeyboardPushed (#PB_Key_Escape)
Break
EndIf
;Calcule la position du point de déplacement (offset) spécifié.
ComputeSpline(spline, time)
;Une fois que le point a été calculé, sa position est disponible
x = SplineX(spline)
y = SplineY(spline)
z = SplineZ(spline)
;L'entité regarde en direction de ces trois points
EntityLookAt(Entity, x, y, z)
;Et on le positionne sur ces coordonnées
MoveEntity(Entity, x, y, z, #PB_Absolute)
;Ou en est ton dans notre déplacement ?
time + StepValue * TimeSinceLastFrame / 35
;La valeur de décalage varie de 0.0 à 1.0
If time > 1 ;fin de la spline
Time = 0 ;début de la spline
EndIf
;Quel est le temps écoulé depuis la dernière image en millisecondes.
TimeSinceLastFrame = RenderWorld() / 1000
; Affiche le rendu de la scène
ClearScreen(RGB(0, 0, 0))
RenderWorld(80)
FlipBuffers()
ForEver
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Aide sur la 3D
Merci falsam.
Je vais voir ça de plus près dès que je pourrais télécharger ton exemple.
Je vais voir ça de plus près dès que je pourrais télécharger ton exemple.
Re: Aide sur la 3D
falsam a écrit :Si je lis l'aide, #PB_Local ne peut être combiner qu'avec les options #PB_Relative ou #PB_Absolute.pat a écrit :Je souhaite utiliser un Entity avec MoveEntity(x,y,z,#PB_Local).
donc ... t'as essayé :
Code : Tout sélectionner
MoveEntity(x,y,z,#PB_Local|#PB_Relative)
Re: Aide sur la 3D
Je tiens tout d'abord à remercier falsam qui fait un travail remarquable pour ceux qui veulent s'initier à la 3D.
Je ne peux que le féliciter pour tout son dur travail.
Pour répondre à Dobro mais également à falsam qui me demandait qu'est-ce que je souhaitais faire :
Je suis, en ce moment, en train de faire un programme de jeu de domino.
Le sol est fixé à 40 degré et mon but est de faire attérrir les dominos, qui commenceront par le haut et atterriront sur le sol.
La physique n'est pas possible puisque mes dominos tomberont immédiatement.
J'utilise obligatoirement, dans une entité, le #PB_Local, pour que l'entité suive le sol, sinon, avec un #PB_Relative, ou même, un #PB_Absolute, comme j'utiliserai l'axe des y, mon entiré ira de haut en bas.
Donc j'ai trouvé la solution et je me suis aperçu que #PB_Local se comportait un peu comme un
#PB_Relative mais la différence c'est que mon entité suit le sol, comme je le veux.
Donc, après quelques réflexions :
Pour fixer au début mon entité : Entity(x,10,z,#PB_Local) (une hauteur de 10 c'est pas mal)
après pour le faire attérir sur le sol :
une boucle :Et ça marche parfaitement bien dans mon programme.
Je ne peux que le féliciter pour tout son dur travail.
Pour répondre à Dobro mais également à falsam qui me demandait qu'est-ce que je souhaitais faire :
Je suis, en ce moment, en train de faire un programme de jeu de domino.
Le sol est fixé à 40 degré et mon but est de faire attérrir les dominos, qui commenceront par le haut et atterriront sur le sol.
La physique n'est pas possible puisque mes dominos tomberont immédiatement.
J'utilise obligatoirement, dans une entité, le #PB_Local, pour que l'entité suive le sol, sinon, avec un #PB_Relative, ou même, un #PB_Absolute, comme j'utiliserai l'axe des y, mon entiré ira de haut en bas.
Donc j'ai trouvé la solution et je me suis aperçu que #PB_Local se comportait un peu comme un
#PB_Relative mais la différence c'est que mon entité suit le sol, comme je le veux.
Donc, après quelques réflexions :
Pour fixer au début mon entité : Entity(x,10,z,#PB_Local) (une hauteur de 10 c'est pas mal)
après pour le faire attérir sur le sol :
une boucle :
Code : Tout sélectionner
For f.a=1 to 10
Entity(0,y-f,0,#PB_Local)
RenderWorld()
Flipbuffer()
Delay(70);un temps obligatoire sinon on ne verrai pas l'animation
Next F
Re: Aide sur la 3D
J'ai saisi un peu vite le code de l'entité :
Entity(#entity,x,y,z,#PB_Local) bien sûr ne pas omettre le numéro de l'entité.
et Entity(#entity,0,y-f,0,#PB_Local).
Entity(#entity,x,y,z,#PB_Local) bien sûr ne pas omettre le numéro de l'entité.
et Entity(#entity,0,y-f,0,#PB_Local).
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Aide sur la 3D
Bonjour Pat. Le code complet est secret ? ou as tu un exécutable à fournir pour voir le rendu ?
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Aide sur la 3D
A falsam :
Il me reste l'Intelligence Artificielle à faire et quelques ajustements pour terminer mon programme de domino 3D.
J'aimerais bien te donner quelques bouts de code mais je ne possède pas Internet et c'est difficile pour moi de faire quelque chose. J'ai du mal également à prendre tes codes, étant donné que je dois aller dans un lieu accessible à Internet avec téléchargement. Je ne peux le faire que quelques jours par mois seulement.
Je vais voir demain si je peux faire quelque chose.
Le programme ne joue que le premier coup disponible étant donné qu'il me reste l'IA à faire.
Cela devrait me prendre un bon mois pour le terminer.
Il me reste l'Intelligence Artificielle à faire et quelques ajustements pour terminer mon programme de domino 3D.
J'aimerais bien te donner quelques bouts de code mais je ne possède pas Internet et c'est difficile pour moi de faire quelque chose. J'ai du mal également à prendre tes codes, étant donné que je dois aller dans un lieu accessible à Internet avec téléchargement. Je ne peux le faire que quelques jours par mois seulement.
Je vais voir demain si je peux faire quelque chose.
Le programme ne joue que le premier coup disponible étant donné qu'il me reste l'IA à faire.
Cela devrait me prendre un bon mois pour le terminer.