Page 1 sur 1

La 3D est ici !

Publié : mar. 23/août/2005 17:47
par kelly
Bon, pour executer mon code, vous aurez besoin du lapin ci dessous :
http://w404.free.fr/lapin.jpg
Mettez le sur C:/ (sinon, il ne sera pas lu)

Voici mon code et quelques remarques juste en dessous :

Code : Tout sélectionner

If InitEngine3D() And InitSprite() And InitKeyboard() 
OpenScreen(1024,768,32,"")     ;Ouvre un ecran de 800x600x32 dont le nom est ""

    CreateMesh(0) 
    SetMeshData(0, #PB_Mesh_Vertices , ?CubeVertices          , 4) 
    SetMeshData(0, #PB_Mesh_Triangles , ?CubeFacesIndexes      , 4) 
    SetMeshData(0, #PB_Mesh_UVCoordinates, ?CubeTextureCoordinates, 4) 
    CreateMesh(1)
    SetMeshData(1, #PB_Mesh_Vertices , ?CubeVertices2         , 4) 
    SetMeshData(1, #PB_Mesh_Triangles , ?CubeFacesIndexes      , 4) 
    SetMeshData(1, #PB_Mesh_UVCoordinates, ?CubeTextureCoordinates2, 4) 

    LoadTexture(0, "c:\lapin.jpg") 
    CreateEntity(0, MeshID(0), CreateMaterial(0, TextureID(0))) 
    CreateEntity(1, MeshID(1), CreateMaterial(0, TextureID(0))) 

    CreateCamera(0, 0, 0, 100, 100) 
    CameraLocate(0,0,0,7)
    
    Repeat 
      ExamineKeyboard() 
      RotateEntity(0, 1.38,0.7, 0.5)
      RotateEntity(1, 1.38,0.7, 0.5)
      RenderWorld() 
      FlipBuffers() 
    Until KeyboardPushed(#PB_Key_Escape) Or Quit 
Else 
  MessageRequester("Error", "Cant init DirectX 3D Engine",0) 
EndIf 
  
End 
DataSection 
  CubeVertices: ; coordonnées des 4 points du carré
    Data.f -1,-1,-0.2
    Data.f 1, -1,-0.2
    Data.f 1, 1, -0.2
    Data.f -1, 1, -0.2
  CubeVertices2:
    Data.f -1,-1,0.2
    Data.f 1,-1,0.2
    Data.f 1,1,0.2
    Data.f -1,1,0.2
  CubeFacesIndexes: 
    Data.w 0,1,2
    Data.w 0,2,3
    Data.w 0,3,2
    Data.w 0,2,1
  CubeTextureCoordinates: 
    Data.f 0.0, 0.0
    Data.f 1.0, 0.0 
    Data.f 1.0, 1.0
    Data.f 0.0, 1.0
  CubeTextureCoordinates2: 
    Data.f 0.0, 0.0
    Data.f 2.0, 0.0
    Data.f 2.0, 2.0
    Data.f 0.0, 2.0
EndDataSection 
Je me pose plusieurs questions :
1> pourquoi tout d'abord le lapin est devenu un peu foncé ?
2> j'ai essayé de creer une lumiere mais ca n'a pas marché. Comment faire ?
3> les 2 objets 3D sont independants. Comment les lier ?
4> j'ai essayé de compiler le code. Et bien, l'EXE me dit qu'il ne peux pas initialiser la 3D engine !!!! PKOI ????????

Bon bin, j'attend vos reactions :wink:

Publié : mar. 23/août/2005 18:19
par Backup
chez moi ça marche bien !

pour l'erreur 3D , je crois qu'il faut que la DDll " Engine3D.dll "
qui se situe dans le dossier Compiller du purebasic , soit presente dans le dossier ou tu vas compiller ton prg !
essaye en faisant une copie ! :D

pour la couleur , je supose que comme on est dans un espace 3D
il y a une dispersion des lumiere ! :? 8O

Comtois ? ....

Publié : mar. 23/août/2005 18:25
par Dr. Dri
HS
c'est pas un lapin c'est un chat... il s'apelle garfield

Dri :jesors:

Publié : mar. 23/août/2005 20:14
par Guimauve
Pour la texture si tu veux la mettre n'importe où enlève le c:\ et place le code soucre et la texture dans le même répertoire.

Pour modifier l'affichage des couleurs il faut jouer avec :

MaterialDiffuseColor(#Matiere, Color)
MaterialSpecularColor(#Matiere, Color)
MaterialAmbientColor(#Matiere, Color)


Il y a aussi cette commande qui peut changer les couleurs des textures :

LightColor(#Lumiere, Couleur)

Pour joindre 2 meshs ensemble la nouvelle version de OGRE le supporte mais reste à savoir si Fred va conserver cette possibilité. Et je l'espère car je vais en avoir de besoin. Dans le cas contraire ça sera toujours possible de le programmer mais c'est énorme à mettre en oeuvre.

A+
Guimauve

Publié : mar. 23/août/2005 22:58
par kelly
Aucune lumiere ne fonctionne. J'entend par lumiere une lumiere comme une ampoule electrique qui eclairerait la scene. Par contre, je peux colorer la texture mais ce n'est pas pareil a une lumiere.
Autre chose : la rotation et le scroll de texture sacade !! Bug ou pas ?

Code : Tout sélectionner

If InitEngine3D() And InitSprite() And InitKeyboard() 
OpenScreen(1024,768,32,"")     ;Ouvre un ecran de 800x600x32 dont le nom est ""

    CreateMesh(0) 
    SetMeshData(0, #PB_Mesh_Vertices , ?CubeVertices          , 4) 
    SetMeshData(0, #PB_Mesh_Triangles , ?CubeFacesIndexes      , 4) 
    SetMeshData(0, #PB_Mesh_UVCoordinates, ?CubeTextureCoordinates, 4) 
    CreateMesh(1)
    SetMeshData(1, #PB_Mesh_Vertices , ?CubeVertices2         , 4) 
    SetMeshData(1, #PB_Mesh_Triangles , ?CubeFacesIndexes      , 4) 
    SetMeshData(1, #PB_Mesh_UVCoordinates, ?CubeTextureCoordinates2, 4) 

    LoadTexture(0, "c:\lapin.jpg") 
    CreateEntity(0, MeshID(0), CreateMaterial(0, TextureID(0))) 
    CreateEntity(1, MeshID(1), CreateMaterial(0, TextureID(0))) 

    CreateCamera(0, 0, 0, 100, 100) 
    CameraLocate(0,0,0,7)
MaterialDiffuseColor(0,RGB(200,140,50))
MaterialBlendingMode(0,1)
MaterialSpecularColor(0,RGB(255,0,0))
RotateMaterial(0,0.05,1)
ScrollMaterial(0, 0.5, 0.5, 1) 

CreateLight(1, RGB(255,150,255)) 
LightColor(1, RGB(255,0,0)) 
LightSpecularColor(1, RGB(255,0,0)) 
    Repeat 
      ExamineKeyboard() 
      ClearScreen (0,0,0)
      RotateEntity(0, 1.38,0.7, 0.5)
      RotateEntity(1, 1.38,0.7, 0.5)
      RenderWorld() 
      FlipBuffers() 
    Until KeyboardPushed(#PB_Key_Escape) Or Quit 
Else 
  MessageRequester("Error", "Cant init DirectX 3D Engine",0) 
EndIf 
  
End 
DataSection 
  CubeVertices: ; coordonnées des 4 points du carré
    Data.f -1,-1,-0.2
    Data.f 1, -1,-0.2
    Data.f 1, 1, -0.2
    Data.f -1, 1, -0.2
  CubeVertices2:
    Data.f -1,-1,0.2
    Data.f 1,-1,0.2
    Data.f 1,1,0.2
    Data.f -1,1,0.2
  CubeFacesIndexes: 
    Data.w 0,1,2
    Data.w 0,2,3
    Data.w 0,3,2
    Data.w 0,2,1
  CubeTextureCoordinates: 
    Data.f 0.0, 0.0
    Data.f 1.0, 0.0 
    Data.f 1.0, 1.0
    Data.f 0.0, 1.0
  CubeTextureCoordinates2: 
    Data.f 0.0, 0.0
    Data.f 2.0, 0.0
    Data.f 2.0, 2.0
    Data.f 0.0, 2.0
EndDataSection 

Publié : mar. 23/août/2005 23:24
par Guimauve
C'est moi ou tu n'a pas localisé la lumière quelque part dans le monde 3D.

Voir la commande : LightLocate(#Lumiere, x, y, z)

A+
Guimauve

Publié : mer. 24/août/2005 3:13
par kelly
oui je sais, ta commande n'est pas dans mon code mais j'ai tout essayé. Essaye d'insérer ta commande. Moi j'ai essayé et je ne vois AUCUNE lumiere...

Publié : mer. 24/août/2005 4:36
par Guimauve
Si je ne me trompe pas, il faut calculer les normales des triangles pour que la lumière soit visible. Le moteur 3D utilise ce vecteur calculer l'effet de lumière.

Donc pas de normales, pas de lumière.

A+
Guimauve

Publié : mer. 24/août/2005 14:38
par kelly
peut tu donner le code ?

Publié : jeu. 25/août/2005 13:27
par kelly
C'est soit disant facile mais personne ne peux donner un code ?
peut etre que la "lumiere" dans de la 3D eclaire uniquement le decors et pas les objets !! Je ne vois que ca...

Publié : jeu. 25/août/2005 13:29
par Dr. Dri
pour les calculs de normales il faut regarder les codes sources de comtois mais la structure des mesh a changé dans la dernière bêta d'OGRE alors ses routines sont devenues obsolètes...

Dri

Publié : ven. 26/août/2005 17:53
par comtois
ton lapin est sombre parce que tu n'as précisé la lumière ambiante

Code : Tout sélectionner

AmbientColor(RGB(255,255,255))
Par contre si tu veux voir l'effet des lumières , il vaut mieux baisser la lumière ambiante , par exemple

Code : Tout sélectionner

AmbientColor(RGB(95,95,95))
Et ensuite , il faut effectivement ajouter les normales à ton mesh(les lumières sont calculées en fonction des normales des objets 3D).
le tien est simple , pas besoin de calcul , c'est un vecteur perpendiculaire au plan , comme tu utilise le plan XY , la normale sera sur l'axe Z.
Tu ajoutes ça à ton code , et tu verras la lumière rouge.

Code : Tout sélectionner

 SetMeshData(0, #PB_Mesh_Normals, ?CubeNormale, 4)
     
    CubeNormale:
    Data.f 0,0,1
    Data.f 0,0,1
    Data.f 0,0,1
    Data.f 0,0,1

Publié : dim. 02/oct./2005 14:41
par kelly
Je me demande où se trouve la zone exacte qui me permettrait de changer en memoire l'apparence de la texture du chat.

Ca doit etre un truc comme ca :

Code : Tout sélectionner

For i=0 To 76
PokeB(@TextureID(0)+i,0)
Next
Mais bon...
OU ALORS, je serais interessée par un GrabMaterial. Mais est ce possible !!
Egalement, on ne peux pas appliquer un sprite sur une texture. Quel dommage !!!

Code : Tout sélectionner

      OutputID=TextureOutput(0)
      StartDrawing(OutputID)
      DisplaySprite(0,0,0)
      StopDrawing()
Dites m'en + + + :evil:

Publié : dim. 02/oct./2005 16:19
par fweil
Pour appliquer une image sur une texture. Il suffit donc de recopier le sprite dans une image et ensuite de transposer l'image dans la texture. Je sais que c'est indirect, mais ça fonctionne très bien.