Seite 1 von 1

Mesh ,Data , ??? -- > Tutorial ?

Verfasst: 16.10.2007 20:33
von lassma-asma
Hi Leute ,

ich wollte mal fragen ob es irgendwo ein gutes Tutorial gibt , in dem einem gezeigt wird wie man das mit dem Data macht um daraus dann ein Mesh zu machen ...

Bin auf das Beispiel gestoßen , check aber nich was man da eingeben muss ,3,0,2 und so weiter ... wäre froh wenn mir einer ein tutorial empfehlen könnte oder es mir jemand erklärt ...

Gruß und THX schon mal im Voraus

lassma-asma

Code: Alles auswählen

; English forum: http://purebasic.myforums.net/viewtopic.php?t=8257&highlight= 
; Author: Danilo 
; Date: 09. November 2003 
 
 
; Danilo 3d-Mesh zur Laufzeit  
 
; Backpanes von bobobo  
 
If InitEngine3D() And InitSprite() And InitKeyboard()  
  OpenWindow(0,0,0,640,480,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"3D Mesh Test")  
  OpenWindowedScreen(WindowID(),0,0,640,480,0,0,0)  
  BigFont = LoadFont(1,"Arial",20)  
    CreateMesh(0)  
    SetMeshData(0, #PB_Mesh_Vertices , ?CubeVertices          , 6)  
    SetMeshData(0, #PB_Mesh_Triangles , ?CubeFacesIndexes      , 4)  
    SetMeshData(0, #PB_Mesh_UVCoordinates, ?CubeTextureCoordinates, 4)  
 
    CreateTexture(0,64,64)  
    StartDrawing(TextureOutput(0))  
      Box(0,0,64,64,$00FFFF)  
      LineXY(0,0,64,64,$000000)  
      LineXY(64,0,0,64,$000000)  
      FrontColor($00,$00,$FF)  
      DrawingMode(1)  
      DrawingFont(BigFont)  
      Locate(0,0)  
      DrawText("123")  
    StopDrawing()  
    CreateEntity(0, MeshID(0), CreateMaterial(0, TextureID(0)))  
     
    ;ScaleEntity(0, 3, 3, 3)  
     
    CreateCamera(0, 0, 0, 100, 100)  
    CameraLocate(0,1.5,1.5,10)  
     
    Repeat  
      ExamineKeyboard()  
      Select WindowEvent()  
        Case #PB_Event_CloseWindow  
          Quit = #True  
      EndSelect  
      CameraRenderMode(0,#PB_Camera_Wireframe)
      
      If KeyboardPushed(#PB_Key_Left)
           RotateEntity(0,2,0,0)
      ElseIf KeyboardPushed(#PB_Key_Right)
           RotateEntity(0,-2,0,0)
      ElseIf KeyboardPushed(#PB_Key_Up)
           RotateEntity(0,0,-2,0)
      ElseIf KeyboardPushed(#PB_Key_Down)
           RotateEntity(0,0,2,0)
      EndIf
       
      ClearScreen(0,0,0)  
      RenderWorld()  
      FlipBuffers()  
    Until KeyboardPushed(#PB_Key_Escape) Or Quit  
Else  
  MessageRequester("Error", "Cant init DirectX 3D Engine",0)  
EndIf  
   
End  
DataSection  
  CubeVertices:  
    Data.f 0, 0, 0 ; Vertex index 0  
    Data.f 3, 0, 0 ; Vertex index 1  
    Data.f 3, 4, 0 ; Vertex index 2  
    Data.f 0, 4, 0 ; Vertex index 3  
    Data.f 0,0,3 ;Vertex index 4  Normale 0-4  
    Data.f 3,4,3 ;Vertex index 5  für Nomale 2-5  
  CubeFacesIndexes:  
    Data.w 0,1,2; 3Eck1bottom face (clockwise as it's reversed...)  
    Data.w 0,2,3;3Eck2  
    Data.w 0,3,2;3Eck1 back  
    Data.w 0,2,1 ;3Eck2 back  
  CubeTextureCoordinates:  
    Data.f 0.0, 0.0 ; Vertex 0  
    Data.f 2.0, 0.0 ; Vertex 1  
    Data.f 2.0, 1.0 ; Vertex 2  
    Data.f 0.0, 1.0 ; Vertex 3  
     
EndDataSection  

Verfasst: 16.10.2007 23:38
von Zaphod
Das ist eigentlich ganz einfach... du siehst ja, das es in der Datasection 3 bereiche gibt. In einer Zeile im ersten Bereich wird jeweils ein Eckpunkt des Modelles beschrieben. Die Koordinate besteht aus drei floats, die die Position des Punktes beinhalten, also Data.f 0, 0, 0 ist ein punkt mitten im Ursprung des Kartesischen Koordinatensystems, also genau in der Mitte. Die Bedeutung ist jeweils Data.f x, y, z.

Jetzt willst du ja nicht nur Punkte darstellen, sondern auch Flächen. Wo du die Punkte schon definiert hast, brauchst du zur Definition einer Fläche ja nur noch angeben, welche Punkte die Eckpunkte der Fläche ausmachen sollen.

Also Data.w 0,1,2 definiert ein Dreieck, dessen Eckpunkte die nullte (oberste) Spalte im vorangegangenen CubeVertices enthält, die und die 1 und 2.
Der Hinweis "(clockwise as it's reversed...)" gibt nur zu Bedenken, dass die Punkte des Dreiecks deswegen im Uhrzeigersinn angegeben sind, weil es grade vom Beobachter wegzeigt. Das ist wichtig für die 3D Engine um zu entscheiden, welche Dreiecke eines Modelles ausgeblendet werden sollen, also für Engine3D Dreiecke die bei Herstellung zum Beobachter zeigen sollen immer gegen den Uhrzeigersinn definieren.

Der dritte Bereich weißt Eckpunkten einen Punkt auf der Textur zu. Also zb in der ersten Zeile, dass das Vertex 0 der Texturkoordinate "Links oben" entspricht.

Es ist aber nicht sehr sinnvoll so 3D Daten ein zu geben, ein Modell sollte besser aus einem File geladen werden.

Verfasst: 17.10.2007 07:14
von lassma-asma
ahhh...
ok


viiiiiiiiiiiiiiiiiielen Dank schon ma ... echt gut beschrieben :allright: ...

ei ich werd das jetzt ma probieren , wenn ich noch fragen hab , meld ich mich wohl oder übel nochma ;-) :freak: :wink: <)