OBJ loader UV map fehlerhaft

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

OBJ loader UV map fehlerhaft

Beitrag 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
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: OBJ loader UV map fehlerhaft

Beitrag 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.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Re: OBJ loader UV map fehlerhaft

Beitrag 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.
---
Windows 11 (64 bit)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: OBJ loader UV map fehlerhaft

Beitrag von NicTheQuick »

Blender ist toll. :praise:
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: OBJ loader UV map fehlerhaft

Beitrag 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.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Re: OBJ loader UV map fehlerhaft

Beitrag 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.
---
Windows 11 (64 bit)
computerfreak
Beiträge: 112
Registriert: 23.07.2012 19:19

Re: AW: OBJ loader UV map fehlerhaft

Beitrag 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:
PureBasic: Immer das neueste
Windows 8.1 / AMD FX 6100 / R9280X / 8GB RAM
Macbook Pro 2015 Retina
Dell Inspiron 1720 mit Linux Mint
...Und diverse Kleinstcomputer
Benutzeravatar
nathan7
Beiträge: 26
Registriert: 05.09.2013 19:18

Re: OBJ loader UV map fehlerhaft

Beitrag 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
PureBasic 5.20 Beta 18 LTS
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: OBJ loader UV map fehlerhaft

Beitrag 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.
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: OBJ loader UV map fehlerhaft

Beitrag 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 ?!
Repeat
PureBasic
ForEver
Antworten