Seite 1 von 2

OBJ loader UV map fehlerhaft

Verfasst: 01.09.2013 17:30
von Nero
Hiho,

Ich bin gerade dabei mir einen kleinen obj file loader zu schreiben das funktioniert auch recht gut nur ist die Texture total verzerrt.
Vieleicht kann mir von euch jemand weiterhelfen.

Hier mal der Code der Procedure

Code: Alles auswählen

; Load a model from an *.obj file (wavefront.obj) 
Procedure Model_LoadObjModel(*this.Model_Template, File.s, ObjectName.s = "-1")
  If FileSize(File) = -1 Or FileSize(File) = -2 : ProcedureReturn #False: EndIf
  
  Protected DataStr.s, Token.s
  Protected NewList tmpVertex.XMFLOAT3(), NewList tmpNormals.XMFLOAT3(), NewList tmpUVMap.UVMAP()
  Protected NewList tmpIndexList.s(), ObjectCount.l = 0, objName.s = ""
  Protected FilePath.s = GetPathPart(File), mtlFile.s
  Define *tmpColor.D3DXCOLOR = AllocateMemory(SizeOf(D3DXCOLOR))
  
  Protected FileID.l = ReadFile(#PB_Any, File)
  If FileID
    While Not Eof(FileID)       
      DataStr = ReadString(FileID)
      Token = LCase(StringField(DataStr, 1, " "))      
      
      Select Token
         Case "o"             
            If ObjectName = "" And ObjectCount > 0 : Break : EndIf
            If objName = ObjectName : Break : EndIf
            objName = StringField(DataStr, 2, " ")            
            ObjectCount   + 1 
            ClearList(tmpVertex())
            ClearList(tmpNormals())
            ClearList(tmpUVMap())
            ClearList(tmpIndexList())  
          Case "v"
            AddElement(tmpVertex())
            tmpVertex()\x = ValF(StringField(DataStr, 2, " "))
            tmpVertex()\y = ValF(StringField(DataStr, 3, " "))
            tmpVertex()\z = ValF(StringField(DataStr, 4, " "))
            
          Case "vn"
            AddElement(tmpNormals())
            tmpNormals()\x = ValF(StringField(DataStr, 2, " "))
            tmpNormals()\y = ValF(StringField(DataStr, 3, " "))
            tmpNormals()\z = ValF(StringField(DataStr, 4, " "))  
            
          Case "vt"  
            AddElement(tmpUVMap())
            tmpUVMap()\u = ValF(StringField(DataStr, 2, " "))
            tmpUVMap()\v = ValF(StringField(DataStr, 3, " "))            
            
          Case "mtllib"
            mtlFile = FilePath + StringField(DataStr, 2, " ")
            
          Case "usemtl"
            Protected Material.s = LCase(StringField(DataStr, 2, " "))            
            If FileSize(mtlFile) = -1 Or FileSize(mtlFile) = -2 : ProcedureReturn #False: EndIf            
            Protected mtlFileID.l = ReadFile(#PB_Any, mtlFile)            
            
            If mtlFileID
              Protected mtlStr.s, mtlToken.s, mtlMaterial.s
              While Not Eof(mtlFileID)
                
                mtlStr   = ReadString(mtlFileID)
                mtlToken = LCase(StringField(mtlStr, 1, " ")) 
                
                Select mtlToken
                  Case "newmtl"  
                    If Material = mtlMaterial : Break : EndIf
                    *tmpColor\r = #Null
                    *tmpColor\g = #Null
                    *tmpColor\b = #Null
                    *tmpColor\a = #Null                    
                    mtlMaterial = LCase(StringField(mtlStr, 2, " "))                     
                  Case "kd"                     
                    *tmpColor\r = ValF(StringField(mtlStr, 2, " "))
                    *tmpColor\g = ValF(StringField(mtlStr, 3, " "))
                    *tmpColor\b = ValF(StringField(mtlStr, 4, " "))                   
                    *tmpColor\a = 0.0  
                EndSelect 
                
              Wend
            EndIf
            
          Case "f"  
            Protected vts1.s = LCase(StringField(DataStr, 2, " "))
            Protected vts2.s = LCase(StringField(DataStr, 3, " "))
            Protected vts3.s = LCase(StringField(DataStr, 4, " "))            
            
            AddElement(tmpIndexList())
            tmpIndexList() = vts3
            AddElement(tmpIndexList())
            tmpIndexList() = vts2
            AddElement(tmpIndexList())            
            tmpIndexList() = vts1            
      EndSelect      
    Wend
  EndIf
  
  
  ResetList(tmpVertex())
  While NextElement(tmpVertex())
    *this\Primitive\AddVertex(tmpVertex()\x, tmpVertex()\y, tmpVertex()\z * -1.0)
  Wend
   

  ResetList(tmpIndexList())
  While NextElement(tmpIndexList())
    Index.l       = Val(StringField(tmpIndexList(), 1, "/")) - 1 
    UVIndex.l     = Val(StringField(tmpIndexList(), 2, "/")) - 1
    NormalIndex.l = Val(StringField(tmpIndexList(), 3, "/")) - 1
    
    *this\Primitive\AddIndex(Index)
    *this\Primitive\SetColor(*tmpColor) 
    *this\Primitive\SelectVertex(Index)
    
    If ListSize(tmpUVMap())
      SelectElement(tmpUVMap(), UVIndex)
      *this\Primitive\SetUV(tmpUVMap()\u,  1.0 - tmpUVMap()\v)
    EndIf
    SelectElement(tmpNormals(), NormalIndex)
    *this\Primitive\SetNormal(tmpNormals()\x, tmpNormals()\y, tmpNormals()\z * -1.0)

  Wend  

  ProcedureReturn #True
EndProcedure
Ich hab auch mal das ganze Project in ne zip gepackt und hochgeladen falls es jemand testen will.
http://www.womba.net/SimpleDX11_rev_50_obj_test.zip

Das DX11 SDK muss Installiert sein, die Pfade in der SimpleDX11.pbi angepast werden und das DX11 subsytem muß aktiviert sein.
Zum testen am besten die Lighting_and_Sprite.pb Demo nehmen das ist die an der ich gerade getestet habe.

Vieleicht sieht von euch jemand wo der Fehler liegt ich steh grad bisl aufm schlauch.

Mfg Nero

Re: OBJ loader UV map fehlerhaft

Verfasst: 02.09.2013 13:08
von Nero
Ok hat sich erledigt :lol:
Bin scheinbar nur zu doof in Blender die UVMap koreckt zu exportieren. :coderselixir:
Habs gerade mit nem fertigen obj file probiert und es funktionierte prima.

Re: OBJ loader UV map fehlerhaft

Verfasst: 03.09.2013 17:55
von Makke
Nero hat geschrieben:Ok hat sich erledigt :lol:
Bin scheinbar nur zu doof in Blender die UVMap koreckt zu exportieren. :coderselixir:
Habs gerade mit nem fertigen obj file probiert und es funktionierte prima.
Mach Dir nix draus, Hut ab das Du überhaupt was in Blender zustande bringst. Mich schreckt das Ding total ab.

Re: OBJ loader UV map fehlerhaft

Verfasst: 03.09.2013 17:56
von NicTheQuick
Blender ist toll. :praise:

Re: OBJ loader UV map fehlerhaft

Verfasst: 03.09.2013 19:08
von Chimorin
Blender ist vielleicht toll, aber schreckt z.B. mich als NEuling mit den vielen verschiedenen Englischsprachigen Knoepfen,... ab. Nimm ein Wörterbuch zur Hand, hat man mir mal geraten. Ja, am Ende hab ich nichts hinbekommen und nur die Woerter gesucht.

Re: OBJ loader UV map fehlerhaft

Verfasst: 03.09.2013 23:59
von Makke
NicTheQuick hat geschrieben:Blender ist toll. :praise:
Will ich nicht abstreiten. Ist aber von intuitiver Bedienung so weit entfernt wie die Erde vom Mond.

Re: AW: OBJ loader UV map fehlerhaft

Verfasst: 07.09.2013 14:38
von computerfreak
Makke hat geschrieben: Will ich nicht abstreiten. Ist aber von intuitiver Bedienung so weit entfernt wie die Erde vom Mond.
+1


Bin einfach zu blöd dafür.Aber wenn man sich damit auskennt ist es schon geil.
Auf youtube gibts gute tutorials, auch wenn man anfangs nocht nicht versteht, was man da tut :grin:

Re: OBJ loader UV map fehlerhaft

Verfasst: 07.09.2013 16:27
von nathan7
funktioniert der importer komplett fehlerfrei?
also import auch von mehreren materialien bzw. texturen?
würde ihn gern nutzen statt b3d nach mesh zu konvertieren
obj ist einfach weiter verbreitet

Re: OBJ loader UV map fehlerhaft

Verfasst: 09.09.2013 16:16
von Nero
Ne fehlerfrei ist er nicht! :lol:
Hatte ihn nur für meine testzwecke geschrieben weils einfacher ist die 3D objeckte in nem editor zu erstellen als per hand <)
Aber das Objectformat ist nicht wirklich so umfangreich solltest du eigentlich selber umsetzen können.

Ahso aber bitte drann denken der funktioniert nicht mit OGRE ich lade das direckt in nen PB Screen das geht nicht über die Engine3D befehle.

Re: OBJ loader UV map fehlerhaft

Verfasst: 19.09.2013 18:05
von Darie
woher weiss man eigentlich beim OBJ-Format, welche Texturkoordinaten zu welchen Verticen gehören (falls ein Vertex mehrere UV-Koordinaten hat), die stehen ja
nicht direkt hinter den Vertexes, sondern in einer eigenen Liste ?!