Questions pour mon premier projet 3D...

Généralités sur la programmation 3D
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Questions pour mon premier projet 3D...

Message par ATHOW »

Salut à vous,

Ca fait longtemps :).
J'ai laissé un peu le Pure de côté ces derniers mois pour me consacrer à la programmation d'homebrews sur console (nintendo DS principalement, sans beaucoup de succès d'ailleurs) en C++, ainsi qu'au scripting lua pour certains jeux, et (hélas) surtout au développement d'application pour mes employeurs, sur des projets pas toujours intéressants :wink: ...

Je reviens vers Pure car j'ai aujourd'hui en tête un nouveau projet PC, mon premier projet "sérieux" en 3D (pas un cube qui tourne, quoi) : un créateur d'environnement pour un jeu.
Je sais, ça parait ambitieux de prime abord, mais finalement, pas tant que ça :
  • Le jeu en question n'accepte que ces 3 formes de base : pavé, sphère et cylindre aux bouts arrondis.
    Je n'ai pas besoin de gérer les textures des objets, vu que le jeu ne les gère pas.... seulement leur couleur.
    Pas besoin d'effets de lumières, de particules, de shading.
    Pas besoin de gestion de collisions.
    Pas d'animation.
Bon, il y a quand même du boulot pour fournir une interface simple permettant de gérer l'orientation, la taille, la couleur et la position des objets (ainsi que des propriétés non visibles : poids, friction...), mais je suis prêt à sacrifier pas mal de nuits pour ce projet, donc, ça me fait pas trop peur...

J'ai déjà pensé à la façon de lire/écrire les fichiers propres au jeu (de simple fichiers textes avec un syntaxe particulière), j'ai déjà réfléchi à la plupart des problèmes potentiels...

Reste que je suis une grosse quiche en 3D.

Ma question est simple : de quoi ai-je besoin pour mon projet ?

Est-ce que Purebasic et sa gestion d'Ogre suffit ? J'ai vu que de nouvelles fonctions géniales ont été ajoutées pendant mon absence : pickEntity, Gadget3D... Sont elles au point ? (pas d'exemple dans la doc, j'ai uniquement trouvé un exemple sur le forum anglais, qui fonctionne, mais que je n'ai pas encore regardé de près)
De plus, j'ai un peu peur du format de mesh... Est-il possible de créer facilement à la volée des cubes, des sphères et des cylindre arrondis de taille variable ? Les exemples de cylindres ou de tores que Comtois a posté ne sont pas évident à comprendre...

Dois-je plutôt me tourner vers les wrapper Irrlicht, vers Dreamotion (toujours d'actualité ?) ou le nouveau N3XTD (qui m'a l'air d'être du beau boulot) ?

Merci de m'éclairer !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Je dirais que Dreamotion n'est plus d'actualité (à confirmer par TMyke). Par contre, si tu souhaites faire du multi plateforme, avoir un moteur 3D proche de l'utilisateur et évolutif rapidement, N3xtD est la solution. (Ca fait pub, non ?)
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Progi1984 a écrit :Je dirais que Dreamotion n'est plus d'actualité (à confirmer par TMyke). Par contre, si tu souhaites faire du multi plateforme, avoir un moteur 3D proche de l'utilisateur et évolutif rapidement, N3xtD est la solution. (Ca fait pub, non ?)
héhé ouai ça fait pub, mais c'est bien :P
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message par ATHOW »

Merci pour vos réponses !
J'ai donc téléchargé n3xtd, j'ai testé et lu les exemples, et potassé la (maigre, hélas) documentation.

J'en arrive à la conclusion que c'est super puissant et que ça risque de me faciliter le travail pour pas mal d'aspects, c'est vrai... mais pour ce qui me faisait peur (la manipulation des mesh), ca fait aussi peur que le Ogre des familles... :(

Me reste donc à bosser ma création/modification de mesh... une idée de où je peux commencer ? J'ai clairement du mal avec le format de ces objets là....

J'ai l'impression que deux choix s'opposent :
  • Créer mes mesh à la volée, à partir de data intégrés au code (ce que j'aimerais faire). Mais là, je manque de connaissance pour le format mesh... Comtois, dieu de la 3D à l'ancienne, si tu me lis...

    Créer mes objets avec un logiciel 3D et les exporter en mesh... mais si je fais ça, est-ce que je pourrais ensuite les "déformer" ensuite ? (par exemple, changer le rayon d'un cylindre, ou simplement sa hauteur).
Merci d'avance pour vos éclaircissements :)
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Salut ATHOW

Content de te revoir dans le coin.

Tout d'abord bravo pour ton projet, tu sembles vraiment bien motivé, et avoir une idée bien
précise de ce que tu souhaite arriver à faire. Un projet 3D sous Pure en plus, que du bonheur,
c'est une denrée tellement rare avec ce langage.

Pour essayer d'éclairer ta lanterne concernant les choix à faire en terme de moteur, voilà ce
que je pourrais personnellement en dire:

Tout d'abord, effectivement, Dreamotion3D n'est plus maintenu, du moins pour ce qui est de PureBasic,
donc ce n'est pas vraiment la solution à adopter.

Ceci étant dit, au vue des spécifications que tu énonces, tu as le choix entre deux possibilités qui semblent
raisonnables, que sont la version d'Ogre fournie avec PB ou N3xtD (basé sur version modifiée d'Irrlicht).

Après, dire lequel de ces deux solutions conviendrait le mieux, difficile à dire comme cela. Je dirais à chaud et au vue
de tes exigences techniques vraiment très basiques, que le moteur fourni avec PureBasic suffit à mon sens amplement.
La version d'Ogre fournis avec PB c'est bien étoffée ces derniers temps et même si elle manque encore de quelques
éléments et fonctionnalités, les possibilité sont déjà fort intéressante..

(d'ailleurs petit message à Fred, Ogre étant libre à la base, il est dommage que le code de la DLL fournis avec PB ne soit pas
disponible et accessible -à travers un SVN par exemple-, les quelques amateurs de prog 3D ayant de bonnes connaissances pourrait je
pense très largement l'étoffer, le faire progresser et en améliorer les fonctionnalités, apportant un plus-value réel à PureBasic en matière
de 3D, et par la même à PureBasic lui même, fin de la parenthèse)
.

Reste le cas du formats d'import natif comme tu le soulignes (.mesh). Mais, bon au vue de ce que tu énonces, je ne pense pas que cela
te serve, la création de tes trois éléments de bases se faisant par le biais de code à la volé en natif.

Si par contre tu voulais aller plus loin, alors effectivement, peut-être serait-il plus souhaitable de t'orienter vers une solution externe,
comme N3xtD effectivement ( ou encore voir TV3D ou DBPro, payante ceci dit et exclusivement DirectX).

Voilà ma première impression, même si je ne sais pas si cela t'aide dans ta réflexion.

Pour ce qui est de la création de tes mesh de base, c'est une gymnastique en fait. C'est beaucoup plus simple qu'il
n'y parait. Quand à importer tes mesh pour les manipuler, les déformer, etc... c'est en effet parfaitement faisable,
en tous les cas avec N3xtD. ;)
Dernière modification par tmyke le mar. 18/août/2009 20:21, modifié 2 fois.
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

N3xtD gere l'import 3DS ?
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Dobro a écrit :N3xtD gere l'import 3DS ?
Oui.
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ben alors , qu'esque tu nous gonfle AThow avec tes meshs !

:lol: :lol: :lol: :lol: :lol: :lol: :lol:
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message par ATHOW »

Justement, j'ai posé une question à ce sujet :)
Créer mes objets avec un logiciel 3D et les exporter en mesh... mais si je fais ça, est-ce que je pourrais ensuite les "déformer" ensuite ? (par exemple, changer le rayon d'un cylindre, ou simplement sa hauteur).
J'essaie en ce moment de me répondre moi même, avec divers essais laborieux :)
Si quelqu'un passe par ici et connait la réponse, il me fera peut-être gagner une heure !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ATHOW a écrit :Justement, j'ai posé une question à ce sujet :)
Créer mes objets avec un logiciel 3D et les exporter en mesh... mais si je fais ça, est-ce que je pourrais ensuite les "déformer" ensuite ? (par exemple, changer le rayon d'un cylindre, ou simplement sa hauteur).
J'essaie en ce moment de me répondre moi même, avec divers essais laborieux :)
Si quelqu'un passe par ici et connait la réponse, il me fera peut-être gagner une heure !

heu !!

tu as essayé de faire ton objet et de le sauver en *.3ds
ensuite tu l'importe dans N3XTD (puisqu'il importe les 3Ds)

et de le modifier par code ???


voir peut etre , de l'animer dans ton soft 3D

l'import 3ds de N3XTD gère peut être les animés .... ???
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Je te ferais un petit code ce soir en rentrant, pour N3xtD ;)
Force et sagesse...
Anonyme

Message par Anonyme »

C'est simple Athow , je part dans l'optique que tu maitrise déjà un logiciel de modélisation.

Tu fabriques via se logiciel ton cylindre , d'une taille de 1 en hauteur et d'un rayon de 1 , 1 sur 1 quoi.

Dans les moteurs 3D , notamment dans n3xtd , tu peut appliqué un multiplicateur sur la taille du "mesh".

je m'explique , dans N3xtd , tout est "noeud" (node) camera , objet , lumière , etc... , tu appliques une fonction de redimensionnement sur se noeud.

iScaleNode(*NodeDeMonMesh,ScaleX,ScaleY,ScaleZ)

pour une hauteur de 10 et d'un rayon de 2

iScaleNode(*Cylindre,2,10,2)

Voila , voila , c'est vraiment très simple. N3xtd , est le moteur 3D le plus abouti à ce jour sur PureBasic.
ATHOW
Messages : 226
Inscription : mer. 29/déc./2004 16:54

Message par ATHOW »

Oui, c'est ce que j'ai fait finalement, sauf que je l'ai fait avec Ogre (fonctions natives intégrées à Pure) et ResizeEntity() ou ScaleEntity(), je sais plus :)

Bien, je teste avec n3xtd ce soir, et je prends celui avec lequel je me sens le plus à l'aise, vu que dans les deux cas, je n'aurais pas de limitations techniques : même la version bridée de Ogre qu'on a sous la main semble suffire à tout ce que je veux faire ^^

Je vais pouvoir arrêter de vous embêter pour le moment... mais, vous inquiétez pas, vous aurez de mes nouvelles au premier soucis venu !

Merci encore !
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Salut ATHOW

Comme promis, un petit code, en fait deux pour voir si cela peut éclairer ta lanterne.

Le premier reprend l'explication donnée par Cpl.Bator. C'est relativement simple à comprendre
et à mettre en oeuvre.

Code : Tout sélectionner

; Include files 
IncludePath "includes"   :   IncludeFile "n3xtD_PB.pbi"



; Globales
Global	anglex.f, angley.f, flagXDown.w
Global	mox.f, omx.f, moy.l, omy.l
Global *app.l, Quit.l


;----------------------------------------------------------
; open n3xt-D screen
*app = iCreateGraphics3D(800,600)
; << OR >>
;*app = iCreateGraphics3D(800,600, 32, #False, #True, #EDT_DIRECT3D9)
If *app= #Null
  End
EndIf

 
; change le repertoire courant pour facilité le chargement des media
  SetCurrentDirectory("media/") 
 
;--------------------------------------------------------------------- 
;--------------------------------------------------------------------- 
 ; charge un objet 3D, dans notre cas l'objet 'sphereLOD1.3DS" 
 ; j'ai chois cet objet 3DS, car il est dans les medias du pack N3xtD
  Global *obj.IObject = iLoad3DObject("sphereLOD1.3DS")

; creation d'un mesh à partir de l'objet chargé précédemment
  Global *mesh.IMesh = iCreateMesh(*obj)


;!!!!!!!!!!!!!!!!!!!!!
; >> ou encore , tu peux partir sur les objet pré-programmés<<
;!!!!!!!!!!!!!!!!!!!!!


; creation d'un cylindre bleu, d'un diamètre 1 et d'une hauteur de 5
;Global *mesh.IMesh = iCreateCylinder(1.0, 5.0, $ff0000ff)
;--------------------------------------------------------------------- 
;--------------------------------------------------------------------- 


; une petite camera pour voir ce qui se passe
Define *cam.ICamera = iCreateCamera( )
iPositionNode(*cam, 0,2,-30)


;-----------------------------------
; load font png, pour pouvoir écrire
; deux trois trucs
iLoadFont("courriernew.png")
Global *font.IGUIFont = iGetFont()


; ---------------------------------------
;           main loop
; ---------------------------------------
Repeat

; par le biais de quelques touches de bases,
; on interfère directement sur la taille
; du mesh, dans ce cas on scale en fonction
; des axes choisis (pour les deux premiers cas)
; ou sur la totalité des axes pour le troisème
; cas.
  If iGetKeyDown(#KEY_KEY_D)
    iScaleNode( *mesh , 1, 2, 1)
  EndIf
  If iGetKeyDown(#KEY_KEY_C)
    iScaleNode( *mesh , 1, 1, 1)
  EndIf

  If iGetKeyDown(#KEY_KEY_F)
    iScaleNode( *mesh , 2, 1,1)
  EndIf
  If iGetKeyDown(#KEY_KEY_G)
    iScaleNode( *mesh , 1, 1,1)
  EndIf
  
  If iGetKeyDown(#KEY_KEY_B)
    iScaleNode( *mesh , 2,2,2)
  EndIf
  If iGetKeyDown(#KEY_KEY_V)
    iScaleNode( *mesh , 1,1,1)
  EndIf
  
  
 	; move camera with dir key and mouse (left click)
  If iGetKeyDown(#KEY_ARROW_UP)
    iMoveNode(*cam, 0,0,0.5)
  EndIf
  If iGetKeyDown(#KEY_ARROW_DOWN)
    iMoveNode(*cam, 0,0,-0.5)
  EndIf
  If iGetMouseEvent(#MOUSE_BUTTON_LEFT)
  		If flagXDown=0
  			omx = iGetMouseX()
  			omy = iGetMouseY()
  			flagXDown=11
  		Else
  			moy = iGetMouseY()-omy
  			angley=(moy/10.0)
  			omy= iGetMouseY()
  			mox = iGetMouseX()-omx
  			anglex=(mox/10.0)
  			omx= iGetMouseX()
  			iTurnNode(*cam, angley, anglex,0)
  		EndIf
  Else
  	 		flagXDown=0
  EndIf


; just turn our mesh
  iTurnNode(*mesh, 0,0,0.5)

	; if Escape Key, exit	
  If iGetKeyDown(#KEY_ESCAPE)
    Quit=1
  EndIf


  	; ---------------
  	;      Render
  	; ---------------
  iBeginScene()
     iDrawScene()
     iDrawText(*font, "DirKey et Souris pour bouger la camera",  10,10,0,0, $ff00ffff)
     iDrawText(*font, "touche D et C pour changer la taille sur l'axe Y",  10,25,0,0, $ffffff00)
     iDrawText(*font, "touche F et G pour changer la taille sur l'axe X",  10,40,0,0, $ffffff00)
     iDrawText(*font, "touche V et B pour changer la taille sur les 3 axes",  10,55,0,0, $ffffff00)
  iEndScene()



Until Quit=1
; end
iFreeEngine()


Il existe une seconde solution, qui à la base ne semble pas vraiment coller à ton projet, mais qui
sais, la connaitre peut toujours être interessant.
C'est de directement agir sur les sommets de ton objet. On touche donc directement à la geométrie de ton
élément. Dans certains cas, cette une option qui parfois peut être utile:

Code : Tout sélectionner


; Include files 
IncludePath "includes"   :   IncludeFile "n3xtD_PB.pbi"



; Globales
Global	anglex.f, angley.f, flagXDown.w
Global	mox.f, omx.f, moy.l, omy.l

Global *app.l, Quit.l


;----------------------------------------------------------
; open n3xt-D screen
*app = iCreateGraphics3D(800,600)
; << OR >>
;*app = iCreateGraphics3D(800,600, 32, #False, #True, #EDT_DIRECT3D9)
If *app= #Null
  End
EndIf

 
 
; change le repertoire courant pour facilité le chargement des media
  SetCurrentDirectory("media/") 
 
;--------------------------------------------------------------------- 
;--------------------------------------------------------------------- 
 ; charge un objet 3D, dans notre cas l'objet 'sphereLOD1.3DS" 
  Global *obj.IObject = iLoad3DObject("sphereLOD1.3DS")

; creation d'un mesh à partir de l'objet chargé précédement
  Global *mesh.IMesh = iCreateMesh(*obj)


;!!!!!!!!!!!!!!!!!!!!!
; >> ou encore , tu peux partir sur les objet pré-programmés<<
;!!!!!!!!!!!!!!!!!!!!!


; creation d'un cylindre bleu, d'un diamètre 1 et d'une hauteur de 5
;Global *mesh.IMesh = iCreateCylinder(1.0, 5.0, $ff0000ff)
;--------------------------------------------------------------------- 
;--------------------------------------------------------------------- 



; récupération de la geométrie de notre mesh, en d'autre
; termes, on récupère l'adresse ou sont mémorisé les
; differentes coordonnées formant le mesh, comme par examples
; les coordonnées des vertices.
; Cela va nous servir plus loin
  Global *geom.IMeshBuffer = iMeshGeometry(*mesh)



; une petite camera pour voir ce qui se passe
Define *cam.ICamera = iCreateCamera( )
iPositionNode(*cam, 0,2,-30)


;-----------------------------------
; load font png, pour pouvoir écrire
; deux trois trucs
iLoadFont("courriernew.png")
Global *font.IGUIFont = iGetFont()


; ---------------------------------------
;           main loop
; ---------------------------------------
Repeat

; par le biais de quelques touches de bases,
; on interfère directement sur la géométrie
; du mesh, dans ce cas on scale en fonction
; des axes choisis (pour les deux premiers cas)
; ou sur la totalité des axes pour le troisème
; cas.
; Pour résumer, on multiplie les coordonnées de
; nos sommets par un facteur donnée. Si la valeur
; de cette multiplication est supérieur à 1, alors
; on augmente la taille du mesh, et évidement, si
; on multiplie par une valeur inférieure à 1 on
; réduit la taille du mesh
  If iGetKeyDown(#KEY_KEY_D)
    iScaleMeshBuffer( *geom , 1, 1.01, 1)
  EndIf
  If iGetKeyDown(#KEY_KEY_C)
    iScaleMeshBuffer( *geom , 1, 0.99, 1)
  EndIf

  If iGetKeyDown(#KEY_KEY_F)
    iScaleMeshBuffer( *geom , 1.01, 1,1)
  EndIf
  If iGetKeyDown(#KEY_KEY_G)
    iScaleMeshBuffer( *geom , 0.99, 1,1)
  EndIf
  
  If iGetKeyDown(#KEY_KEY_B)
    iScaleMeshBuffer( *geom , 1.01, 1.01, 1.01)
  EndIf
  If iGetKeyDown(#KEY_KEY_V)
    iScaleMeshBuffer( *geom , 0.99, 0.99, 0.99)
  EndIf
  
  
 	; move camera with dir key and mouse (left click)
  If iGetKeyDown(#KEY_ARROW_UP)
    iMoveNode(*cam, 0,0,0.5)
  EndIf
  If iGetKeyDown(#KEY_ARROW_DOWN)
    iMoveNode(*cam, 0,0,-0.5)
  EndIf
  If iGetMouseEvent(#MOUSE_BUTTON_LEFT)
  		If flagXDown=0
  			omx = iGetMouseX()
  			omy = iGetMouseY()
  			flagXDown=11
  		Else
  			moy = iGetMouseY()-omy
  			angley=(moy/10.0)
  			omy= iGetMouseY()
  			mox = iGetMouseX()-omx
  			anglex=(mox/10.0)
  			omx= iGetMouseX()
  			iTurnNode(*cam, angley, anglex,0)
  		EndIf
  Else
  	 		flagXDown=0
  EndIf


; just turn our mesh
  iTurnNode(*mesh, 0,0,0.5)

	; if Escape Key, exit	
  If iGetKeyDown(#KEY_ESCAPE)
    Quit=1
  EndIf


  	; ---------------
  	;      Render
  	; ---------------
  iBeginScene()
     iDrawScene()
     iDrawText(*font, "DirKey et Souris pour bouger la camera",  10,10,0,0, $ff00ffff)
     iDrawText(*font, "touche D et C pour changer la geometie sur l'axe Y",  10,25,0,0, $ffffff00)
     iDrawText(*font, "touche F et G pour changer la geometie sur l'axe X",  10,40,0,0, $ffffff00)
     iDrawText(*font, "touche V et B pour changer la geometie sur les 3 axes",  10,55,0,0, $ffffff00)
  iEndScene()



Until Quit=1
; end
iFreeEngine()
Force et sagesse...
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

tmyke a écrit : (d'ailleurs petit message à Fred, Ogre étant libre à la base, il est dommage que le code de la DLL fournis avec PB ne soit pas disponible et accessible -à travers un SVN par exemple-, les quelques amateurs de prog 3D ayant de bonnes connaissances pourrait je
pense très largement l'étoffer, le faire progresser et en améliorer les fonctionnalités, apportant un plus-value réel à PureBasic en matière
de 3D, et par la même à PureBasic lui même, fin de la parenthèse)
.
Le manuel de PB précise que les sources d'Ogre customisées par Fred sont disponibles ici : http://www.purebasic.com/OgreSources.zip
Répondre