Sprite3D um externen Punkt drehen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
MoonWolf
Beiträge: 17
Registriert: 31.07.2009 15:03

Sprite3D um externen Punkt drehen?

Beitrag 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 /:->
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprite3D um externen Punkt drehen?

Beitrag 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.
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
MoonWolf
Beiträge: 17
Registriert: 31.07.2009 15:03

Re: Sprite3D um externen Punkt drehen?

Beitrag von MoonWolf »

ok, danke.
:bounce:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprite3D um externen Punkt drehen?

Beitrag 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.
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
Antworten