Seite 1 von 1

Drehpunkt verlagern

Verfasst: 02.10.2010 11:31
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

Re: Drehpunkt verlagern

Verfasst: 02.10.2010 12:36
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

Re: Drehpunkt verlagern

Verfasst: 02.10.2010 15:35
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