Page 1 sur 5

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

Publié : sam. 29/juin/2013 11:42
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

Histoire d'un Cube : Le néant

Publié : sam. 29/juin/2013 11:43
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 !

Histoire d'un Cube - Les 3 dimensions

Publié : sam. 29/juin/2013 11:45
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

Histoire d'un Cube : Naissance du cube

Publié : sam. 29/juin/2013 11:48
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)

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

Publié : sam. 29/juin/2013 11:59
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)

Re: Histoire d'un Cube : Le Clonage

Publié : sam. 29/juin/2013 12:17
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 

Re: Histoire d'un Cube

Publié : sam. 29/juin/2013 12:21
par SPH
Merci pour ce tuto 3D. Je vais enfin pouvoir apprendre :o

Histoire d'un Cube : Première chute

Publié : sam. 29/juin/2013 15:20
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

Histoire d'un Cube : Saut de puce

Publié : sam. 29/juin/2013 16:40
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

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

Publié : sam. 29/juin/2013 22:04
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

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

Publié : sam. 29/juin/2013 22:48
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.

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

Publié : mar. 02/juil./2013 11:30
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

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

Publié : mar. 02/juil./2013 12:43
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.

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

Publié : mar. 02/juil./2013 12:56
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:

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

Publié : mar. 02/juil./2013 13:00
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é