Seite 3 von 3

Re: UV Koordinaten

Verfasst: 25.10.2009 18:31
von Darie
Bin ziemlich unerfahren, was 3D Engines angeht, denke aber das es Sinn machen würde mehrere UV's zu erlauben. Denn man kann ja schliesslich auch mehrere Texturen auf ein Material legen. Da wäre es doch prima, wenn jeder Materiallayer seine eigene UV-Map hätte, oder etwa nicht ?!!? Auch stört es mich,dass zum Beispiel beim Terrain nur 2 Layer möglich sind: Der erste Layer ist die Grundtextur und der zweite ja der Detaillayer, der auf der Grundtextur ständig wiederholt wird. Ich hätte es aber gerne andersherum. Die Grundtextur sollte sich wiederholen (z.B. für Gras) und es sollte möglich sein andere Layer noch hinzuzufügen um das Terrain detailreicher zu gestalten (Strassen, Wege etc.).

Aber vielleicht liege ich da auch falsch.... (errare humanum est)

Re: UV Koordinaten

Verfasst: 25.10.2009 22:02
von grapy
Aber trotzdem... Für jede Änderung musst du eine neue Entity erstellen. (Oder nicht?)
Wie Du siehst nicht, da ja nur der Zeiger auf die Mesh-Daten neu gesetzt wird. ;-)
In diesem Fall mit der Leertaste. Steuerung der Kamera: a d w s und Maus.
Der Code läuft bei mir unter PureBasic 4.40 Beta 5 im 64bit Vista.

@Darie
Mag sein dass es auch ein 3D-Format gibt, das mehrere UV-Maps unterstützt.
Gesehen hab ich aber bis dato noch keines.
Ob man nun die Textur der UV-Map anpasst oder die UV-Map der Textur ist
letztendlich davon abhängig was man machen möchte.
Wenn letzteres nicht geht muss man denn wohl die Textur anpassen.
Also mit Purebasic wirst Du Dich wohl mit einer UV-Map abfinden müssen. ;-)

Code: Alles auswählen

If InitEngine3D() And   InitSprite() And InitKeyboard() And InitMouse()
  Global hwnd = OpenWindow(#PB_Any, 0, 0, 1024, 768, "WindowedScreen3D", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  If hwnd
    If OpenWindowedScreen(WindowID(hwnd), 0, 0, 1024, 768, 1, 0, 0)
    Else
      MessageBox_(0, "OpenWindowedScreen() failed!", "ERROR", #MB_ICONERROR)
      End
    EndIf 
  Else 
    MessageBox_(0, "OpenWindow() failed!", "ERROR", #MB_ICONERROR)
    End
  EndIf 
Else
  MessageBox_(0, "InitEngine3D() Or InitSprite() Or InitKeyboard() Or InitMouse() failed!", "ERROR", #MB_ICONERROR)
  End
EndIf

;Add3DArchive("irgendein Pfad zur Textur", #PB_3DArchive_FileSystem)
mymesh = CreateMesh(#PB_Any, 1)
SetMeshData(mymesh, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate, ?VertexID, 4) 
SetMeshData(mymesh, #PB_Mesh_Face, ?FaceID, 2) 
;mytextur =  LoadTexture(#PB_Any, "irgendeine Textur.tga")
;mymaterial = CreateMaterial(#PB_Any, TextureID(mytextur))
myentity = CreateEntity(#PB_Any, MeshID(mymesh), 0); 0 = MaterialID(mymaterial)
mylight = CreateLight(#PB_Any, RGB(255, 255, 255))
LightLocate(mylight, x, 200, 200)
mycamera = CreateCamera(#PB_Any, 0, 0, 100, 100)
CameraLocate(mycamera, 0, 0, 300)

Repeat

  If ExamineKeyboard()
    If KeyboardPushed(#PB_Key_A)
      KeyX.f = -2
    ElseIf KeyboardPushed(#PB_Key_D)
      KeyX.f = 2
    Else
      KeyX.f = 0
    EndIf
        
    If KeyboardPushed(#PB_Key_W)
      KeyY.f = -2
    ElseIf KeyboardPushed(#PB_Key_S)
      KeyY.f = 2
    Else
      KeyY.f = 0
    EndIf
    
    If KeyboardReleased(#PB_Key_Space)
      If Paused = #False
        Paused = #True
        SetMeshData(mymesh, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate, ?VertexIDnew, 4)
      Else
        Paused = #False
        SetMeshData(mymesh, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate, ?VertexID, 4)
      EndIf
    EndIf
  EndIf 

  If ReleaseMouse = 0
    If ExamineMouse()
      MouseX.f = -MouseDeltaX()/10 
      MouseY.f = -MouseDeltaY()/10 
    EndIf
  EndIf 

  RotateCamera(mycamera, MouseY.f, MouseX.f, 0, #PB_Relative)         
  MoveCamera(mycamera, KeyX.f, 0, KeyY.f)

  RenderWorld()
  FlipBuffers()
  
  If StartDrawing(WindowOutput(hwnd))
    BackColor(RGB(0, 0, 0))
    FrontColor(RGB(255, 255, 255))

    DrawText(0, 0, StrF(Engine3DFrameRate(#PB_Engine3D_Current), 1)+" FPS") 
    DrawText(0, 15, Str(CountRenderedTriangles())+" Triangles")
    DrawText(0, 30, Str(WindowWidth(hwnd)))
    DrawText(0, 45, Str(WindowHeight(hwnd)))
    StopDrawing() 
  EndIf


  Event = WindowEvent()
  If Event = 514
    ReleaseMouse = 0
    ReleaseMouse(0)
  ElseIf Event = 517
    MouseX.f = 0
    MouseY.f = 0
    ReleaseMouse = 1
    ReleaseMouse(1)
  ElseIf Event = #PB_Event_CloseWindow Or KeyboardReleased(#PB_Key_Escape)
    End
  EndIf
  
  If GetWindowState(hwnd) = #PB_Window_Minimize
    Delay(16)
  EndIf
  
ForEver

DataSection
  VertexID:
   ;Data.f x, y, z, Nx, Ny, Nz, U, V 
    Data.f -100, 100, 0, 0, 0, -1, 0, 0
    Data.f -100, 0, 0, 0, 0, -1, 0, 1
    Data.f 100, 0, 0, 0, 0, -1, 1, 1
    Data.f 100, 100, 0, 0, 0, -1, 1, 0    
  FaceID:
    Data.w 0, 1, 2
    Data.w 0, 2, 3
  VertexIDnew: 
    Data.f -150, 100, 0, 0, 0, -1, 0, 0
    Data.f -100, 0, 0, 0, 0, -1, 0, 1
    Data.f 100, 0, 0, 0, 0, -1, 1, 1
    Data.f 150, 100, 0, 0, 0, -1, 1, 0    
EndDataSection