Un plugin 3ds pour la 3D

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Un plugin 3ds pour la 3D

Message par pat »

Bonjour,

En cette nouvelle année 2012, je vous fais part d'un de mes souhaits.
PB est bien fourni en fonction 3D et je trouve dommage de ne pas pouvoir facilement l'exploiter.
Il y a bien la page Internet d'Ogre Exporter pour convertir des fichiers 3D en .mesh mais je trouve ça bien compliqué et je n'ai pas réussi à ce jour à faire ce genre de conversion.
Le format .3ds était fourni avec presque tous les modeleurs, dommage que PB ne fonctionne que sous .mesh pour la 3D et qu'il n'y ait pas de plugin en .3ds.
J'ai bien essayé avec Blender avec Blender Exporter et cela ne fonctionne pas sous la version Blender 2.58 release.
J'ai décidément bien du mal à pouvoir m'initier en 3d.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Un plugin 3ds pour la 3D

Message par Cool Dji »

Salut Pat,

J'étais comme toi, j'avais du mal avec les export mesh de Blender.
J'utilise Deled, il a un export mesh hyper simple à utiliser et qui passe nickel avec Pb.
Only PureBasic makes it possible
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Un plugin 3ds pour la 3D

Message par G-Rom »

Ogre ne supporte que du .mesh, pas d'alternative possible, si tu as un soucis d'exportation, pose ton pb sur le forum.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Un plugin 3ds pour la 3D

Message par Guimauve »

Dans le pire des cas il est toujours possible de lire le fichier 3ds manuellement puis reconstruire le mesh à l'aide des commandes disponibles.
AddMeshVertex(x, y, z), MeshVertexNormal(x, y, z), MeshVertexTextureCoordinate(u, v) et cie. Moi je fais un truc similaire avec un ficher
WaveFrontObject (*.obj) pour l'éditeur 3D sur lequel je travaille en ce moment. Quelques listes chaînées structurées, quelques petits correctifs
au niveau des indices et l'affaire est ketchup.

A+
Guimauve
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Un plugin 3ds pour la 3D

Message par Cool Dji »

Salut Guimauve,

Un code qui lit les .obj => ça m'intéresse pour au moins récupérer les coordonnées du mesh pour :
- calculer le bounds
- permettre la fonction magnetisme entre Entity dans mon éditeur de niveau
Only PureBasic makes it possible
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Un plugin 3ds pour la 3D

Message par Guimauve »

Bonjour CoolDji,

Le code que j'ai fait récupère les vertex, les normales, les coordonnées UV, les indices et même les informations à propos des matériaux (texture, paramètres lumière spéculaire, diffuse, etc.).
Seulement, je ne l'ai pas testé sur les fichiers wavefront autres que ceux générés par Rhinoceros 3D. Il ne faut pas oublié que j'ai configuré le code pour qu'il génère des sous-mesh et un non
une mesh avec tout les éléments dans un seul bloc.

Pour ce qui est du code lui-même et bien il fait environ 900 lignes uniquement pour le système Mesh/Sous-Mesh. Je ne compte pas les éléments tel que les structures Vector3, Vector2, Indice3,
Texture qui sont également nécessaire. Je vais faire une version écourté avec le stricte minimum pour que ça fonctionne et je donne le lien vers une archive compressé dès que c'est opérationnel.

Finalement, le passage entre la Mesh WaveFrontObject et les commandes 3D de PureBasic ne sera pas implémenté. Mais là, avec les informations correctes en mémoire la tâche sera facile.
Les doigts dans le nez comme ont dit !

A+
Guimauve
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Un plugin 3ds pour la 3D

Message par Cool Dji »

Bonjour Guimauve,

Merci, c'est un gros boulot que tu as fait !
Only PureBasic makes it possible
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Un plugin 3ds pour la 3D

Message par Guimauve »

Bonjour à tous,

Pour le chargement d'un fichier WaveFrontObject c'est par ici : Parse WaveFrontObject Mesh

A+
Guimauve
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Un plugin 3ds pour la 3D

Message par pat »

Merci à tous pour vos réponses.
Je vais voir avec Deled pour l'exportation, sait-on jamais.
J'ai l'impression que mon voeu restera pieux et il restera les alternatives de Guimauve.
Mais cela reste quand même une affaire de spécialiste, et je suis un néophyte pour la 3D, et je ne suis pas capable de grand chose dans le domaine actuellement.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Un plugin 3ds pour la 3D

Message par G-Rom »

Ogre a deja des exporteurs pour les différents modeleurs 3D, il serait stupide je pense de perdre du temps a coder le support d'autres formats.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Un plugin 3ds pour la 3D

Message par Cool Dji »

Salut G-rom,

Je n'ai pas de problèmes pour ouvrir des mesh avec Pb, l'export de Deled marche très bien. En revanche, j'ai besoin de pouvoir disposer des coordonnées des points composant une entity pour :
- magnétisme pour coller les entitys dans un éditeur 3d
- gestion personnelle des collisions et pouvoir détecter précisément la zone d'impact

et ce, je n'ai pas trouvé d'autres moyens de refaire une fonction loadmesh qui me stock les coordonnées quelque part.

Donc, soit je modifie le code de Guimauve pour lire un .obj, soit je charge un mesh ogre en .xml.

Edit : Juste pour récupérer les coordonnées + normale + pos texture, un petit code qui lit un xml (export ogre sous Deled)
J'ai testé avec des meshs multiples, ça a l'air de fonctionner mais faudrait que je sécurise par rapport à la longueur des chaines de caractères qui pourraient varier selon les versions...

Code : Tout sélectionner

Global Dim posguillement.i(6)

; ChargeXML
OpenFile(0,"Data/multiple.xml")

Repeat
  TexteFile$=ReadString(0)

  ;Charge un objet
  If Mid(TexteFile$,1,19)="      <faces count="
 
   nbfaces.i = Val(Mid(TexteFile$,21, Len(TexteFile$)-20)) 
   
    For j=1 To nbfaces
       TexteFile$=ReadString(0)
       ; cherche la position de tous les "
       i=1
       For k=1 To Len(TexteFile$)
         If Mid(TexteFile$,k,1)=Chr(34)
           posguillement(i)=k
           i=i+1
         EndIf
        Next  
       Debug Mid(TexteFile$,posguillement(1)+1,posguillement(2)-posguillement(1)-1)   ; V1
       Debug Mid(TexteFile$,posguillement(3)+1,posguillement(4)-posguillement(3)-1)   ; V2
       Debug Mid(TexteFile$,posguillement(5)+1,posguillement(6)-posguillement(5)-1)   ; V3
       
      Next
      ReadString(0)
      TexteFile$=ReadString(0)

nbvertex.i = Val(Mid(TexteFile$,30,Len(TexteFile$)-31)) 

ReadString(0)

 For j=1 To nbvertex
      ReadString(0)
      TexteFile$=ReadString(0)
       ; cherche la position de tous les "
       i=1
       For k=1 To Len(TexteFile$)
         If Mid(TexteFile$,k,1)=Chr(34)
           posguillement(i)=k
           i=i+1
         EndIf
        Next  
       Debug Mid(TexteFile$,posguillement(1)+1,posguillement(2)-posguillement(1)-1)   ; Position X   
       Debug Mid(TexteFile$,posguillement(3)+1,posguillement(4)-posguillement(3)-1)   ; Position Y      
       Debug Mid(TexteFile$,posguillement(5)+1,posguillement(6)-posguillement(5)-1)   ; Position Z     
 
      TexteFile$=ReadString(0)
       ; cherche la position de tous les " chr(34)
       i=1
       For k=1 To Len(TexteFile$)
         If Mid(TexteFile$,k,1)=Chr(34)
           posguillement(i)=k
           i=i+1
         EndIf
        Next  
       Debug Mid(TexteFile$,posguillement(1)+1,posguillement(2)-posguillement(1)-1)   ; Normale X      
       Debug Mid(TexteFile$,posguillement(3)+1,posguillement(4)-posguillement(3)-1)   ; Normale Y   
       Debug Mid(TexteFile$,posguillement(5)+1,posguillement(6)-posguillement(5)-1)   ; Normale Z 

      TexteFile$=ReadString(0)
       ; cherche la position de tous les "
       i=1
       For k=1 To Len(TexteFile$)
         If Mid(TexteFile$,k,1)=Chr(34)
           posguillement(i)=k
           i=i+1
         EndIf
        Next  
       Debug Mid(TexteFile$,posguillement(1)+1,posguillement(2)-posguillement(1)-1)    ; texture coordonnée U   
       Debug Mid(TexteFile$,posguillement(3)+1,posguillement(4)-posguillement(3)-1)    ; texture coordonnée V   
      ReadString(0)

      Next

EndIf
    
Until Eof(0)
Voilà
Only PureBasic makes it possible
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Un plugin 3ds pour la 3D

Message par G-Rom »

En revanche, j'ai besoin de pouvoir disposer des coordonnées des points composant une entity
Salut cool Dji , je prend note , ne m'étant pas occupé des meshs , je vais voir ce que je peut faire.
le top serais de pouvoir récupérer via une entité , le ou les mesh par les noms aussi ( un mesh porte un nom )

par exemple pour une pièce moteur :

[mon entitée]
... [mesh "piston"]
... [mesh "bièle"]
... [mesh "soupape"]
etc...

avec une fonction du genre : getMeshByName(EntityID , name$) , puis d'autres pour parcourir les vertices du mesh , ca devrais faire l'affaire.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Un plugin 3ds pour la 3D

Message par Cool Dji »

Oui effectivement, un peu dans le genre...ce serait à la limite du merveilleux :D

Avec la possibilité de partir de l'Entity pour accéder aux coordonnées des points car on bénéficiera des modifications éventuelles issues d'un scale ou un rotate.
Alors que les coordonnées des points du mesh devront être recalculées à chaque scale ou rotate...pour correspondre à celles des points de l'Entity.

En fait, idéalement et selon les besoins, il faudrait pouvoir accéder aux coordonnées des points du mesh et aux coordonnées des points de l'Entity après transformation (scale, rotate).

Je pense que tout existe, il "suffirait" d'ouvrir la boite avec un peu de yaquafautquon :mrgreen:
Only PureBasic makes it possible
Répondre