Histoire d'un Cube (Notions de base à la 3D)

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

Histoire d'un Cube (Notions de base à la 3D)

Message par falsam »

Pure Basic 5.20 LTS - Mise à jour du 21 Juillet 2015
Image
Ce fil de discussion a pour objectif de vous apporter quelques notions de base dans le moteur 3D OGRE.

Qu'est ce que OGRE.
OGRE (Object-Oriented Graphics Rendering Engine) est un moteur 3D, écrit en C++ utilisé depuis d'autres langages : C#, Python, Java, ...... mais aussi avec Pure Basic (Of course).

■ Sites officiels :
http://www.ogre3d.org (En anglais)
https://www.patreon.com/ogre1

OGRE va vous permettre d'afficher des personnages, des bâtiments, des paysages, gérer des lumières et des ombres, utiliser une ou plusieurs caméras et grâce au système de particule de créer des effets de brouillards, flammes, fumées ..... en 3 Dimensions.

OpenMW est un projet Open Source utilisant OGRE 3D.
■ Vidéo de présentation : http://openmw.org/faq
■ Site : http://openmw.org/fr
■ Bin & Source : https://code.google.com/p/openmw/downloads/list

et aussi

Ogre3D Compositor Pure Basic Demo

■ Vidéo : https://www.youtube.com/watch?v=BQyXeSgle7c

Un peu d'odre.
■ Créer un dossier que vous nommerez par exemple 3D Histoire d'un cube dans lequel vous placerez les codes que je vous présente ci-dessous.

■ Dans ce dossier que vous venez de créer, vous allez créer un dossier que vous nommerez data. Ce dossier contiendra l'ensembles des médias (Textures, Mesh, Eau (Water), Ciel(Skybox), Terrain, etc ....), polices, scripts qui seront utilisés dans vos créations 3D.

■ Dans le dossier Data, vous allez créer :
-Un dossier Textures
-Un dossier Scripts
-Un dossier Models

-Vous allez aussi copier les dossiers fonts et GUI que vous trouverez dans les exemples 3D du dossier d'installation de Pure Basic.

La structures de votre dossier devrait maintenant ressembler à celle ci-dessous :
■→<Histoire d'un cube>
               ■→<Data>
                         ■→<Fonts>
                         ■→<GUI>
                         ■→<Models>
                         ■→<Particules>
                         ■→<Textures>
                         ■→<Scripts>

Minimum vital.

Le néant
       Le code minimal à compiler : Initialisation du moteur 3D, ouverture d'une scène, mise en place d'une caméra, Une boucle événementielle ou vous apprendrez à quitter votre code.

Les trois dimensions
       Coup d’œil au système de coordonnées de l'espace.

Naissance du cube
Un peu de lumière
Le clonage
Première chute
Saut de puce
Rotation d'une entité.

Suivre une entité avec la caméra
       Utilisation de CameraFollow() (Apparu avec la version 5.20).

Permis de conduire
       Piloter un cube, poser des obstacles et gérer la caméra suiveuse.

Ramasser des pièces
Ramasser des pièces et ajouter un score.

Un peu de relief (Ciel, Soleil, Brouillard, Eau, Terrain)

Les nodes

Afficher un texte au dessus d'une entité Utilisation de la bibliothèque Text3D.

Créer un point d'articulation (Joint ou encore point de pivot) entre les points centraux de deux entités.

■ Les particules
       Découverte du système des particules
       Il neige

Le GUI : GUI est l'acronyme de l'expression anglaise Graphical User Interface, signifiant Interface Graphique d'Utilisateur.

Créer un chemin. : Comment obliger une entité à suivre un chemin ? C'est ce que nous allons voir avec l'objet CreateSpline().

Je vous propose de voir aussi ce deuxième exemple de code un peu différent du précédent. Le cube va suivre un chemin comportant des points de passage obligés, matérialisés par des balises sphériques blanches. Il devra aussi passer une passerelle constituée de deux plans inclinés à 45°.

La position x,y et z du cube s'affichera en bas de l'écran ainsi que le nombre de tours effectué.

Afficher le FPS (Frames Per Second) : Depuis la version 5.30 de Pure Basic il est possible d'afficher le nombre d'images par seconde sur un écran grace à la fonction Engine3DStatus() associé au paramétre #PB_Engine3D_CurrentFPS

Les mains dans le cambouis..
Je n'ai pas trouvé autre chose comme titre. C'est le coin bricolage ou truc et astuces.
Installer une version autonome de DirectX 9c. (Windows)
Zoomer sur une scene 3D avec la molette de la souris (Windows)
Comment rendre un materiel (texture) partiellement ou totalement transparent.
Créer une SEULE entité avec un ensemble de meshs.
Le Culling : Comment voir l'intérieur d'un mesh.
Se voir dans un miroir.
Deltatime : Comment gérer correctement les déplacements d'une entité dans une application via le deltatime. (Par G-Rom)

Utilitaires..
Misfit Model 3D Version 1.3.8 : Malheureusement ce projet est abandonné mais suffisamment stable pour créer des meshs que vous exporterez en fichier obj. Utilisez ensuite DelEd pour exporter votre fichier obj en fichier mesh.
Download : http://sourceforge.net/projects/misfitm ... source=dlp
Site          : http://www.misfitcode.com/misfitmodel3d
Langage   : Français

DeleD Version 2.45 : Pas aussi pratique que Misfit, ce logiciel est par contre le complément idéal pour importer un fichier obj par exemple et l'exporter vers Ogre3D sous la forme d'un fichier mesh.
Download : http://www.delgine.com/index.php?filename=product_deled
Site          : http://www.delgine.com
Langage   : Anglais

Récupérer les plugins d'import export sur ce lien http://www.delgine.com/plugins/viewPluginCategories.php et aprés décompression, copier les fichiers dans le dossier Plugins du dossier d'installation de Deled.

Quelques exemples de codes..
■ De nombreux exemples se trouvent dans le dossier Example\3D se trouvant dans le dossier d'installation de Pure Basic.

Quelques meshs gratuits pour Ogre3D..
■ Un pack signalé par Comtois sur ce lien http://www.purebasic.fr/french/viewtopi ... 13&t=13743
Dernière modification par falsam le lun. 05/oct./2015 23:25, modifié 60 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 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 : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube : Le néant

Message par falsam »

Le néant. Touche Escape pour quitter le programme.

Code : Tout sélectionner

;Le néant
InitEngine3D()
InitKeyboard()
InitSprite()

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

;
; Une camera 
Camera = CreateCamera(#PB_Any,0,0,100,100)
MoveCamera(Camera,0,0,10)

; La caméra regarde en direction 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  
     
  ; Affiche le rendu de la scène
  RenderWorld()
  FlipBuffers()
Wend 
Vous ne voyez rien ? c'est normal : Votre scène (Votre monde) est complètement vide !
Dernière modification par falsam le dim. 04/janv./2015 0:30, modifié 6 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 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 : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube - Les 3 dimensions

Message par falsam »

3D signifie 3 dimensions. Une scène 3D c'est 3 axes au lieu de 2 dans un plan 2D.

l'axe X détermine la position horizontale d'un objet.
l'axe Y détermine la position verticale d'un objet.
l'axe Z détermine la profondeur d'un objet.

Les coordonnées d'un objet se donnent sous la forme (X, Y, Z).
Exemple

Code : Tout sélectionner

;Les trois dimensions 

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

InitEngine3D()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Les 3 dimensions")
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 Z
Blue = RGB(0, 255, 255) ;Coleur de l'axe Y

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

;
; 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
  
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
  
  ; Affiche le rendu de la scène
  RenderWorld()
  FlipBuffers()
Wend
Utiliser les flèches de direction gauche, droite, haut et bas pour déplacer la caméra.

Un lien explicatif sur les repères dans l'espace
http://www.purebasic.com/french/documen ... index.html
Dernière modification par falsam le dim. 04/janv./2015 0:32, modifié 8 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 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 : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube : Naissance du cube

Message par falsam »

Naissance du cube

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

CreateLine3D(#PB_Any, -10,0,0, Red, 10, 0, 0, Red) ;Axe X
CreateLine3D(#PB_Any, 0,-10,0, Green, 0, 10, 0, Green) ;Axe Y
CreateLine3D(#PB_Any, 0,0,-10, Blue, 0, 0, 10, Blue) ;Axe Z

;
; 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 direction 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
    
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend
le cube peut prendre la forme d'un parallélépipède rectangle.
Exemple pour une dimension de 4 x 3 x 2
Après la ligne de code Mesh = CreateCube(#PB_Any, 1) ajouter TransformMesh(Mesh, 0,0,0, 4,3,2, 0,0,0)
Dernière modification par falsam le mar. 17/sept./2013 14:04, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 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 : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube : Un peu de lumière

Message par falsam »

Un peu de lumière.

Juste aprés la ligne de code Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material)) ajouter le code ci-dessous.

Code : Tout sélectionner

;La lumiere
AmbientColor(RGB(151, 251, 151))
CreateLight(#PB_Any,RGB(151, 251, 151), -0.5, 3, 5)
Dernière modification par falsam le sam. 29/juin/2013 15:23, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 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 : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Histoire d'un Cube : Le Clonage

Message par falsam »

Le Clonage : Comment dupliquer un cube

A partir d'un seul mesh et d'un seul materiel, nous allons créer 10 entités.

Code : Tout sélectionner

;Naissance d'un cube : le Clonage

; 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 10 entités : ENTITE = MESH + MATERIEL
; CreateEntity() permet de définir les coordonnées x,y,z lors de la création d'une entité
For X = 0 To 9
  CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), X*2, 0, 0)
Next

;La lumiere
AmbientColor(RGB(151, 251, 151))
CreateLight(#PB_Any,RGB(151, 251, 151), -0.5, 3, 5)

;
; 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
    
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
  
  ; Affiche le rendu de la scène
  RenderWorld()
  FlipBuffers()
Wend 
Dernière modification par falsam le dim. 04/janv./2015 0:34, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 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
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

Re: Histoire d'un Cube

Message par SPH »

Merci pour ce tuto 3D. Je vais enfin pouvoir apprendre :o
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube : Première chute

Message par falsam »

Le code ci-dessous illustre la première chute du cube. On mettra en oeuvre l'instruction CreateEntityBody qui permet d'attribuer de propriétés de Masse, de Restitution (Rebond) et de Friction .

L'instruction WorldShadows() permet d'ajouter de l'ombre. (Of course)

Code : Tout sélectionner

;Naissance d'un cube : Premiere chute

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

;
; Naissance d'un cube 

; Une forme : C'est notre MESH qui ici sera un cube
Cube_Mesh = CreateCube(#PB_Any, 1) 
Ground_Mesh = CreatePlane(#PB_Any, 10, 10, 3, 3, 3, 3)

; Une texture (Cette texture peut être loader avec l'instruction LoadTexture()
; Cette texture servira pour notre cube et le sol
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 d'un cube en hauteur 
; CreateEntity() permet de définir les coordonnées x,y,z lors de la création d'une entité
Cube_Entity = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material), 0, 1, 0)
CreateEntityBody(Cube_Entity, #PB_Entity_BoxBody,2,0,1)

; Création du sol 
Ground_Entity = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, -2, 0)
CreateEntityBody(Ground_Entity, #PB_Entity_StaticBody, 0, 0, 1)

;
;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)
CamX=2.0
CamY=1.0
CamZ=15

; La caméra regarde en direction du 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
    
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
  
  ; Affiche le rendu de la scène
  RenderWorld()
  FlipBuffers()
Wend
Dernière modification par falsam le dim. 04/janv./2015 0:36, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 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 : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube : Saut de puce

Message par falsam »

Nous allons mettre en oeuvre la fonction ApplyEntityImpulse(). Cette fonction permet d'ajouter une valeur de la force d'impulsion en x, y et z.

la touche Espace permet de faire sauter le cube. Attention au doigt trop lourd.

Code : Tout sélectionner

;Naissance d'un cube : Saut de puce

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

InitEngine3D()
InitKeyboard()
InitSprite()

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

;
; Naissance d'un cube 

; Une forme : C'est notre MESH qui ici sera un cube
Cube_Mesh = CreateCube(#PB_Any, 1) 
Ground_Mesh = CreatePlane(#PB_Any, 10, 10, 3, 3, 3, 3)

; Une texture (Cette texture peut être loader avec l'instruction LoadTexture()
; Cette texture servira pour notre cube et le sol
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 d'un cube
; CreateEntity() permet de définir les coordonnées x,y,z lors de la création d'une entité
Cube_Entity = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material), -3.5, 0, 0)
CreateEntityBody(Cube_Entity, #PB_Entity_BoxBody,2,0,1)

; Création du sol 
Ground_Entity = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, -1, 0)
CreateEntityBody(Ground_Entity, #PB_Entity_StaticBody, 0, 0, 1)

;
;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)
CamX=2.0
CamY=1.0
CamZ=15

; La caméra regarde en direction du 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
  
  ;Saut de puce
  If KeyboardReleased(#PB_Key_Space)
    ApplyEntityImpulse(Cube_Entity, 5, 5, 0)
  EndIf   
  
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
  
  ; Affiche le rendu de la scène
  RenderWorld()
  FlipBuffers()
Wend
Dernière modification par falsam le dim. 04/janv./2015 0:37, modifié 3 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Histoire d'un Cube (Initiation à la 3D)

Message par Patrick88 »

cool un tuto , mééééé

pourquoi spécialement avec la dernière version ? pourquoi pas avec la 5.11

à quoi sert le Parse3DScripts() ?

et je vois que tu affectes Cube_Mesh = CreateCube(#PB_Any, 1)

mais après au niveau de la duplication je ne vois pas bien comment affecté les mesh ?
For X = 0 To 9
CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), X*2, 0, 0) -> vu que tu utilises un #pb_any, ou fourre tu ton n° de mesh ?
Next

merci pour le nuuul en 3d que je suis

Patrick
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Histoire d'un Cube (Initiation à la 3D)

Message par falsam »

Patrick88 a écrit :pourquoi spécialement avec la dernière version ? pourquoi pas avec la 5.11
Oui pourquoi pas :oops:
Patrick88 a écrit : à quoi sert le Parse3DScripts() ?
L'instruction Parse3DScripts() lit tous les fichiers scripts avec l'extension ".materials" trouvés dans les chemins définis avec Add3DArchive(). Par habitude j'ai laissé cette instruction qui dans les exemples ci-dessus ne sert à rien.
Patrick88 a écrit : au niveau de la duplication je ne vois pas bien comment affecté les mesh ?
For X = 0 To 9
CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), X*2, 0, 0) -> vu que tu utilises un #pb_any, ou fourre tu ton n° de mesh ?
Next
Tu confonds l'identifiant d'une entité avec avec l'identifiant d'un mesh. D'ailleurs l'identifiant du mesh est bien indiqué dans l'extrait de code que tu donnes.

Une ENTITE est composée d'un MESH et d'un MATERIEL.
■ Le MESH va donner une forme non texturé.
■ Le MATERIAL est la matière qui entoure le mesh. Il est composé d'une texture et peut recevoir d'autres propriétés dont on parlera plus tard.

Exemple de création d'un cube SANS MATERIEL (Que c'est moche !)

Code : Tout sélectionner

Define.f CamX, CamY, CamZ

InitEngine3D()
InitKeyboard()
InitSprite()

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

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

; Création de notre entité 
Entity = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None )

; 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  
 
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend 
Revenons à la fin de ta question
Patrick88 a écrit : au niveau de la duplication je ne vois pas bien comment affecté les mesh ?
Le code dont tu fais référence duplique des cubes qui n'ont pas d'interaction. je n'avais donc pas besoin de connaitre leurs numéros d'ENTITES.
Configuration : Windows 11 Famille 64-bit - PB 6.03 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
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

Re: Histoire d'un Cube (Initiation à la 3D)

Message par SPH »

Encore merci pour ce toturial, j'ai pigé comment on fait un cube, comment on fait un sol et comment on cree une gravité.
Voici un code basé sur l'un des tiens :

Code : Tout sélectionner

;Naissance de 100 cubes : Premieres chutes

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

;
; Naissance d'un cube 

; Une forme : C'est notre MESH qui ici sera un cube
Cube_Mesh = CreateCube(#PB_Any, 1) 
Ground_Mesh = CreatePlane(#PB_Any, 10, 10, 3, 3, 10,10)

; Une texture (Cette texture peut être loader avec l'instruction LoadTexture()
; Cette texture servira pour notre cube et le sol
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))
For i=1 To 2000
  Box(Random(510),Random(510),Random(10),Random(10),Random(256*256*256))
Next
StopDrawing()

Texture2 = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture2))
Box(0,0,512,512,RGB(0, 0, 0))
Box(1,1,510,510,RGB(0, 0, 255))
For i=1 To 10000
  Box(Random(510),Random(510),Random(10),Random(10),Random(256*256*256))
Next
StopDrawing()


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

; Création d'un cube en hauteur 
; CreateEntity() permet de définir les coordonnées x,y,z lors de la création d'une entité
For i=1 To 100
  Cube_Entity = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material), Random(12)-6, Random(40)+10,Random(12)-6)
  CreateEntityBody(Cube_Entity, #PB_Entity_BoxBody,2,0,1)
Next

; Création du sol 
Ground_Entity = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material2), 0, -2, 0)
CreateEntityBody(Ground_Entity, #PB_Entity_StaticBody, 0, 0, 1)

;
;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)
CamX=2.0
CamY=1.0
CamZ=15

; La caméra regarde en direction du point au coordonnées x=0, y=0, z=0
CameraLookAt(camera,0,0,0)
    CamX-2  
MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)


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
    
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
  Wend
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Histoire d'un Cube (Initiation à la 3D)

Message par falsam »

Pas mal SPH. Et si tu jouais aussi avec la gravité ?

Juste apres OpenWindowedScreen(WindowID(window),0,0,1024,768) tu ajoutes.

Code : Tout sélectionner

; Un peu de gravité 
EnableWorldPhysics(#True) ;je pense que cette fonction est inutile
WorldGravity(-5) ;Par defaut la gravité est fixé à -9.806 
Avant MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute) tu inséres

Code : Tout sélectionner

; La gravité s'inverse
  If KeyboardPushed(#PB_Key_Space)
    WorldGravity(5)
  EndIf
Attends que suffisamment de cubes tombent sur la platform et presse la touche Espace. Les cubes fixes resteront sur place.
Configuration : Windows 11 Famille 64-bit - PB 6.03 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
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

Re: Histoire d'un Cube (Initiation à la 3D)

Message par SPH »

falsam a écrit :Pas mal SPH. Et si tu jouais aussi avec la gravité ?

Juste apres OpenWindowedScreen(WindowID(window),0,0,1024,768) tu ajoutes.

Code : Tout sélectionner

; Un peu de gravité 
EnableWorldPhysics(#True) ;je pense que cette fonction est inutile
WorldGravity(-5) ;Par defaut la gravité est fixé à -9.806 
Avant MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute) tu inséres

Code : Tout sélectionner

; La gravité s'inverse
  If KeyboardPushed(#PB_Key_Space)
    WorldGravity(5)
  EndIf
Attends que suffisamment de cubes tombent sur la platform et presse la touche Espace. Les cubes fixes resteront sur place.
Ca y est, j'ai fait mumuse.
Bon, maintenant, je vais matter les exemples de Dobro pour apprendre les mesh complexes. :wink:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

Re: Histoire d'un Cube (Initiation à la 3D)

Message par SPH »

Ha oui, j'oubliais : il serait bon de faire un code qui fasse tourner un cube et pas la camera

ps : ce post devrait etre epinglé
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Répondre