Mesh speichern laden Problem

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

StarGazer

Betreff: Mesh speichern laden Problem

BeitragSo, Apr 25, 2004 13:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Zum Mesh laden und speichern habe ich den Code von Shadowturtles Homepage verwendet.

Speichern
http://www.shadowturtle.de/sit...hSpeichern

Laden
http://www.shadowturtle.de/sit...n&adm=

Wenn ich jedoch das gepeicherte Mesh herreinlade, ist es nicht zu sehen,
selbst dann nicht, wenn ich es nicht als ÜbergabeFuntkion mache.
Weis jemand wieso ?
 

lettorTrepuS

BeitragSo, Apr 25, 2004 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

StarGazer

BeitragSo, Apr 25, 2004 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Graphics3D 640,480,16
SetBuffer BackBuffer()

Global camera=CreateCamera()
Global light=CreateLight()

Dim Model(10)
Model(1) = LoadMesh("MESH.X")
PositionEntity Model(1), 100,0,200

;--------------------------------------------------------
FileOut$ = WriteFile("Test.dat")
   SaveMeshInFile ( FileOut$, Model(1) )
CloseFile FileOut$

FileIn = ReadFile("Test.dat")
   Model(2) = ( LoadMeshFromFile( FileIn ) )   
   ;Model(2) = CopyMesh( LoadMeshFromFile( FileIn ) )
CloseFile(FileIn)
;--------------------------------------------------------

EntityColor Model(2) ,255,0,0
PositionEntity Model(2), -100,0,200


;************************************************************

Function SaveMeshInFile( Stream , Mesh )

WriteLine Stream,CountSurfaces(Mesh)
For S = 1 To CountSurfaces(Mesh)
   Surface = GetSurface(Mesh,S)
   WriteFloat Stream,CountVertices(Surface)
   For V = 0 To CountVertices(Surface) - 1
      WriteFloat Stream,VertexX#(Surface,V)
      WriteFloat Stream,VertexY#(Surface,V)
      WriteFloat Stream,VertexZ#(Surface,V)
      WriteFloat Stream,VertexU#(Surface,V, 0)
      WriteFloat Stream,VertexV#(Surface,V, 0)
      WriteFloat Stream,VertexW#(Surface,V, 0)
      WriteFloat Stream,VertexU#(Surface,V, 1)
      WriteFloat Stream,VertexV#(Surface,V, 1)
      WriteFloat Stream,VertexW#(Surface,V, 1)
      WriteFloat Stream,VertexNX#(Surface,V)
      WriteFloat Stream,VertexNY#(Surface,V)
      WriteFloat Stream,VertexNZ#(Surface,V)
   Next
   WriteLine Stream,CountTriangles(Surface)
   For T = 0 To CountTriangles(Surface) - 1
      WriteFloat Stream,TriangleVertex(Surface,T,0)
      WriteFloat Stream,TriangleVertex(Surface,T,1)
      WriteFloat Stream,TriangleVertex(Surface,T,2)
   Next
Next

End Function
;************************************************************

Function LoadMeshFromFile( Stream )

Local Mesh,SCount,VCount,TCount,S,VNX#,VNY#,VNZ#
Local Surface,V1,T,X#,Y#,Z#,tU1#,tV1#,tW1#,tU2#,tV2#,tW2#,VT0,VT1,VT2

Mesh = CreateMesh()
SCount = ReadLine(Stream)
For S = 1 To SCount
   Surface = CreateSurface(Mesh)
   VCount = ReadFloat(Stream)
   For V1 = 0 To VCount - 1
      X# = ReadFloat(Stream)
      Y# = ReadFloat(Stream)
      Z# = ReadFloat(Stream)
      tU1# = ReadFloat(Stream)
      tV1# = ReadFloat(Stream)
      tW1# = ReadFloat(Stream)
      tU2# = ReadFloat(Stream)
      tV2# = ReadFloat(Stream)
      tW2# = ReadFloat(Stream)
      VNX# = ReadFloat(Stream)
      VNY# = ReadFloat(Stream)
      VNZ# = ReadFloat(Stream)
      AddVertex Surface,X#,Y#,Z#,tU1#,tV1#,tW1#
      VertexNormal Surface,V1,VNX#,VNY#,VNZ#
      
      VertexTexCoords Surface, V1, tU1#, tV1#, tW1#, 0
      VertexTexCoords Surface, V1, tU2#, tV2#, tW2#, 1
   Next
   TCount = ReadFloat(Stream)
   For T = 0 To TCount - 1
      VT0 = ReadFloat(Stream)
      VT1 = ReadFloat(Stream)
      VT2 = ReadFloat(Stream)
      AddTriangle Surface,VT0,VT1,VT2
   Next
Next

UpdateNormals Mesh

Return Mesh
      
End Function
;************************************************************


While Not KeyDown(1)

   If KeyDown(203) Then ; LEFT
      MoveEntity camera,-4,0,0
   EndIf
   If KeyDown(205) Then ;RIGHT
      MoveEntity camera,4,0,0
   EndIf

   If KeyDown(200) Then ; UP
      MoveEntity camera,0,0,4
   EndIf
   If KeyDown(208) Then ; DOWN
      MoveEntity camera,0,0,-4
   EndIf
   
   UpdateWorld
   RenderWorld
      
   Flip
Wend
End



Ein geladenes Mesh wird zuerst abgespeichert, dann das gespeicherte geladen und ein Mesh daraus kreiert.
Aber leider funktioniert es nicht, ich mache wohl etwas falsch.
"ZU Erkennung, das kreierte Mesh sollte rot sein"
 

lettorTrepuS

BeitragSo, Apr 25, 2004 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

StarGazer

BeitragSo, Apr 25, 2004 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Danke erstmal für diese ausführliche Erklärung, werde es noch ihn den Code miteinbinden.
Jedoch lieg es leider nicht an den Vertexfarben.
Die Entfernung 200 ist auch nicht zu weit, man kann die Meshes noch sehen.
Habe natürlich vorher es ausprobiert, ob die Mehes zu sehen sind, sonst würde diese Frage ja sehr peinlich werden Smile

Probiere es einfach mal aus, füge den Code ins BB3D, ersätze nur
Model(1) = LoadMesh("MESH.X") den File-Namen.

Das geladene kreierte Mesh kann man nicht sehen,
aber das Orginal schon "Model(1) = LoadMesh("MESH.X")"

Vielleicht rufe ich die Funktion einfach nur falsch auf oder so, ich weis es leider nicht.
Hoffe Du kannst mir helfen
 

lettorTrepuS

BeitragSo, Apr 25, 2004 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

StarGazer

BeitragSo, Apr 25, 2004 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
LOL
so kommen wir nicht zum Ziel Very Happy
Es liegt wirklich nicht an den Vertexfarben.
Ich benötige auch keine Vertexfarben, sie vergrößern nur unötig das File.
(Wer weis, in Zuckunft, vielleicht brauche ich sie da schon, jetzt aber noch nicht).

Ich habe jetzt sogar einen Backround erstellt, ist hellgrün, und auch sichbar, und durch das "EntityColor Model(2) ,255,0,0" was auch schon im Code vorhanden war, werden doch alle Vertexfarben auf rot gesetzt, und auch wenn es einen schwarzen Hindergrund geben sollte, müßte man das Objekt trotzdem sehen.

füge einfach diese Zeilen unter "Global light=CreateLight()" und es gibt einen Hintergrund als Beweis daß das erzeugte Mesh nicht vorhanden ist.
Code: [AUSKLAPPEN]
Global Backround=CreateCube()
ScaleEntity Backround, 1000,1000,1
EntityColor Backround ,0,128,64
PositionEntity Backround, 0,0,400


Bitte, probiere es aus, ich kenne mich mit Mesh erzeugen nicht so gut aus, wenn da etwas fehlen sollte, oder die Funktion falsch aufgerufen wird, würde es mir nicht auffallen.
Füge es einfach kurz ins BB3D ein, und probiere es aus, bitte.

StarGazer

BeitragSo, Apr 25, 2004 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe jetzt mal das mit den Vertexfarben in den Code miteingebaut,
aber leider geht es dennoch nicht.

Code: [AUSKLAPPEN]
Graphics3D 640,480,16
SetBuffer BackBuffer()

Global camera=CreateCamera()
Global light=CreateLight()

Global Backround=CreateCube()
ScaleEntity Backround, 1000,1000,1
EntityColor Backround ,0,128,64
PositionEntity Backround, 0,0,400

Dim Model(10)
Model(1) = LoadMesh("MESH.X")
PositionEntity Model(1), 100,0,200

;--------------------------------------------------------
FileOut$ = WriteFile("Test.dat")
   SaveMeshInFile (FileOut$, Model(1) )
CloseFile FileOut$

FileIn = ReadFile("Test.dat")
   ;Model(2) = ( LoadMeshFromFile( FileIn ) )   
   Model(2) = CopyMesh( LoadMeshFromFile( FileIn ) )
CloseFile(FileIn)
;--------------------------------------------------------

EntityColor Model(2) ,255,0,0
PositionEntity Model(2), -100,0,200


; ************************************************************************************************
Function SaveMeshInFile( Stream , Mesh )

WriteLine Stream,CountSurfaces(Mesh)
For S = 1 To CountSurfaces(Mesh)
   Surface = GetSurface(Mesh,S)
   WriteFloat Stream,CountVertices(Surface)
   For V = 0 To CountVertices(Surface) - 1
      WriteFloat Stream,VertexX#(Surface,V)
      WriteFloat Stream,VertexY#(Surface,V)
      WriteFloat Stream,VertexZ#(Surface,V)
      WriteFloat Stream,VertexU#(Surface,V, 0)
      WriteFloat Stream,VertexV#(Surface,V, 0)
      WriteFloat Stream,VertexW#(Surface,V, 0)
      WriteFloat Stream,VertexU#(Surface,V, 1)
      WriteFloat Stream,VertexV#(Surface,V, 1)
      WriteFloat Stream,VertexW#(Surface,V, 1)
      WriteFloat Stream,VertexNX#(Surface,V)
      WriteFloat Stream,VertexNY#(Surface,V)
      WriteFloat Stream,VertexNZ#(Surface,V)
      WriteFloat Stream,VertexRed(Surface,V)
      WriteFloat Stream,VertexGreen(Surface,V)
      WriteFloat Stream,VertexBlue(Surface,V)
   Next
   WriteLine Stream,CountTriangles(Surface)
   For T = 0 To CountTriangles(Surface) - 1
      WriteFloat Stream,TriangleVertex(Surface,T,0)
      WriteFloat Stream,TriangleVertex(Surface,T,1)
      WriteFloat Stream,TriangleVertex(Surface,T,2)
   Next
Next

End Function
; ************************************************************************************************
Function LoadMeshFromFile( Stream )

Local Mesh,SCount,VCount,TCount,S,VNX#,VNY#,VNZ#
Local Surface,V1,T,X#,Y#,Z#,tU1#,tV1#,tW1#,tU2#,tV2#,tW2#,VT0,VT1,VT2

Mesh = CreateMesh()
SCount = ReadLine(Stream)
For S = 1 To SCount
   Surface = CreateSurface(Mesh)
   VCount = ReadFloat(Stream)
   For V1 = 0 To VCount - 1
      X# = ReadFloat(Stream)
      Y# = ReadFloat(Stream)
      Z# = ReadFloat(Stream)
      tU1# = ReadFloat(Stream)
      tV1# = ReadFloat(Stream)
      tW1# = ReadFloat(Stream)
      tU2# = ReadFloat(Stream)
      tV2# = ReadFloat(Stream)
      tW2# = ReadFloat(Stream)
      VNX# = ReadFloat(Stream)
      VNY# = ReadFloat(Stream)
      VNZ# = ReadFloat(Stream)
      VCR# = ReadFloat(Stream)
      VCG# = ReadFloat(Stream)
      VCB# = ReadFloat(Stream)

      AddVertex Surface,X#,Y#,Z#,tU1#,tV1#,tW1#
      VertexNormal Surface,V1,VNX#,VNY#,VNZ#
      VertexColor Surface,V1, VCR, VCG, VCB
         
      VertexTexCoords Surface, V1, tU1#, tV1#, tW1#, 0
      VertexTexCoords Surface, V1, tU2#, tV2#, tW2#, 1


   Next
   TCount = ReadFloat(Stream)
   For T = 0 To TCount - 1
      VT0 = ReadFloat(Stream)
      VT1 = ReadFloat(Stream)
      VT2 = ReadFloat(Stream)
      AddTriangle Surface,VT0,VT1,VT2
   Next
Next

UpdateNormals Mesh

Return Mesh
      
End Function
; ************************************************************************************************


While Not KeyDown(1)

   If KeyDown(203) Then ; LEFT
      MoveEntity camera,-4,0,0
   EndIf
   If KeyDown(205) Then ;RIGHT
      MoveEntity camera,4,0,0
   EndIf

   If KeyDown(200) Then ; UP
      MoveEntity camera,0,0,4
   EndIf
   If KeyDown(208) Then ; DOWN
      MoveEntity camera,0,0,-4
   EndIf
   
   UpdateWorld ; wird für Animation und die Kollision gebraucht
   RenderWorld
      
   Flip
Wend
End

Suco-X

Betreff: .........

BeitragMo, Apr 26, 2004 4:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

FileOut$ = WriteFile("Test.dat")
SaveMeshInFile (FileOut$, Model(1) )

Ein stück weiter unten hast du es doch richtig gemacht. Tu das $ weg, datei handles müssen in Integer Variablen gespeichert werden.
Vllt lags daran, jedenfalls schwerer Fehler.
bye
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

lettorTrepuS

BeitragMo, Apr 26, 2004 4:55
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

StarGazer

BeitragMo, Apr 26, 2004 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Liegt nicht an FileOut mit $, denn ohne gehts auch nicht, ich habe das schon führer ausprobiert, zu sicherheit jetzt nochmal getestet.
--------------------------------------------------------------------------

Das mit PositionEntity 100,0,200 Plötzlich -100 statt 100, ist schon richtig, denn es ist ein anderes Model.

PositionEntity Model(1), 100,0,200 -> das Orginalmesh, das gespeichert wird, ist auf der rechten Seite.
PositionEntity Model(2), -100,0,200 -> das geladene kreierte Mesh soll auf der linken Seite und zu bessern Erkennung sogar rot gefärbt.

--------------------------------------------------------------------------
Model(2) = (LoadMeshFromFile( FileIn )) auch nicht wenn ich die Klammern drumherrum wegnehme
oder
Model(2) = CopyMesh( LoadMeshFromFile( FileIn ) )
geht auch nicht

Code: [AUSKLAPPEN]
FileIn = ReadFile("Test.dat")
   ;Model(2) = ( LoadMeshFromFile( FileIn ) )
   Model(2) = CopyMesh( LoadMeshFromFile( FileIn ) )
CloseFile(FileIn)


Auch nicht an den Vertexfarben, es gibt einen Hintergrund, und das kreierte Mesh wird rot gefärbt, und der Code speichert und ladet jetzt auch Vertexfarben. Und alle Objekte sind in der Kamerasichtreichweite, und zu not kann man soger mit den Pfeiltasten die Kamera bewegen.
  • Zuletzt bearbeitet von StarGazer am Mo, Apr 26, 2004 13:10, insgesamt 2-mal bearbeitet

StarGazer

BeitragMo, Apr 26, 2004 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe einen Fehler gefunden.
Der Fehler liegt darin das beim herreinladen der Datei, ein Flascher Wert in die " TCount " Varibale geladen wird ( liegt nicht am FileOut mit $, denn ohne ist es auch falsch ), aber selbst wenn man per Hand den richten Wert eingibt wird das Objekt zwar erzeugt, aber mit Fehlern.

StarGazer

BeitragMo, Apr 26, 2004 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe den Fehler gefunden und behoben.
Wie ich es schon vermutet habe, lag es an den Mesh-Speichern und Laden Codes.

Den beim speichern wurde WriteLine benutzt
Code: [AUSKLAPPEN]
WriteLine Stream,CountTriangles(Surface)


und beim laden ReadFloat
Code: [AUSKLAPPEN]
TCount = ReadFloat(Stream)


wenn man es in
Code: [AUSKLAPPEN]
TCount = ReadLine(Stream)

umschreibt, funktioniert es wunderbar, und sogar ohne irgendwelche Meshfeher.


trotzallem
Danke an alle

cu
  • Zuletzt bearbeitet von StarGazer am Mo, Apr 26, 2004 13:45, insgesamt einmal bearbeitet
 

lettorTrepuS

BeitragMo, Apr 26, 2004 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

StarGazer

BeitragMo, Apr 26, 2004 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber das ist die einzigste Zeile die geändert habe, und dann lief es.
Der Code sonst ist fabelhaft, und bin Dir echt dankbar daß es ihn gibt.
 

lettorTrepuS

BeitragMo, Apr 26, 2004 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group