Page 1 sur 1

Utiliser un autre moteur 3D que Ogre3D

Publié : sam. 09/oct./2004 17:17
par Aranoth
Bonjour


Ca fait déjà un chtit moment que je m'interesse à la 3D en PureBASIC, j'ai fait pleins d'essais avec Ogre3D, mais c'est assez limité je trouve...peu de formats supportés (juste le mesh avec son skeleton etc...pas très pratique), angles de rotation bizarres...(Quand je fait une rotation en Y, au lieu de tourner autour de l'axe Y, l'entitée tourne autour de l'axe X :? ), etc...

J'ai ensuite essayer de créer un moteur 3D de toute piece, mais j'avais pas les bases en maths (je les ai toujours pas...je suis qu'en 2nd) malgrès les très bon cours sur Mandragor.org ou Prografix...

Par contre le net fourmille de très bon moteurs 3D comme Irrlitch ou TrueVision qui on l'air très interessant...

Ma question est donc:

Esce possible d'utiliser en PureBASIC un autre moteur3D que Ogre3D ? Y'a t'il des moteurs3D fait spécialement pour le Pure (et pourquoi pas, en Pure ?) ? Esce possible d'utiliser un moteur3D prévu pour un autre langage via ses DLL ? (comme Irrlitch)

Merci de votre aide (au pire j'essairait de traduire ca en anglais et de poster sur le forum anglais :) )

Publié : sam. 09/oct./2004 18:11
par Chris
Sans vraiment savoir, je dirais oui.

Quand tu utilises des librairies comme FMod ou Bass pour le son, ça fonctionne sans problème. Tu ne peux simplement plus utiliser les commandes de Pure (pour les commandes concernant le son), et il faut travailler avec celles de la dll.

Pourquoi ça ne serait pas pareil pour un moteur 3D ?

Publié : sam. 09/oct./2004 19:12
par Aranoth
Mais le son c'est une chose, mais afficher quelque chose dans l'écran créer par PureBASIC c'est autre chose je pense...

Il doit y avoir un lien entre les 2 forcément, le son est retransmis directement par les hauts parleurs, mais pour afficher de la 3D ca doit etre bien différent :?

Publié : sam. 09/oct./2004 19:26
par Chris
Bein le mieux, c'est d'essayer.
De toute façon, qu'est-ce que tu risques, à part, au pire un plantage? :)

Publié : sam. 09/oct./2004 19:35
par Aranoth
j'essairait bien si j'avais ne serai-ce que la moindre idée de comment procéder lol :lol:

Publié : sam. 09/oct./2004 22:19
par nico
Je viens de jeter un oeil sur Truevision, il a été écrit en objet Com.

Alors je dirais Bon Courage, il y a des exemples sur ce site:

http://francis.dupont.free.fr/coindev/

:)

Publié : sam. 09/oct./2004 23:09
par comtois
J'avais aussi fait une recherche sur ce moteur , mais bon , je serais bien incapable de l'utiliser . Je n''y connais rien au Com .
Avec l'utilitaire de aXend j'avais bien récupéré des choses
mais ça ne m'aide pas beaucoup , je ne sais pas quoi en faire :?

http://home.planet.nl/~aXend/purebasic/ ... erator.zip

Sinon , d'autres ont déjà posé la question ici , en vain :

http://www.truevision3d.com/phpBB2/about1121.html

Publié : dim. 10/oct./2004 13:45
par Aranoth
Merci a vous

Apparament pour TrueVision vaut mieux laisser tomber...son truc COM et cie...finalement c'est plus simple d'utiliser Ogre3D je pense^^


Donc je peut rayer la solution:
utiliser un autre moteur 3D externe


PS:
Ce que je me demande, c'est esce que ca serait possible d'utiliser les Sprites3D et de les transformer avec TransformSprite3D() pour créer des faces et simuler de la 3D ?
Je sais pas si ca va donner de bon FPS (les Sprites3D on l'air lent) et surtout y'a tous les calculs derrières...
Qu'en pensez vous ?

Publié : dim. 10/oct./2004 14:21
par comtois
si tu veux créer des faces , il y a les 'Billboards' .
Les 'Billboards' sont des surfaces planes rectangulaires (composées de 2 triangles) qui sont toujours orientées face à la camera.
Je ne comprends pas très bien ce que tu cherches à faire ?

Publié : dim. 10/oct./2004 14:23
par filperj
Ce que je me demande, c'est esce que ca serait possible d'utiliser les Sprites3D et de les transformer avec TransformSprite3D() pour créer des faces et simuler de la 3D ?
C'est possible, mais le problème c'est qu'il n'y a pas de Z-buffer pour les sprite 3d, alors il faudrai soigneusement trier les faces pour les afficher dans le bon ordre...

J'avais fait un petit essai, c'est très brouillon, je ne sais pas si tu pourras en tirer quelquechose (moi j'ai laissé tomber, je dis ça pour t'encourager :twisted: )

Il faut 3 jpg que tu nommeras "gravier","mur" et "lave".
Inverse l'ordre d'affichage du plateau et du cube dans la boucle principale pour voir le problème que pose l'absence de Z-buffer.

Code : Tout sélectionner



Structure D3DTLVERTEX
    
    scx.f : scy.f ;
    
    scz.f ; 
    
    StructureUnion
      rhw.f
    EndStructureUnion
;     union {
;     D3DVALUE    rhw;        /* Reciprocal of homogeneous w */
;     D3DVALUE    dvRHW;
;     };


    coul.l ; couleur ARVB
    spec.l ; couleur spéculaire ?
    
    u.f
    v.f

EndStructure


Structure PB_Sprite3D
   Texture.l              ; DirectX7 surface
   Vertice.D3DTLVERTEX[4] ; The 4 vertices for the rectangle sprite
   Width.w
   Height.w
EndStructure


Procedure turnab(*a.FLOAT,*b.FLOAT,ang.f)
   dist.f=Sqr(Pow(*a\f,2)+Pow(*b\f,2))
   If dist=0 : ProcedureReturn : EndIf
   If ASin(*a\f/dist)<0
      ang-ACos(*b\f/dist)
     Else
      ang+ACos(*b\f/dist)
   EndIf
   *a\f=Sin(ang)*dist
   *b\f=Cos(ang)*dist
EndProcedure


Structure vecteur
   x.f : y.f : z.f
EndStructure

Structure face
   v.l[4]
   spr.l
EndStructure

Structure objet
   nbvec.l
   nbfas.l
   vecteurs.l
   faces.l
   nbtex.l
   tex.l
EndStructure

Structure camera
   pos.vecteur
   a.vecteur
   corlarj.f
   corhtr.f
EndStructure

Global _cam.camera
Procedure movcam(vit.f)
   vertic.f=Sin(_cam\a\x)
   horiz.f=Cos(_cam\a\x)
   enx.f=Sin(_cam\a\y)*horiz
   enz.f=Cos(_cam\a\y)*horiz
   _cam\pos\x-enx*vit
   _cam\pos\z+enz*vit
   _cam\pos\y-vertic*vit
EndProcedure


Structure qvec
   v.vecteur[4]
EndStructure


Procedure displayobj(*obj.objet)

   *face.face=*obj\faces
   basevec=*obj\vecteurs
   nbfas=*obj\nbfas
   Protected qvec.qvec,vc.vecteur
   
   Repeat
      
      off=0
      For v=0 To 3
         CopyMemory(basevec+*face\v[v]*SizeOf(vecteur),@vc,SizeOf(vecteur))
         vc\x-_cam\pos\x
         vc\y-_cam\pos\y
         vc\z-_cam\pos\z
         turnab(@vc\x,@vc\z,_cam\a\y)
         turnab(@vc\y,@vc\z,_cam\a\x)
         turnab(@vc\x,@vc\y,_cam\a\z)
         If vc\z<=0 : off+1 : EndIf
         echel.f=vc\z/400
         qvec\v[v]\x=(vc\x/echel+400)*_cam\corlarj
         qvec\v[v]\y=(vc\y/echel+300)*_cam\corhtr
         qvec\v[v]\z=vc\z
      Next
      
      If off<5
         ;TransformSprite3D(*face\spr,qvec\v[0]\x,qvec\v[0]\y,qvec\v[0]\z,qvec\v[1]\x,qvec\v[1]\y,qvec\v[1]\z,qvec\v[2]\x,qvec\v[2]\y,qvec\v[2]\z,qvec\v[3]\x,qvec\v[3]\y,qvec\v[3]\z)
         *abob.pb_sprite3d=*face\spr
         For vertx=0 To 3
            If vertx>1
               vx=5-vertx
              Else
               vx=vertx
            EndIf
            *abob\vertice[vx]\scx=qvec\v[vertx]\x
            *abob\vertice[vx]\scy=qvec\v[vertx]\y
            *abob\vertice[vx]\rhw=1/qvec\v[vertx]\z
         Next
         DisplaySprite3D(*face\spr,0,0)
      EndIf
      
      *face+SizeOf(face)
      facecurr+1
      
   Until facecurr=nbfas
   
EndProcedure



UseJPEGImageDecoder()
InitSprite()
InitSprite3D()
#scx=800 : #scy=600
OpenScreen(#scx,#scy,32,"")
graviertx=LoadSprite(-1,"gravier.jpg",#PB_Sprite_Texture)
;graviertx=LoadSprite(-1,"clouds.jpg",#pb_sprite_texture)
gravier=CreateSprite3D(-1,graviertx)
murtx=LoadSprite(-1,"mur.jpg",#PB_Sprite_Texture)
lavetx=LoadSprite(-1,"lave.jpg",#PB_Sprite_Texture)
mur=CreateSprite3D(-1,murtx)
lave=CreateSprite3D(-1,lavetx)


DefType.objet plato,cube

plato\nbvec=11*11
plato\nbfas=10*10
plato\vecteurs=AllocateMemory(11*11*SizeOf(vecteur))
*vec.vecteur=plato\vecteurs
For x=-500 To 500 Step 100 : For z=-500 To 500 Step 100
   *vec\x=x : *vec\z=z
   *vec+SizeOf(vecteur)
Next:Next
plato\faces=AllocateMemory(100*SizeOf(face))
*fa.face=plato\faces
For x=0 To 9 : For z=0 To 9
   *fa\v[0]=z+x*11
   *fa\v[1]=*fa\v[0]+1
   *fa\v[2]=*fa\v[1]+11
   *fa\v[3]=*fa\v[0]+11
   *fa\spr=gravier
   *fa+SizeOf(face)
Next:Next

cube\nbvec=8
cube\nbfas=5
cube\vecteurs=AllocateMemory(8*SizeOf(vecteur))
CopyMemory(?cubvec,cube\vecteurs,8*SizeOf(vecteur))
cube\faces=AllocateMemory(5*SizeOf(face))
*fa=cube\faces
For t=0 To 2
   *fa\v[0]=t : *fa\v[1]=t+1
   *fa\v[2]=t+5 : *fa\v[3]=t+4
   *fa\spr=mur
   *fa+SizeOf(face)
Next
*fa\v[0]=3 : *fa\v[1]=0
*fa\v[2]=4 : *fa\v[3]=7
*fa\spr=mur
*fa+SizeOf(face)
For t=0 To 3 : *fa\v[t]=3-t : Next
*fa\spr=lave


_cam\pos\y=-800

_cam\corlarj=#scx/800
_cam\corhtr=#scy/600



InitKeyboard()
InitMouse()
Repeat
   ExamineKeyboard() : ExamineMouse()
   ClearScreen(120,0,180)
   Start3D()
      Sprite3DQuality(1)
      displayobj(@plato)
      displayobj(@cube)
   Stop3D()
;    If KeyboardPushed(#pb_key_down) : _cam\a\x-0.02 :EndIf
;    If KeyboardPushed(#pb_key_up) : _cam\a\x+0.02 :EndIf
;    If KeyboardPushed(#pb_key_left) : _cam\a\y+0.02 :EndIf
;    If KeyboardPushed(#pb_key_right) : _cam\a\y-0.02 :EndIf
   _cam\a\x-MouseDeltaY()*0.003
   _cam\a\y-MouseDeltaX()*0.003
   If _cam\a\x<-#pi/2
      _cam\a\x=-#pi/2
     ElseIf _cam\a\x>#pi/2
      _cam\a\x=#pi/2
   EndIf
   If MouseButton(1) : movcam(8) : EndIf
   If MouseButton(2) : movcam(-8) : EndIf
   If KeyboardPushed(#PB_Key_Left)
      If _cam\a\z>-#pi : _cam\a\z-0.0025 :EndIf
     ElseIf KeyboardPushed(#pb_key_right)
      If _cam\a\z<#pi : _cam\a\z+0.0025 :EndIf
     ElseIf KeyboardPushed(#pb_key_down)
      If _cam\a\z<0.0025
         _cam\a\z+0.0025
        ElseIf _cam\a\z>0.0025
         _cam\a\z-0.0025
        Else
         _cam\a\z=0
      EndIf
   EndIf
   FlipBuffers()
Until KeyboardReleased(#pb_key_escape)



DataSection

cubvec:

Data.f -80,-160,-80
Data.f  80,-160,-80
Data.f  80,-160, 80
Data.f -80,-160, 80

Data.f -80,-00,-80
Data.f  80,-00,-80
Data.f  80,-00, 80
Data.f -80,-00, 80

Publié : dim. 10/oct./2004 14:45
par Aranoth
Je ne comprends pas très bien ce que tu cherches à faire ?
Rendre une scène 3D via des Sprites3D déformés


Filperj:
Ton code ne marche pas, il lui manque quelques structure comme pb_sprite3D
mais le problème c'est qu'il n'y a pas de Z-buffer pour les sprite 3d
Le Z-Buffer c'est le proceder qui calcul les faces à ne pas afficher c'est ca ?
(moi j'ai laissé tomber, je dis ça pour t'encourager Twisted Evil )
J'avais aussi essayé de faire ca à mainte reprises, toujours en échouant, mais j'y reviens toujours :?



En réalité le truc qu'il me faudrait, c'est la formule mathématique pour transformer des coordonnées 3D en coordonnées 2D, je vais jeter un coup d'oeuil sur Mandragor :P


EDIT:
Ca y est je l'ai la formule:

Code : Tout sélectionner

image_x = (distance_focale * x) / (-z)
image_y = (distance_focale * y) / (-z)

Seulement je ne connais pas distance_focale
D'après le site (http://lab.erasme.org/3d/base.html) où j'ai trouvé cà, la distance focale est la distance entre le joueur et son écran ! :o

Image

JJe comprend pas du tout là :)

Publié : dim. 10/oct./2004 21:45
par filperj
Ton code ne marche pas, il lui manque quelques structure comme pb_sprite3D
:oops: Oups, c'est parsque c'était dans mes résidents...
J'ai édité le code, maintenant ça devrai marcher.
Le Z-Buffer c'est le proceder qui calcul les faces à ne pas afficher c'est ca ?
Non, le Z-buffer est un tableau où on stoque la distance de chaque pixel dessiné. Ensuite, avant de dessiner un nouveau pixel, on vérifie qu'il n'y a pas déjà un pixel plus proche de la caméra à cet endroit-là.

Ça évite d'avoir à trier les faces pour dessiner d'abord les plus éloignées, et en général c'est accéléré matériellement par la carte graphique.