Grundlagen zur 3D-Programmierung

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
scoty
Beiträge: 64
Registriert: 18.10.2005 16:43
Wohnort: Raum Hildesheim

Grundlagen zur 3D-Programmierung

Beitrag von scoty »

Hallo zusammen,
ich bin auf der Suche nach einem Tutorial um die Grundlagen der 3d-Engine von Purebasic zu verstehen.

Was ich bisher im Netz gefunden habe ist, wie man Rechtecke erstellt und mit einer Textur belegt.

Was mich interessiert ist:
wie baue ich dreidimensionale Objekte und wie werden die entstehenden Flächen richtig mit Farben, oder auch mit Texturen belegt? Gibt es da denn nicht irgendwo eine nette Schritt für Schritt Anleitung. Mir scheint, ich nutze die falschen Schlüsselworte beim Suchen.

Ich möchte auch keine Landschaften mit Blender oder der gleichen erzeugen sondern wirklich Punktkoordinaten definieren, vertexes anlegen, Flächen Bilden und dann mit Farben oder Texturen belegen.

Ich würde mir selbst jetz sowieso eine Anleitung scheiben, zum besseren Verständnis und späterem Nachschlagen. Ich würde sie auch online stellen, aber hat das nicht evtl. schon jemend gemacht?

Ich hoffe auf Eure Hilfe!
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Grundlagen zur 3D-Programmierung

Beitrag von bobobo »

hmm .. Anleitung hab ich nicht
aber ein schönes Beipiel wo fast alles drin vorkommt bis auf die Camerabewegung

ff von hier und den darauf folgenden.

der rennt auch unter pb4.51 .. aber vorsicht .. das Ding macht auf Dauer krank im Kopf

Code: Alles auswählen

; Comtois 28/03/06
; PB4.0 Beta 7
;
; Updated/Formated by Fluid Byte
; PB V4.30F - March.24,2009

EnableExplicit

Declare CreateSphere(M,P)
Declare UpdateMesh()

#_SIZEVERT = 36
#_SIZETRIS = 6
#FULLSCREEN = 0

Structure VECTOR
   X.f
   Y.f
   Z.f
EndStructure

Structure VERTEX
   X.f
   Y.f
   Z.f
   NX.f
   NY.f
   NZ.f
   Color.l
   U.f
   V.f
EndStructure

Structure TRIANGLE
   V1.w
   V2.w
   V3.w
EndStructure

Macro CALC_NORMALS
   *PtrV\NX = *PtrV\X
   *PtrV\NY = *PtrV\Y
   *PtrV\NZ = *PtrV\Z
EndMacro

Global *VBuffer, *IBuffer
Global Meridian = 50, Parallele = 50, PasLength = 4, Length

Define EventID, i, NbSommet, CameraMode, Angle.f, Pas.f = 0.5

InitEngine3D() : InitSprite() : InitKeyboard()

Add3DArchive(GetTemporaryDirectory(),#PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples\Sources\Data\",#PB_3DArchive_FileSystem)

If #FULLSCREEN
  OpenScreen(800,600,32,"Sphere 3D")
Else
  OpenWindow(0,0,0,800,600,"Sphere 3D",#PB_Window_SystemMenu | 1)
  OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
EndIf

;-Texture
CreateImage(0,128,128)
StartDrawing(ImageOutput(0))
For i = 0 To 127 Step 4
   Box(0,i,ImageWidth(0),2,RGB(255,255,255))
   Box(0,i + 2,ImageWidth(0),2,RGB(0,0,155))
Next i
StopDrawing()
SaveImage(0,GetTemporaryDirectory() + "temp.bmp") : FreeImage(0)

;-Material
CreateMaterial(0,LoadTexture(0,"temp.bmp"))
RotateMaterial(0,0.1,#PB_Material_Animated)

;-Mesh
CreateSphere(Meridian,Parallele)

;-Entity
CreateEntity(0,MeshID(0),MaterialID(0))
ScaleEntity(0,60,60,60)

;-Camera
CreateCamera(0,0,0,100,100)
MoveCamera(0,0,0,-200)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))

;-Light
AmbientColor(RGB(105, 105, 105))
CreateLight(0, RGB(255, 255,  55), EntityX(0) + 150, EntityY(0)      , EntityZ(0))
CreateLight(1, RGB( 55, 255, 255), EntityX(0) - 150, EntityY(0)      , EntityZ(0))
CreateLight(2, RGB( 55,  55, 255), EntityX(0)      , EntityY(0) + 150, EntityZ(0))
CreateLight(3, RGB(255,  55, 255), EntityX(0)      , EntityY(0) - 150, EntityZ(0))

; ----------------------------------------------------------------------------------------------------
; MAINLOOP
; ----------------------------------------------------------------------------------------------------

Repeat
   If #FULLSCREEN = 0
      Repeat
         EventID = WindowEvent()
      
         Select EventID
            Case #PB_Event_CloseWindow : End 
         EndSelect
      Until EventID = 0
   EndIf
   
   Angle + Pas
   RotateEntity(0, Angle, Angle,Angle)
   
   If PasLength > 0 : UpdateMesh() : EndIf
   
   If ExamineKeyboard()
      If KeyboardReleased(#PB_Key_F1)
         CameraMode = 1 - CameraMode
         CameraRenderMode(0, CameraMode)
      EndIf
   EndIf
   
   RenderWorld()
   FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

; ----------------------------------------------------------------------------------------------------
; FUNCTIONS
; ----------------------------------------------------------------------------------------------------

Procedure CreateSphere(M,P) 
   ; M = Meridian 
   ; P = Parallele 
   ; The radius is 1. Front to remove it later, it's just for the demo. 
    
   If M < 3 Or P < 2  : ProcedureReturn 0 : EndIf 
    
   Protected Normale.VECTOR, NbSommet, i, j, Theta.f, cTheta.f, sTheta.f 
   Protected Alpha.f, cAlpha.f, sAlpha.f, *PtrV.VERTEX,*PtrV2.VERTEX, *PtrF.TRIANGLE, NbTriangle 
    
   NbSommet = 1 + ((m + 1) * p) + 2 * m -1
   

   *VBuffer = AllocateMemory(#_SIZEVERT * Nbsommet) 
    
   For i = 0 To m 
      theta.f  = i * #PI * 2.0 / m 
      ctheta.f = Cos(theta) 
      stheta.f = Sin(theta) 
  
      For j = 1 To p  
         alpha.f  = j * #PI / (p + 1) 
         calpha.f = Cos(alpha) 
         salpha.f =Sin(alpha) 
         *PtrV.Vertex = *VBuffer + #_SIZEVERT * ((i * p) + (j - 1)) 
         *PtrV\x = salpha * ctheta
         *PtrV\z = salpha * stheta 
         *PtrV\y = calpha  
         *PtrV\u = Theta / (2.0 * #PI)  
         *PtrV\v = alpha / #PI 
         CALC_NORMALS 

      Next j 
   Next i 

   For i = 0 To m -1
      theta.f  = i / m 
      *PtrV.Vertex = *VBuffer + #_SIZEVERT * (((m + 1) * p)+i)
      *PtrV\x = 0 
      *PtrV\y = -1    
      *PtrV\z = 0 
      *PtrV\u = Theta + 1/(m*2)
      *PtrV\v = 1 
      CALC_NORMALS 
  Next i

  For i = 0 To m -1
    theta.f  = i / m 
    *PtrV.Vertex = *VBuffer + #_SIZEVERT * (((m + 1) * p)+m+i)
   ;Pole nord 
    *PtrV\x = 0 
    *PtrV\y = 1    
    *PtrV\z = 0 
    *PtrV\u = Theta + 1/(m*2) 
    *PtrV\v = 0 
    CALC_NORMALS 
  Next i

   ; Les facettes 
  
   NbTriangle = 4 * M * P 
   *IBuffer = AllocateMemory(#_SIZETRIS * NbTriangle) 

   *PtrF = *IBuffer 

   For i = 0 To m - 1 
      For j = 1 To p - 1 
         *PtrF\V1=((i + 1) * p) + j 
         *PtrF\V2=((i + 1) * p) + (j - 1) 
         *PtrF\V3=(i * p) + (j - 1) 
         *PtrF + #_SIZETRIS 
         *PtrF\V3=((i + 1) * p) + j        ;Recto 
         *PtrF\V2=((i + 1) * p) + (j - 1)  ;Recto 
         *PtrF\V1=(i * p) + (j - 1)        ;Recto 
         *PtrF + #_SIZETRIS  
         *PtrF\V1 = i * p + j
         *PtrF\V2=((i + 1) * p) + j 
         *PtrF\V3=(i * p) + (j - 1) 
         *PtrF + #_SIZETRIS 
         *PtrF\V3=i * p + j                ;Recto 
         *PtrF\V2=((i + 1) * p) + j        ;Recto 
         *PtrF\V1 = (i * p) + (j - 1)      ;Recto 
         *PtrF + #_SIZETRIS  
      Next j      

      *PtrF\V3=((m + 1) * p)+i 
      *PtrF\V2=i * p + (p - 1) 
      *PtrF\V1=(i + 1) * p + (p - 1)
      *PtrF + #_SIZETRIS  
      *PtrF\V1 = ((m + 1) * p)+i           ;Recto 
      *PtrF\V2 = i * p + (p - 1)           ;Recto 
      *PtrF\V3 = (i + 1) * p + (p - 1)     ;Recto 
      *PtrF + #_SIZETRIS  

      *PtrF\V3=(m + 1) * p +m+i 
      *PtrF\V2=(i + 1) * p 
      *PtrF\V1 = i * p 
      *PtrF + #_SIZETRIS  
      *PtrF\V1 = ((m + 1) * p) +m+i        ;Recto 
      *PtrF\V2=(i + 1) * p                 ;Recto 
      *PtrF\V3=i * p                       ;Recto 
      *PtrF + #_SIZETRIS  


   Next i
    
   If CreateMesh(0,100) 
      Protected Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color 
      SetMeshData(0,Flag,*VBuffer,NbSommet) 
      SetMeshData(0,#PB_Mesh_Face,*IBuffer,NbTriangle) 
      ProcedureReturn 1 
   EndIf 
    
   ProcedureReturn 0 
EndProcedure   

; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

Procedure UpdateMesh()
   Protected NbTriangle = 4 * Meridian * Parallele
   
   Length + PasLength
   
   If Length >= NbTriangle
      PasLength = 0
      Length = Nbtriangle
   EndIf
   
   SetMeshData(0,#PB_Mesh_Face,*IBuffer,Length)
EndProcedure
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Grundlagen zur 3D-Programmierung

Beitrag von super_castle »

Hmmm..., sieht gut aus.

Kann man die Grafik nicht irgendwie direkt auftragen ohen den Umweg speichern/laden?

Code: Alles auswählen

 Protected Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color
 SetMeshData(0,Flag,*VBuffer,NbSommet)
 SetMeshData(0,#PB_Mesh_Face,*IBuffer,NbTriangle)
Ekrlär mir das oben einmal .


Gruss
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Grundlagen zur 3D-Programmierung

Beitrag von bobobo »

wie erklären ? Steht doch da

setmeshdata ist zur Übergabe von Daten an das Mesh
und was da übergeben wird steht im Code

das zweite setmeshdata kann eventuell raus . auskommentieren ändert da nicht allzuviel am Ergebnis

ist nicht mein code ..der ist aus dem englishen forum , wie oben angegeben
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Rebon
Beiträge: 263
Registriert: 20.05.2009 19:13

Re: Grundlagen zur 3D-Programmierung

Beitrag von Rebon »

super_castle hat geschrieben:Kann man die Grafik nicht irgendwie direkt auftragen ohen den Umweg speichern/laden?
Damit der Code bei mir läuft(PB 4.00), musste ich das machen, falls ich dich richtig verstanden habe.
Der TextureOutput()-Befehl mit dem das möglich ist wurde aber in einer der nachfolgenden PB-Versionen entfernt.
http://www.purebasic.fr/english/viewtop ... 23#p260623

Code: Alles auswählen

;-Texture
CreateTexture(0,128,128)
StartDrawing(TextureOutput(0))
For i = 0 To 127 Step 4
   Box(0,i,TextureWidth(0),2,RGB(255,255,255))
   Box(0,i + 2,TextureWidth(0),2,RGB(0,0,155))
Next i
StopDrawing()
;SaveImage(0,GetTemporaryDirectory() + "temp.bmp") : FreeImage(0)

;-Material

CreateMaterial(0,TextureID(0))
PB 4.00 | Windows XP Home SP3
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Grundlagen zur 3D-Programmierung

Beitrag von super_castle »

Oh...,man..., welche Schnappsnase kam denn auf diese krumme Idee, diesen elementaren Befehl zu entfernen.

Na, dann. Hoffentlich lassen die uns noch einpaar 3D-Befehle übrig... :bounce:

Gruss
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Grundlagen zur 3D-Programmierung

Beitrag von bobobo »

Es fehlt eigentlich nicht wirklich was (außer vieleicht sowas wie Catchtexture())

und elementar ist das ganze auch kaum, da man mit pb direkt wohl eher ganz selten
3D-Modelle direkt basteln wird. und wenn doch dann geht's so wie oben.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Grundlagen zur 3D-Programmierung

Beitrag von super_castle »

da man mit pb direkt wohl eher ganz selten
3D-Modelle direkt basteln wird. und wenn doch dann geht's so wie oben.
Hmmm..., Purebasic ist keine Spielconsole.
Wer mit 3D in Purebasic etwas macht, der möchte auch selbständig Modelle erstellen mit Purebasic, ansonsten kann man sich die X_Box kaufen.

Einen solchen Befehl rauszunehmen halte ich für Unsinn, weil er elementar ja schon Funktionsfähig eingebaut war.

Gruss
scoty
Beiträge: 64
Registriert: 18.10.2005 16:43
Wohnort: Raum Hildesheim

Re: Grundlagen zur 3D-Programmierung

Beitrag von scoty »

Danke erst einmal für das Beispiel, ich hatte in der Zwischenzeit noch etwas anderes gefunden.
Ein Beispiel mit drei rotirenden Quadraten.
Ich hatte vor dies Beispiel abzuwandeln um einen rotierenden Würfel zu erhalten. Leider klappt das noch nicht. Mein Problem ist fehendes Verständnis für die Angabe der Vertexkoordinaten, denke ich.

Am liebsten würde ich auch Eckpunkten einen Farbwert zuweisen, um mir Farbverläufe zu erzeugen, wie in den Beispeilen hier.

Hier ist noch mein aktueller Experimentiercode:

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=1501&start=10 
; Author: Danilo (updated for PB 4.00 by ste123) 
; Date: 05. July 2003 
; OS: Windows 
; Demo: Yes 

If InitEngine3D() And InitSprite() And InitKeyboard() 
  OpenWindow(0,0,0,640,480,"3D Mesh Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
  OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0) 
  BigFont = LoadFont(1,"Arial",38) 

    Add3DArchive("data", #PB_3DArchive_FileSystem)
    LoadTexture(0,"clouds.jpg")
    
    CreateMaterial(0, TextureID(0))

    ; Viereck 1 
    ;CreateMesh(1,30) 
    ;SetMeshData(1,#PB_Mesh_Vertex       ,?Ecken            , 4) ; 4 Ecken 
    ;SetMeshData(1,#PB_Mesh_Face         ,?Viereck_1        , 2) ; 2 Dreicke 
    ;SetMeshData(1,#PB_Mesh_UVCoordinate ,?TexturKoordinaten, 4) 

    ;CreateEntity(1, MeshID(1), MaterialID(0)) 

    
    CreateMesh(2,30) 
    SetMeshData(2,#PB_Mesh_Vertex       ,?Ecken            , 8) ; n Ecken 
    SetMeshData(2,#PB_Mesh_Face         ,?Objekt_1         , 4) ; n Dreiecke 
    SetMeshData(2,#PB_Mesh_UVCoordinate ,?TexturKoordinaten, 8) 

    CreateEntity(2, MeshID(2), MaterialID(0)) 
    
    
    ; Viereck 2 
    ;CreateMesh(2,30) 
    ;SetMeshData(2,#PB_Mesh_Vertex       ,?Ecken            , 4) ; 4 Ecken 
    ;SetMeshData(2,#PB_Mesh_Face         ,?Viereck_2        , 2) ; 2 Dreiecke 
    ;SetMeshData(2,#PB_Mesh_UVCoordinate ,?TexturKoordinaten, 4) 

    ;CreateEntity(2, MeshID(2), MaterialID(0)) 


    ; Viereck 3 
    ;CreateMesh(3,30) 
    ;SetMeshData(3,#PB_Mesh_Vertex       ,?Ecken            , 4) ; 4 Ecken 
    ;SetMeshData(3,#PB_Mesh_Face         ,?Viereck_3        , 4) ; 4 Dreiecke (Vorder- und Rueckseite) 
    ;SetMeshData(3,#PB_Mesh_UVCoordinate ,?TexturKoordinaten, 4) 

    ;CreateEntity(3, MeshID(3), MaterialID(0)) 


    ;MoveEntity(1,-3,0,0) 
    ;MoveEntity(3, 3,0,0) 
    
    CreateCamera(0, 0, 0, 100, 100) 
    CameraLocate(0,0,0,10) 
    
    Repeat 
      ClearScreen(RGB(0,0,0) ) 
      ExamineKeyboard() 
      Select WindowEvent() 
        Case #PB_Event_CloseWindow 
          Quit = #True 
      EndSelect 

      rot+1 
      If rot>=360 : rot=0 : EndIf 

      ;RotateEntity(1, rot, rot, 0) 
      RotateEntity(2, rot, 0, rot) 
      ;RotateEntity(3, rot, rot, 0) 
      RenderWorld() 
      FlipBuffers() 
    Until KeyboardPushed(#PB_Key_Escape) Or Quit 
Else 
  MessageRequester("Error", "Cant init DirectX 3D Engine",0) 
EndIf 
  
End 


DataSection 

  Ecken:
    Data.f  0, 0,  0 ; Ecke 0             3-----2                  7-----6
    Data.f  2, 0,  0 ; Ecke 1             |  .  |                 /|    /|
    Data.f  2, 2,  0 ; Ecke 2             |     |                3-+---2 |
    Data.f  0, 2,  0 ; Ecke 3             0-----1                | 4---+-5
    Data.f  0, 0,  2 ; Ecke 4             7-----6                |/    |/
    Data.f  2, 0,  2 ; Ecke 5             |  .  |                0-----1
    Data.f  2, 2,  2 ; Ecke 6             |     | 
    Data.f  0, 2,  2 ; Ecke 7             4-----5
    
    TexturKoordinaten: 
    Data.f 0.0, 0.0 ; Vertex 0 
    Data.f 2.0, 0.0 ; Vertex 1 
    Data.f 2.0, 2.0 ; Vertex 2 
    Data.f 0.0, 2.0 ; Vertex 3 
    Data.f 0.0, 0.0 ; Vertex 4 
    Data.f 2.0, 0.0 ; Vertex 5 
    Data.f 2.0, 2.0 ; Vertex 6 
    Data.f 0.0, 2.0 ; Vertex 7
    
    Objekt_1:
    Data.w 0, 1, 2  ; Dreieck 1 besteht aus den Ecken 0, 1 und 2    // Vorderseite 
    Data.w 2, 3, 0  ; Dreieck 2 besteht aus den Ecken 2, 3 und 0
    Data.w 4, 5, 6  ; Dreieck 1 besteht aus den Ecken 4, 5 und 6    // Rückseite 
    Data.w 4, 7, 6  ; Dreieck 2 besteht aus den Ecken 6, 7 und 4
    Data.w 0, 4, 1  ; Dreieck 1 besteht aus den Ecken 0, 1 und 5    // Unterseite 
    Data.w 4, 5, 1  ; Dreieck 2 besteht aus den Ecken 0, 4 und 5
    Data.w 7, 3, 2  ; Dreieck 1 besteht aus den Ecken 3, 2 und 6    // Oberseite 
    Data.w 7, 6, 2  ; Dreieck 2 besteht aus den Ecken 3, 7 und 6
    Data.w 3, 0, 4  ; Dreieck 1 besteht aus den Ecken 0, 1 und 5    // Links 
    Data.w 3, 7, 4  ; Dreieck 2 besteht aus den Ecken 0, 4 und 5
    Data.w 1, 2, 6  ; Dreieck 1 besteht aus den Ecken 3, 2 und 6    // Rechts
    Data.w 1, 5, 6  ; Dreieck 2 besteht aus den Ecken 3, 7 und 6

  Viereck_1: 
    Data.w 0, 1, 2  ; Dreieck 1 besteht aus den Ecken 0, 1 und 2 
    Data.w 2, 3, 0  ; Dreieck 2 besteht aus den Ecken 2, 3 und 0 
                    ; = 1 Viereck 

  Viereck_2: 
    Data.w 0, 3, 2  ; Dreieck 1 besteht aus den Ecken 0, 3 und 2 
    Data.w 2, 1, 0  ; Dreieck 2 besteht aus den Ecken 2, 1 und 0 
                    ; = 1 Viereck 

  Viereck_3: 
    Data.w 0, 1, 2  ; Dreieck 1 besteht aus den Ecken 0, 1 und 2 
    Data.w 2, 3, 0  ; Dreieck 2 besteht aus den Ecken 2, 3 und 0 
                    ; = 1 Viereck Vorderseite 
    Data.w 0, 3, 2  ; Dreieck 1 besteht aus den Ecken 0, 3 und 2 
    Data.w 2, 1, 0  ; Dreieck 2 besteht aus den Ecken 2, 1 und 0 
                    ; = 1 Viereck Rueckseite 

EndDataSection 

; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = -
; DisableDebugger
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Re: Grundlagen zur 3D-Programmierung

Beitrag von mpz »

Hi scoty,

Du must hier eigene UV Koordinaten für die Vertexe Deines Würfels erstellen. Wenn Du eine Seite des Würfels mit 4 Vertexe hast beginnt die UV Koodinate mit 0,0 - 0,1 - 1,0 - 1,1. Auf dieser Fläche wird die Textur "geklebt". Man kann aber auch tricksen indem man einer Seite 1/6 der Textur über UV Koordinaten übergibst (0,0 - 0,0.33 - 0,0.5 -0.33,0.5) und damit eine Textur, die in 6 Teilen unterteilt wird, einfcah auf den Würfel klebst. Ein fertiges Beispiel mit einem 6 seitigen Würfel und einer selbst erstellten PB Image Datei findest Du bei meiner 3D Engine mit dem Beispiel: MP_Texturkoordinaten_Änderung_6_Seiten.pb. Es ist sicher möglich dieses Beispiel sinnhaft auch für Ogre umzuändern. Die Vertex Argumente sind im 3D Bereich quasi immer gleich ..

MP3D Engine
http://forums.purebasic.com/german/view ... 10&t=21483

Bild

mfg.
Michael
Working on :lol: - LibSGD - MP3D Engine - 8)
Antworten