Bildrotation in Draw3D

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

N0X

Betreff: Bildrotation in Draw3D

BeitragDi, Jan 12, 2010 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Ich möchte ein Bild zum Mauszeiger rotieren lassen. (Draw3D)
Hier mein Ansatz, was mache ich falsch?

Code: [AUSKLAPPEN]
Include "Includes\Draw3D.bb"

Graphics3D 1024,768,32,2
SetBuffer BackBuffer()

Local timer = CreateTimer(60)
Local cam = CreateCamera()

CameraClsColor cam,64,64,64

DrawInit3D(cam)
Origin3D(1024,768)

Local player = LoadImage3D("gfx\player.bmp")

Local Button=0,BildX=0,BildY=0

Local Scale#=.5

While Not KeyHit(1)
   Angle=ATan2(MouseY()-BildY,MouseX()-BildX)

   DrawImage3D(player,BildX,BildY,Button,Angle*2,Scale#)
   
   WaitTimer(timer)
   RenderWorld
   Clear3D()
   Flip 0
Wend
End


Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Jan 12, 2010 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
   If MouseHit(1) Then
      BildX=MouseX3D
      BildY=MouseY3D
   End If
   
   Angle#=ATan2(MouseX3D-BildX,MouseY3D-BildY)
   
   DrawImage3D(player,BildX,BildY,Button,Angle#,Scale#)


Die Draw3D hat ein etwas anderes Koordinatensystem. Da gilt es das auch zu nutzen. Das fängt damit an, dass nicht die Mausfunktionen MouseX() benutzt werden, sondern die globalen Variablen der Draw3D MouseX3D dazu benutzt werden sollen. Außerdem fällt bei der Draw3D die vertauschen der Koordinaten bei ATan2 weg. Das heisst, es wird zuerst X dann Y eingetragen.

TimBo

BeitragMi, Jan 13, 2010 8:08
Antworten mit Zitat
Benutzer-Profile anzeigen
btw:

Zitat:
Außerdem fällt bei der Draw3D die vertauschen der Koordinaten bei ATan2 weg.


woher kommt das eigentlich ?
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Jan 13, 2010 14:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Keine Ahnung, aber es funktioniert. Vielleicht erlang man Erkenntnis, wenn man den ATan2-Befehl auf Atan auflöst.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragMi, Jan 13, 2010 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Falls man den Winkel mit Atan messen würde, sähe der Funktionsaufruf ja irgendwie so aus BlitzBasic: [AUSKLAPPEN]
Local Angle# = ATan( DistanzY/DistanzX )

Vielleicht war es damals logisch, das Divisionszeichen einfach durch ein Komma zu ersetzen, dass dann Atan2( DistanzY, DistanzX ) draus wurde.

Es gibt aber auch (vor allem wissenschaftliche Programme ), die eine Atan2( x, y ) - Schreibweise verwenden; in der Programmierwelt aber hat sich die umgekehrte Version eingebürgert.

Der Grund, wieso es im Koordinatensystem der Draw3D umgekehrt als normal ist, liegt wohl an der invertierten Y-Achse. Würde man statt Atan2( X, Y ) einfach Atan2( -Y, X ) + 90 angeben (-Y wegen der invertierten Achse und + 90 als Offset), käme man auf die gleichen Resultate BlitzBasic: [AUSKLAPPEN]
SeedRnd MilliSecs()

Local Y# = Rnd( -50.0, 50.0 )
Local X# = Rnd( -50.0, 50.0 )

Print ATan2( -Y#, X# ) + 90
Print ATan2( X#, Y# )
WaitKey()
End
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Jan 13, 2010 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm, aber mit deinen ''+90'' erreichst du ja nichts anderes, als das du X und Y vertauscht. Denn genau das ist ja überhaupt der Winkelunterschied zwischen X und Y, die 90°-Versetzung. So kann man genauso gut allein mit Sin oder allein mit Cos seine Winkel berechnen.

Generell (cos und sin) Code: [AUSKLAPPEN]
X=200+Cos(Winkel)*180
Y=200+Sin(Winkel)*180

ist identisch mit

Alternativ (allein nur sin) Code: [AUSKLAPPEN]
X=200+Sin(Winkel+90)*180
Y=200+Sin(Winkel)*180

ist identisch mit

Vertauscht (sin und cos) Code: [AUSKLAPPEN]
X=200+Sin(-Winkel+90)*180
Y=200+Cos(-Winkel+90)*180


Edit1: ok, also mir fällt noch was ein. In der Draw3D ist Angle=0 ein ungedrehtes Bild, welches bei +Angle sich rechts rum dreht. Also im Uhrzeigersinn. In der 3D-Programmierung dagegen dreht sich ein Objekt in seiner Z-Achse (vorrausgesetzt die Kamera hat den Winkel 0,0,0 und schaut nun das Objekt vor sich an) gegen den Uhrzeigersinn. Ich habs in der Draw3D dann einfach so gemacht, das positive Werte eben ein Bild im Uhrzeigersinn drehen. Ob es aus der Sicht der Mathematik falsch ist oder nicht kann ich nicht sagen. Aber bei einer 2D-Graphiclibrary wollte ich keinesfalls gegen den Uhrzeigersinn drehen lassen.

Edit2: so, habs grad mal auf BlitzMax ausprobiert und da drehen positive Werte de Bilder auch im Uhrzeigersinn. Hab ich übrigens auch von anderen Graphiclibrarys noch so im Sinn. Von daher alles bestens.

Noobody

BeitragMi, Jan 13, 2010 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
hectic hat Folgendes geschrieben:
Hmmm, aber mit deinen ''+90'' erreichst du ja nichts anderes, als das du X und Y vertauscht.

+ 90 alleine vertauscht nicht X und Y Wink

Probier mal folgenden Code BlitzBasic: [AUSKLAPPEN]
SeedRnd MilliSecs()

Local Y# = Rnd( -50.0, 50.0 )
Local X# = Rnd( -50.0, 50.0 )

Print ATan2( X#, Y# )
Print ATan2( Y#, X# )
WaitKey()
End

Die beiden Werte liegen nicht nur um 90 Grad auseinander. Wenn du X und Y vertauschst, wechselst du nämlich den Drehsinn; wenn du das erste Print durch ein "Print -ATan2( X#, Y# ) + 90" ersetzt, erhältst du bei beiden die gleichen Werte. Sprich, negatives Atan2 (=> umgekehrter Drehsinn) und dann die 90° Offset wegen der vertauschten Achsen.

Dass du die Bilder im Uhrzeigersinn drehst, erklärt es dann. Da du sowieso einen umgekehrten Drehsinn in der Draw3D benutzt, als in der Mathematik verwendet wird, kann man sich das negieren des Atan-Wertes sparen. Die +90° werden dann wohl von der invertierten Y-Achse ausgeglichen.

Persönlich finde ich ein System, bei dem im Gegenuhrzeigersinn gedreht wird, intuitiver, da es sich auch mit der mathematischen Denkweise deckt (und da um die Z-Achse in B3D ja auch im Gegenuhrzeigersinn gedreht wird, wenn man eine unrotierte Kamera hat). Dass in Max2D das Uhrzeigersinn-System verwendet wird, hat mich schon immer ein wenig gestört, aber das ist wohl Geschmackssache.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

TimBo

BeitragMi, Jan 13, 2010 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich verstehe es ja mit dem Sinus und dem Cosinus. Das ist ja keien Kunst.
Aber das mit den +90° und der Invertierten Achse und dann noch der anderen Drehrichtung ist mir jetzt heute Abend zu hoch.

Ich versuche es morgen in der Schule genauer zu betrachten.

Vielen Dank trotzdem:)

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group