Ogre Assimp Viewer

Généralités sur la programmation 3D
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Ogre Assimp Viewer

Message par falsam »

Mon projet Open Space 3D intègre un importateur de mesh au format ogre mesh bien sur, mais aussi les formats Obj, 3DS et dae.

Cet importateur calcul les dimensions du meshs (largeur, hauteur et profondeur) mais malheureusement ça ne fonctionne pas avec certains meshs peut etre un peu complexe. Quoique je me demande si ça vient bien de la complexité du mesh.

J'ai sorti ce code d'Open Space 3D pour l'intégrer dans un autre projet : Ogre Assimp Viewer.

Image

Ce code ne fait que sélectionner des fichiers meshs ainsi qu'une texture associé ou un fichier materiel et affiche le résultat. Je me sert de l’exécutable OgreAssimpConverter disponible sur le forum anglais en cliquant sur ce lien.

Le calcul des dimensions du mesh se trouve dans cette partie du code.

Code : Tout sélectionner

    Mesh = LoadMesh(#PB_Any, FilePart)
        
    ;-Calcul largeur, hauteur et profondeur (Ne fonctionne pas avec certains meshs)
    If IsMesh(Mesh)
      XMin=0
      XMax=0
      Ymin=0
      YMax=0
      ZMin=0
      ZMax=0
      
      ReDim MeshData.PB_MeshVertex(0)
      
      
      For j=0 To SubMeshCount(Mesh)-1
        GetMeshData(Mesh, j, MeshData(), #PB_Mesh_Vertex|#PB_Mesh_Color, 0, MeshVertexCount(Mesh, j)-1)
      
        For i = 0 To ArraySize(MeshData())
          If MeshData(i)\x < XMin
            Xmin = MeshData(i)\x
          EndIf
        
          If MeshData(i)\x > XMax
            XMax = MeshData(i)\x
          EndIf
        
          If MeshData(i)\y < YMin
            Ymin = MeshData(i)\Y
          EndIf
        
          If MeshData(i)\y > YMax
            YMax = MeshData(i)\y
          EndIf
        
          If MeshData(i)\z < ZMin
            Zmin = MeshData(i)\Z
          EndIf
        
          If MeshData(i)\z > ZMax
            ZMax = MeshData(i)\Z
          EndIf  
        Next
      Next
      
      ;Affichage des dimensions du mesh
      Width  = XMax-Xmin
      Height = YMax-Ymin
      Depth  = ZMax-Zmin
      Radius = MeshRadius(Mesh)
:?: je ne comprend pas pourquoi ça fonctionne avec certains meshs est pas avec d'autres.

Vous trouverez aussi le code complet ainsi que tout ce qui est nécessaire au fonctionnement de l'application en cliquant sur le lien suivant :
:arrow: OgreAssimpViewer.zip (20 Mo)

Une fois ce dossier décompressé, vous trouverez :
■ Les exécutables nécessaires à la conversion des meshs vers ogres.
OgreAssimpConverter.exe, OgreMeshUpgrader.exe et OgreMain.dll

■ Le code source et son exécutable qui permet de sélectionner les meshs à convertir.
Ogre Assimp Viewer.pb et Ogre Assimp Viewer.exe

■ Un dossier exemples qui permet de tester l'application.
PureBasic.mesh
uh60.mesh

Dossier Camera (Exemple OBJ)
Dossier Cascade (Script Material)
Dossier Zombie Dog (Exemple DAE)

et surtout
Dossier UH-60(Exemple qui ne fonctionne pas)
Ce dernier dossier contient l'obj qui pose problème au moment du calcul des dimensions. Pourtant si vous cherchez à visualisez le mesh qui sera quand même converti, les dimensions sont bien calculés.

Quelques touches de raccourcis.
Rotation du mesh
Left, Right, Up, Down

Déplacement et zoom de la caméra.
Haut bas : PageUp, PageDown
Zoom: - et +

J'espére que quelqu'un me trouvera une solution :)
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%