[Résolu] .mesh et script .material

Généralités sur la programmation 3D
Dudule
Messages : 17
Inscription : lun. 04/janv./2016 20:18

[Résolu] .mesh et script .material

Message par Dudule »

Bonjour à tous,
J'ai créé un objet avec 3 textures différentes sous Sketchup, je l'ai exporté en .obj, puis converti en .mesh et .material avec OgreAssimpConverter.
J'ai tenté de charger cet objet dans PB, mais je me heurte à plusieurs difficultés, notamment avec le chemin des différents fichiers.
Au final, mon objet (la maison) est tout noir.
Quelqu'un saurait-il m'expliquer ce que je fais de mal ? Ou plutôt ce que je ne fais pas de bien ?

A noter que pour mon objet velo.mesh :
Si je ne mets pas le chemin relatif vers la texture velo.png, PB ne la trouve pas !
Si je mets le chemin relatif vers l'objet velo.mesh, PB ne le trouve pas !
C'est à en perdre la tête !

Et pour mon objet maison :
le log d'Ogre semble indiquer que 2 des 3 textures sont chargées avec succès. Mais pourtant aucune n'apparaît.
J'ai lu quelque-part qu'il fallait indiquer #PB_Material_None dans createEntity si le .mesh avait un .material associé. C'est vrai ? parce que sinon je ne vois pas comment faire autrement.

Voilà, le code et l'ensemble des fichiers sont dans l'archive ici : http://lecartablededudule.pagesperso-or ... terial.zip

Code : Tout sélectionner

#CameraSpeed = 1

IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"
UsePNGImageDecoder()

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D(#PB_Engine3D_DebugLog)

  Add3DArchive("./Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("./Data/Models", #PB_3DArchive_FileSystem)
  Parse3DScripts()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    AmbientColor(RGB(255, 255, 255)) 
    
    img_velo=LoadImage(#PB_Any,"./Data/Textures/velo.png")
    ;img_velo=LoadImage(#PB_Any,"velo.png")
    texture_velo=CreateTexture(#PB_Any,ImageWidth(img_velo),ImageHeight(img_velo))
    StartDrawing(TextureOutput(texture_velo))
    DrawAlphaImage(ImageID(img_velo),0,0)
    StopDrawing()

    mesh_velo=LoadMesh(#PB_Any, "velo.mesh")
    ;mesh_velo=LoadMesh(#PB_Any, "./Data/Models/velo.mesh")
    material_velo=CreateMaterial(#PB_Any, TextureID(texture_velo))
    MaterialBlendingMode(material_velo, #PB_Material_AlphaBlend)
    entity_velo=CreateEntity(#PB_Any, MeshID(mesh_velo), MaterialID(material_velo))
    MoveEntity(entity_velo,10,0,0)
    
    mesh_maison=LoadMesh(#PB_Any, "maison_1_obj.mesh")
    entity_maison=CreateEntity(#PB_Any, MeshID(mesh_maison),  #PB_Material_None )
           
    CreateCamera(0, 0, 0, 100, 100)  ; Front camera
    MoveCamera(0, 0, 1, 20, #PB_Absolute)
    CameraBackColor(0, RGB(55, 0, 0))
    
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
      
      If ExamineKeyboard()
             
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
                  
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf

      EndIf
      
      RotateEntity(entity_velo, 0, 0.3, 0, #PB_Relative)
      RotateEntity(entity_maison, 0, 0.3, 0, #PB_Relative)
      
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
  
End
Fin du log d'OGRE :
22:25:14: Mesh: Loading maison_1_obj.mesh.
22:25:14: Texture: papier_mouche_1.jpg: Loading 1 faces(PF_R8G8B8,1944x1296x1) with 10 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1944x1296x1.
22:25:15: OGRE EXCEPTION(6:FileNotFoundException): Cannot locate resource papier_ondul__1.jpg in resource group General or any other group. in ResourceGroupManager::openResource at OgreResourceGroupManager.cpp (line 756)
22:25:15: Error loading texture papier_ondul__1.jpg. Texture layer will be blank. Loading the texture failed with the following exception: OGRE EXCEPTION(6:FileNotFoundException): Cannot locate resource papier_ondul__1.jpg in resource group General or any other group. in ResourceGroupManager::openResource at OgreResourceGroupManager.cpp (line 756)
22:25:15: Texture: paperTextureNo4401_preview.jpg: Loading 1 faces(PF_R8G8B8,400x400x1) with 8 generated mipmaps from Image. Internal format is PF_X8R8G8B8,400x400x1.
Merci pour votre aide.
Dernière modification par Dudule le sam. 16/janv./2016 17:06, modifié 1 fois.
Dudule
Messages : 17
Inscription : lun. 04/janv./2016 20:18

Re: .mesh et script .material

Message par Dudule »

J'ai essayé de remplacer les lignes qui s'occupent de l'objet maison par

Code : Tout sélectionner

mesh_maison=LoadMesh(#PB_Any, "maison_1_obj.mesh")
material_maison=GetScriptMaterial(#PB_Any,"maison_1_obj#1")
entity_maison=CreateEntity(#PB_Any, MeshID(mesh_maison), MaterialID(material_maison) )
Parce que ça me semblait étrange de ne pas utiliser la fonction GetScriptMaterial.
Eh bien ça ne marche pas non plus, et le log d'OGRE ne me parle même pas du material maison_1_obj#1. Comme s'il ne s'en occupait pas.
Et d'un autre côté, je ne vois pas comment faire pour le CreateEntity si l'objet a 3 textures différentes.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: .mesh et script .material

Message par djes »

En regardant rapidement, la texture définie dans le fichier maison_1_obj.material (il est éditable, c'est du texte) est "papier_ondul__1.jpg", alors que le fichier joint est "papier_ondul_1.jpg". Il manque un "_" (trait bas).

L'autre problème concerne le vélo, or celui-ci s'affiche bien. Par contre la maison... ?
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: .mesh et script .material

Message par falsam »

Dudule a écrit :Au final, mon objet (la maison) est tout noir.
Certaines faces de ta maison ne sont pas texturés on peut le voir avec le logiciel Meshy

:arrow: Download : http://www.yosoygames.com.ar/wp/ogre-meshy/

Apparemment les textures devaient se trouver initialement dans le même dossier que le mesh de la maison. Mais comme tu as utilisé la fonction Add3DArchive() pour redéfinir l'emplacement des textures, ça n'a aucune importance pour le code que je te propose en tenant compte de la remarque de djes associé à un peu de ménage dans ton dossier data.

Code : Tout sélectionner

Enumeration
  #Mainform
EndEnumeration

Global x.f, y.f, z.f

Declare GameStart(Width, Height)
Declare GameEnd()

GameStart(1024, 768)

Procedure GameStart(Width, Height)
  InitEngine3D() : InitKeyboard() : InitSprite() : InitMouse()
   
  OpenWindow(#Mainform,0, 0, Width, Height, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  BindEvent(#PB_Event_CloseWindow, @GameEnd())
  
  OpenWindowedScreen(WindowID(#Mainform), 0, 0, Width, Height)
  Add3DArchive("./Data/Textures/", #PB_3DArchive_FileSystem)
  Add3DArchive("./Data/Models/", #PB_3DArchive_FileSystem)
  
  Parse3DScripts()
  
  ;Light & Shadow
  AmbientColor(RGB(255, 255, 255))
  CreateLight(#PB_Any,RGB(255, 255, 255), -5, 10, 5)
  
  ;Camera
  CreateCamera(0, 0, 0,100,100)
  CameraBackColor(0, RGB(145, 182, 201))
  MoveCamera(0, 0, 5, 10, #PB_Absolute)  
  CameraLookAt(0, 0,0,0)   
  
  ;Velo (pas de fichier material)
  mesh_velo=LoadMesh(#PB_Any, "velo.mesh")
  texture_velo = LoadTexture(#PB_Any, "velo.png")
  material_velo = CreateMaterial(#PB_Any, TextureID(texture_velo))
  MaterialBlendingMode(material_velo, #PB_Material_AlphaBlend)
  entity_velo = CreateEntity(#PB_Any, MeshID(mesh_velo), MaterialID(material_velo), 1, 0, 4)
  
  ;Maison (Fichier material fourni)
  mesh_maison = LoadMesh(#PB_Any, "maison_1_obj.mesh")
  entity_Maison = CreateEntity(#PB_Any, MeshID(mesh_maison), #PB_Material_None, 0, 0, 0)
  RotateEntity(entity_maison, 0, 30, 0)
  
  Repeat
    Repeat : Until WindowEvent() = 0
    
    FlipBuffers() 
    
    RotateEntity(entity_velo, 0, 0.3, 0, #PB_Relative)
    
    If ExamineKeyboard()
      If KeyboardPushed (#PB_Key_Escape)
        GameEnd()
      EndIf
    EndIf
    
    RenderWorld(40)
     
  ForEver
EndProcedure

Procedure GameEnd()
  End
EndProcedure
Le vélo génère une erreur dans le log, car le chargement du mesh était associé à un fichier matérial du meme nom qui n'existe pas dans ton zip. Toutefois ce n'est pas gênant car la création du material adéquate est dans ton code.



:arrow: Le zip contenant le code et les media sur ce lien
http://falsam.com/download/purebasic/test_material.zip
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%
Dudule
Messages : 17
Inscription : lun. 04/janv./2016 20:18

Re: .mesh et script .material

Message par Dudule »

Alors, pour le velo.mesh, j'avais bien vu que l'erreur venait du fait que je n'utilisait pas les texture du material d'origine, aussi cela ne m'inquiétait pas.
Pour l'erreur dans le nom de fichier "papier_ondul__1.jpg", bon, ok, là j'ai l'air d'une belle nouille :oops: . Passons...
Par contre, pour la maison, je ne comprends toujours pas où était mon erreur.
Ton code fonctionne bien chez moi, et effectivement il y a des faces qui ne sont pas texturées. Pourtant elle le sont sur Sketchup. Ça doit venir du fait que Sketchup considère les "double-face" alors qu'OGRE ne le fait pas (j'ai raison sur ce point ?). Ça devrait donc s'arranger en retournant ces face sur Sketchup (à voir).
Par contre, quand je compare nos deux codes, je ne vois pas la différence dans la création de l'entity (si ce n'est la position x,y,z de la texture, mais même en rajoutant 0,0,0 dans mon code ça ne fonctionne pas.

Mon code

Code : Tout sélectionner

Add3DArchive("./Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive("./Data/Models", #PB_3DArchive_FileSystem)
Parse3DScripts()
[...]
mesh_maison=LoadMesh(#PB_Any, "maison_1_obj.mesh")
entity_maison=CreateEntity(#PB_Any, MeshID(mesh_maison),#PB_Material_None,0,0,0)
Ton code

Code : Tout sélectionner

Add3DArchive("./Data/Textures/", #PB_3DArchive_FileSystem)
Add3DArchive("./Data/Models/", #PB_3DArchive_FileSystem)
Parse3DScripts()
[...]
mesh_maison = LoadMesh(#PB_Any, "maison_1_obj.mesh")
entity_Maison = CreateEntity(#PB_Any, MeshID(mesh_maison), #PB_Material_None, 0, 0, 0)
L'erreur semblerait donc venir de l'accès aux textures, et pourtant OGRE les charge correctement d'après son log.
Alors vraiment je ne comprends pas où je fais faux. Je vais tout reprendre depuis le début (en faisant attention aux noms de fichiers cette fois :? ).
Je vous tiens au courant.

Merci. :)

PS : je trouve tout de même étrange que dans mon LoadImage(), il veuille un chemin relatif complet, alors qu'il n'y en a pas besoin dans LoadMesh(), ni LoadTexture(). Vous avez une explication à ça ? (en fait, j'ai utilisé un LoadImage() parce que je souhaiterai manipuler l'image avant d'en faire une texture, la retourner par exemple, mais c'est pour plus tard.)

PPS : OgreMeshy ne fonctionne pas chez moi (W7 x64). J'ai une "Caught unhandled unknown exception" pour la v1.6 x32, et pour la v1.5 x32 la fenêtre de départ (configuration) se ferme et puis plus rien. Je vais creuser ça aussi (ça en fait des problèmes). Ça marche en ligne de commande où il y a une interface ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: .mesh et script .material

Message par djes »

Pour les différences des chemins de fichiers, ça s'explique par le fait que pb utilise ogre pour le moteur 3d, tandis que la fonction loadimage() est une commande interne. Tout ce qui touche au moteur 3D est légèrement différent.
Dudule
Messages : 17
Inscription : lun. 04/janv./2016 20:18

Re: .mesh et script .material

Message par Dudule »

Ok, j'ai tout repris et ça fonctionne. C'est donc une mauvaise manipulation de ma part :oops: encore !
Par contre, je remarque que dans le fichier maison_1_obj.material, OgraAssimpConverter me crée les matériaux maison_1_obj#1, maison_1_obj#2, maison_1_obj#3,... en plusieurs exemplaires, toujours les mêmes. J'ai essayé de faire le ménage pour n'en garder qu'un seul de chaque type, eh bien ça marche. Vous me confirmer qu'il est inutile de tout garder ?

En tout cas merci, j'ai réalisé mon premier modèle 3D texturé ! :D
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: .mesh et script .material

Message par djes »

Peut-être que ton modèle original a plusieurs surfaces/matériaux/textures
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: .mesh et script .material

Message par comtois »

Dudule a écrit :J'ai essayé de faire le ménage pour n'en garder qu'un seul de chaque type, eh bien ça marche. Vous me confirmer qu'il est inutile de tout garder ?
oui je te le confirme, le nom doit être unique.

Extrait de la doc
Another important factor is that material names must be unique throughout ALL scripts loaded by the system, since materials are always identified by name.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Dudule
Messages : 17
Inscription : lun. 04/janv./2016 20:18

Re: .mesh et script .material

Message par Dudule »

Bonjour, merci pour votre aide.
Maintenant je me heurte à un nouveau problème : des textures avec une couche alphas chargées à l'aide d'un script material.
Bon, si on laisse tout comme OgreAssimpConverter le propose, la couche Alpha n'est pas prise en compte. Il n'y a apparemment pas moyen d'utiliser la fonction MaterialBlendingMode() parce qu'on n'a pas accès à l'objet material vu qu'il est chargé à l'aide du script.
Je pensais donc qu'il fallait traiter ça directement dans le script. Oui mais comment ? Je ne vous cache pas que l'aide d'OGRE est assez imbitable. j'ai tenté avec le paramètre 'scene_blend alpha_blend', mais le résultat n'est pas celui désiré (ça cache des choses à l'arrière plan).

Code : Tout sélectionner

material arbre_1_obj#3
{
   technique
   {
      pass
      {
         ambient 0 0 0 1
         diffuse 0.380392 0.556863 0.392157 1
         specular 0.33 0.33 0.33 1
	 scene_blend alpha_blend
	
        texture_unit
	{
	   texture arbre_1.png
        }
      }
   }
}
Quelqu'un a-t-il déjà résolu ce problème avant moi ?

L'archive est ici, et c'est pour la matière arbre_1_obj#3 correspondant à la texture arbre_1.png
http://lecartablededudule.pagesperso-or ... /test3.zip

Je suis vraiment désolé de prendre votre temps ainsi. Pourtant faut pas croire, je cherche avant...
Dudule
Messages : 17
Inscription : lun. 04/janv./2016 20:18

Re: .mesh et script .material

Message par Dudule »

Ok, je vais créer un nouveau sujet avec ce problème, car je viens de passer des heures à le résoudre, mais je ne comprends pas où est l'erreur.
Répondre