Seite 1 von 1

Sprite3D um externen Punkt drehen?

Verfasst: 10.06.2010 13:36
von MoonWolf
Hallo,
Ich möchste ein Sprite3D um einen Punkt außerhalb des Sprites drehen. gibt es dafür eine Funktion oder muss ich X und Y extra Berechnen?
Danke für Antworten /:->

Re: Sprite3D um externen Punkt drehen?

Verfasst: 10.06.2010 13:42
von STARGÅTE
Nein gibt es nicht!

Du kannst stattdessen zB diese Procedure von mir nutzen:
Universalprocedure für Sprite3D

Dort kannst du genau das machen, ein beliebiges Sprite3D irgendwo darstellen und rotieren wobei das Rotationszentrum verschoben sein darf.

Die ist zwar von 2006, sollte aber noch gültig sein :allright:


Oder einfach RotateSprite3D() nutzen, dann aber selber bei DisplaySprite3D das Sprite verschieben.

Re: Sprite3D um externen Punkt drehen?

Verfasst: 10.06.2010 13:44
von MoonWolf
ok, danke.
:bounce:

Re: Sprite3D um externen Punkt drehen?

Verfasst: 10.06.2010 13:59
von STARGÅTE
Der Form halber hier noch mal eine etwas neuere Version und ein Beispiel:

Code: Alles auswählen

InitSprite()
InitSprite3D()

Procedure DisplayTransformedSprite3D(Sprite3D.i, x.f, y.f, Width.f, Height.f, Angle.f, xShift.f, yShift.f, Transparency.i)
  Protected r.f = Sqr(Width*Width+Height*Height)/2 ; Radius
  Protected t.f = ATan(Width/Height) ; Tau
  Angle = Radian(Angle)
  Protected a1.f = Angle       - t 
  Protected a2.f = Angle       + t 
  Protected a3.f = Angle + #PI - t
  Protected a4.f = Angle + #PI + t
  TransformSprite3D(Sprite3D, Cos(a1)*r, Sin(a1)*r, Cos(a2)*r, Sin(a2)*r, Cos(a3)*r, Sin(a3)*r, Cos(a4)*r, Sin(a4)*r)
  DisplaySprite3D(Sprite3D, x-Cos(Angle)*yShift+Sin(Angle)*xShift, y-Sin(Angle)*yShift-Cos(Angle)*xShift, Transparency)
EndProcedure


OpenWindow(0, 0, 0, 800, 600, "SCREEN", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)
 
  CreateSprite(0, 256, 256, #PB_Sprite_Texture)
  StartDrawing(SpriteOutput(0))
    Box(0,0,256,256,$FFFFFF)
    Circle(128,0,16,$008000)
    Circle(128,256,64,$000080)
  StopDrawing()
  CreateSprite3D(0,0)
 
Repeat

  Event = WindowEvent()

  ClearScreen(0)

  Angle.f + 1
 
  Start3D()
    DisplayTransformedSprite3D(0, 64, 64, 128, 128, 0, 0, 0, 255)
    DisplayTransformedSprite3D(0, 400, 300, 128, 256, Angle, 0, 128, 128) 
  Stop3D()

  FlipBuffers()

Until Event = #PB_Event_CloseWindow
Hinweis: Dafür ist schon PB 4.50 nötig (wegen der Procedure Radian() )
was jedoch einfach nur *#Pi/180 ist.