Drehpunkt verlagern

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Drehpunkt verlagern

Beitrag von super_castle »

Hallo, ich habe hier 4 Würfel als Node hintereinander, die man unabhängig drehen kann (node).
Der Drehpunkt liegt im Zentrum der Würfel.

Nun möchte ich den Drehpunkt verlagern.
Welche Werte in der Datazeile müssen da verschoben werden?

Gruss

Code: Alles auswählen


Dim Node(5)
Global.f KeyX, KeyZ
Global x1.f,y1.f,dx.f,dy.f,winkel.f

#camera=2

  InitEngine3D()

  Add3DArchive("Data\", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()

  hWnd = OpenWindow(0,0,0,800,600,"Nodes",#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
  OpenWindowedScreen(hWnd,220,10,500,400,0,0,0)
     
    CreateMaterial(0, LoadTexture(0, "gruen.jpg"))
    CreateMaterial(1, LoadTexture(1, "blau.jpg"))
    CreateMaterial(2, LoadTexture(2, "rot.jpg"))
    CreateMaterial(3, LoadTexture(3, "gelb.jpg"))
   
    Restore NumericalData
    Read.l Vert
    Read.l Tria
    Read.l Max

    CreateMesh(0, vert)
    SetMeshData(0, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color  | #PB_Mesh_UVCoordinate, ?Vertice, Vert);3)
    SetMeshData(0, #PB_Mesh_Face, ?Triangle, Tria); 1)
    
    CreateCamera(#Camera,0,0,100,100)
    CameraLocate(#Camera,0,200,300)
    CameraLookAt(#Camera,0,0,0)
   
    CreateEntity(20,MeshID(0),MaterialID(0),0,-45,0)
    ScaleEntity(20,300,1,300)

    CreateLight(0,RGB(255,255,255),0,500,0)
    AmbientColor(RGB(200,200,200))

      Node(0) = CreateNode(#PB_Any,0,0,0)
      CreateEntity(0,MeshID(0),MaterialID(1))
      ScaleEntity(0,25,5,12) 
      AttachNodeObject(Node(0),EntityID(0),#PB_Node_Entity)
     
      ;-------------------------------

      Node(1) = CreateNode(#PB_Any,0,10,0)
      AttachNodeObject(Node(0),NodeID(Node(1)),#PB_Node_Entity)

      CreateEntity(1,MeshID(0),MaterialID(2))
      ScaleEntity(1,8,8,8)
      AttachNodeObject(Node(1),EntityID(1),#PB_Node_Entity)

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

      Node(2) = CreateNode(#PB_Any,0,33,0)
      AttachNodeObject(Node(1),NodeID(Node(2)),#PB_Node_Entity)

      CreateEntity(2,MeshID(0),MaterialID(3))
      ScaleEntity(2,8,8,8)   
      AttachNodeObject(Node(2),EntityID(2),#PB_Node_Entity)
     
      ;----------------------------------
     
      Node(3) = CreateNode(#PB_Any,0,33,0)
      AttachNodeObject(Node(2),NodeID(Node(3)),#PB_Node_Entity)

      CreateEntity(3,MeshID(0),MaterialID(1))
      ScaleEntity(3,8,8,8)   
      AttachNodeObject(Node(3),EntityID(3),#PB_Node_Entity)
     
      Repeat
        
        Event = WaitWindowEvent(1)   
        ExamineKeyboard()
       
        If KeyboardPushed(#PB_Key_R)
          RotateNode(Node(1),1,0,0,#PB_Relative)
        ElseIf KeyboardPushed(#PB_Key_T)
          RotateNode(Node(1),-1,0,0,#PB_Relative)
        EndIf
       
        If KeyboardPushed(#PB_Key_F)
          RotateNode(Node(2),1,0,0,#PB_Relative)
        ElseIf KeyboardPushed(#PB_Key_G)
          RotateNode(Node(2),-1,0,0,#PB_Relative)
        EndIf
       
        If KeyboardPushed(#PB_Key_V)
          RotateNode(Node(3),1,0,0,#PB_Relative)
        ElseIf KeyboardPushed(#PB_Key_B)
          RotateNode(Node(3),-1,0,0,#PB_Relative)
        EndIf
                           
        If KeyboardPushed(#PB_Key_E)
          winkel=winkel-1
          If winkel<0
            winkel+360
          EndIf
        ElseIf KeyboardPushed(#PB_Key_Q)
          winkel=winkel+1
          If winkel>360
            winkel-360
          EndIf  
        EndIf
                  
       If KeyboardPushed(#PB_Key_W)
          y1=Sin(-winkel/180*#PI)*1
          x1=Cos(-winkel/180*#PI)*1
          dx+x1
          dy+y1   
       ElseIf KeyboardPushed(#PB_Key_S)
         y1=Sin(-winkel/180*#PI)*1
         x1=Cos(-winkel/180*#PI)*1
         dx-x1
         dy-y1
       EndIf

      RotateNode(Node(0), 0, winkel, 0 ,#PB_Absolute)
      NodeLocate(Node(0), dx, 0, dy)
      
      RenderWorld()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit=1

End

DataSection
   StringSect:
      Data.s ""

   NumericalData:
   Data.l 24,12,2

   Vertice:  ;x,y,z,nx,ny,nz,col,u,v = Vertex + Normal + Col + UV Koordinaten
   Data.f 1,1,1,0.57735,0.57735,0.57735,0,0,0
   Data.f 1,-1,1,0.57735,-0.57735,0.57735,0,0,0
   Data.f -1,-1,1,-0.57735,-0.57735,0.57735,0,0,0
   Data.f -1,1,1,-0.57735,0.57735,0.57735,0,0,0
   Data.f 1,1,-1,0.57735,0.57735,-0.57735,0,0,0
   Data.f -1,1,-1,-0.57735,0.57735,-0.57735,0,0,0
   Data.f -1,-1,-1,-0.57735,-0.57735,-0.57735,0,0,0
   Data.f 1,-1,-1,0.57735,-0.57735,-0.57735,0,0,0
   Data.f 1,1,1,0.57735,0.57735,0.57735,0,0,0
   Data.f 1,1,-1,0.57735,0.57735,-0.57735,0,0,0
   Data.f 1,-1,-1,0.57735,-0.57735,-0.57735,0,0,0
   Data.f 1,-1,1,0.57735,-0.57735,0.57735,0,0,0
   Data.f 1,-1,1,0.57735,-0.57735,0.57735,0,0,0
   Data.f 1,-1,-1,0.57735,-0.57735,-0.57735,0,0,0
   Data.f -1,-1,-1,-0.57735,-0.57735,-0.57735,0,0,0
   Data.f -1,-1,1,-0.57735,-0.57735,0.57735,0,0,0
   Data.f -1,-1,1,-0.57735,-0.57735,0.57735,0,0,0
   Data.f -1,-1,-1,-0.57735,-0.57735,-0.57735,0,0,0
   Data.f -1,1,-1,-0.57735,0.57735,-0.57735,0,0,0
   Data.f -1,1,1,-0.57735,0.57735,0.57735,0,0,0
   Data.f 1,1,-1,0.57735,0.57735,-0.57735,0,0,0
   Data.f 1,1,1,0.57735,0.57735,0.57735,0,0,0
   Data.f -1,1,1,-0.57735,0.57735,0.57735,0,0,0
   Data.f -1,1,-1,-0.57735,0.57735,-0.57735,0,0,0

   Triangle: ; Vertice x,y,z verbinden/Create Triangle
   Data.w 2,0,3
   Data.w 1,0,2
   Data.w 6,4,7
   Data.w 5,4,6
   Data.w 10,8,11
   Data.w 9,8,10
   Data.w 14,12,15
   Data.w 13,12,14
   Data.w 18,16,19
   Data.w 17,16,18
   Data.w 22,20,23
   Data.w 21,20,22
EndDataSection
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Drehpunkt verlagern

Beitrag von STARGÅTE »

Du hast du genau die gleiche Frage schon mal gestellt nur mit einer Fläche ...

Eigentlich solltest du daran erkannt haben welche Parameter geändert werden müssen damit die Ecken woanders sind.

Vorallem hast du ja sogar noch n Kommentar hingeschrieben:

Code: Alles auswählen

Vertice:  ;x,y,z,nx,ny,nz,col,u,v = Vertex + Normal + Col + UV Koordinaten
Da der Drehpunkt immer bei (0,0,0) ist, und deine Koordinaten (x,y,z) alle zwischen [-1,1] liegen, dreht er sich halt um die mitte.

Nun gibs ja verschiedene Verschiebungen:
- verschiebst du alle x-Koordinaten um +1, so würde der Drehpunkt an einer Seitenfläche liegen.
- verschiebst du alle x- und y-Koordinaten um +1, so würde der Drehpunkt an einer Kantemitte liegen.
- verschiebst du alle Koordinaten um +1, so würde der Drehpunkt an einer Ecke liegen liegen.

Ich dneke nun kannst du die betroffenen Änderungen bei Vertice selbst vornehmen
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Drehpunkt verlagern

Beitrag von super_castle »

Vertice: ;x,y,z,nx,ny,nz,col,u,v = Vertex + Normal + Col + UV Koordinaten
Der Würfel ist aus einer Demo.

Gruss
Antworten