GLBasic forum

Other languages => GLBasic - de => Topic started by: Schranz0r on 2007-Oct-28

Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Schranz0r on 2007-Oct-28
Also hallo erstmal...

Ich hab grad ein kleines Problemchen, mit einer Rotation um einen festen Punkt, und einen bestimmten Abstand!

Wie mach ich das in 3D....

ich brauch doch 2 Winkel , XY und XZ z.B

aber wie setzt sich das dann in 3D zusammen?


naja so in etwar doch oder?

Pos_x = x+Cos(XZ)*abstand

Aber ich komm nicht drauf das der sich richtig um einen Punkt dreht -.-

HELP :D
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Baggi on 2007-Oct-28
Hi SchranzOr,

probier das hier mal, wobei du die 3DPrimitives.gbas noch einbinden musst.
Du kannst im 3D jeden Punkt mit Kugelkoordinaten ereichen:

x=R*SIN(theta)*COS(phi)
y=R*COS(theta)
z=R*SIN(theta)*SIN(phi)

wobei phi der winkel in der xz Ebene ist und theta der Winkel mit der y-achse.
R ist der Abstand zum Koordinatenursprung. Wenn du ein Objekt jetzt im Abstand R um den Ursprung drehen willst, dann suchst du dir eine beliebige Drehebene heraus, z.B. die xz Ebene. Dann müsstest du theta=90 setzen und phi von 0 bis 360 drehen für eine komplette Rotation.

Code (glbasic) Select
phi=0
theta=0
psi=0
R=40

main:
X_MAKE3D 100, 8000, 45
X_AMBIENT_LT 0, RGB(255,255,255)
X_CAMERA -100,100,-100,0,0,0


//3d koordinaten
X_LINE 0,0,0,100,0,0,2,RGB(200,0,0) //x
X_LINE 0,0,0,0,100,0,2,RGB(0,200,0) //y
X_LINE 0,0,0,0,0,100,2,RGB(0,0,200) //z


CreateSphere(0, 10, 12, RGB(100,100,100)) //koordinatenursprung
X_MOVEMENT 0,0,0
X_ROTATION 0,0,1,0
X_DRAWOBJ 0,0

CreateSphere(1, 4, 12, RGB(0,0,200)) //rotierende kugel mit theta=90
CreateSphere(2, 4, 12, RGB(0,200,200)) //rotierende kugel mit theta=10
CreateSphere(3, 4, 12, RGB(200,0,200)) //rotierende kugel mit phi=konstant

phi=phi+1
IF phi>=360
phi=0
ENDIF


////////////////////////////////////////
theta=90
x=R*SIN(theta)*COS(phi)
y=R*COS(theta)
z=R*SIN(theta)*SIN(phi)

X_MOVEMENT x,y,z
X_ROTATION 0,0,1,0
X_DRAWOBJ 1,0
////////////////////////////////////////


////////////////////////////////////////
theta=10
x=R*SIN(theta)*COS(phi)
y=R*COS(theta)
z=R*SIN(theta)*SIN(phi)

X_MOVEMENT x,y,z
X_ROTATION 0,0,1,0
X_DRAWOBJ 2,0
////////////////////////////////////////


psi=psi+1
IF psi>360
psi=0
ENDIF
////////////////////////////////////////
x=R*SIN(psi)*COS(90)
y=R*COS(psi)
z=R*SIN(psi)*SIN(90)

X_MOVEMENT x,y,z
X_ROTATION 0,0,1,0
X_DRAWOBJ 3,0
////////////////////////////////////////



X_MAKE2D

PRINT "phi= " + phi,10,10
 

SHOWSCREEN
GOTO main
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Schranz0r on 2007-Oct-28
ne nicht ganz sowas..

Stell dir das vor wie beim X_ROTATION nur mit abstand zur mitte das der Drehpunk quasi ausserhalb des Models liegt
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Baggi on 2007-Oct-28
hmmm, die blaue und die magenta Kugel machen doch genau das, sie drehen sich im Abstand R um den Koordinatenursprung, oder verstehe ich dich immer noch nicht richtig?
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: S.O.P.M. on 2007-Oct-28
Vielleicht so?
1. Zuerst Abstand zwischen den 2 Punkten ausrechnen: Abstand = SQR(POW(x1 - x2, 2) + POW(y1 - y2, 2))
2. Dann Winkel bestimmen: Winkel = ATAN(x1 - x2, y1 - y2)
3. Neuen Winkel festlegen
4. Neue Position des Punkes nach der Rotation: x2 = SIN(Winkel) * Abstand und y2 = COS(Winkel) * Abstand

x1, y1 wäre dann der Bezugspunkt, um den du rotierst. Je nach dem, um welche Achse (x, y, z) du rotieren möchtest, musste dann entsprechend jeweils 2 Werte davon einsetzen.
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Schranz0r on 2007-Oct-28
hmm nee , versteh ich nicht :D

@ Baggi:

ne das ist net sowas, ich will es so angeben Rotation (entfernung, rotx,roty,rotz)

Jenachdem was ich jetzt als werte eingeb, Rotation(5,1,0,1)
er soll sich jetzt so verhalten wie bei X_ROTATION nur mit dem Drehpunkt halt ausserhalb des Modeles
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Baggi on 2007-Oct-28
Dann kannst du doch die Position der neuen Rotationsachse, die um "entfernung" zur alten verschoben ist ausrechnen und dann das Objekt rotieren.

Oder erst Objekt rotieren und dann an die neue Position verschieben.
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Schranz0r on 2007-Oct-28
ja wenns so einfach wäre :D
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Baggi on 2007-Oct-28
verstehe ;) ist also komplizierter als es aussieht.
Ich muss sagen, ich hab noch nicht verstanden was du machen willst. Du willst es also nicht so machen wie in meinem Beispiel, ein Objekt im Abstand R um einen Punkt rotieren lassen. Du willst sowas wie x_rotation machen, also das Objekt um eine Achse drehen.
QuoteX_ROTATION nur mit dem Drehpunkt halt ausserhalb des Modeles
Das verstehe ich noch nicht. Wenn der Drehpunkt ausserhalb des Modells ist, dann ist es genau sowas wie in meinem Beispiel, also der Mond um die Erde oder so ;) . Wenn sich das Objekt nicht wie der Mond um die Erde sondern eher wie ein festgehaltener Mond um sich selbst also wie X_ROTATION drehen soll, dann brauchst du die neue Drehachse im Mond drin.
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Schranz0r on 2007-Oct-28
So hie rmal ein bild von dem was ich meine:

KLICK das Bild, für die volle größe!
(http://www.styleattax.de/rotation.png) (http://www.styleattax.de/rotation.png)
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: S.O.P.M. on 2007-Oct-28
Naja genauso glaube ich, hat es auch jeder verstanden. Mit den gegebenen Formeln solltest du erreichen können, was du möchtest! Du musst sie eben nur für deinen Code anpassen. Dass das mit der Rotation um einen Drehpunkt außerhalb des Objektes auf diese Weise klappt, weiß ich, weil ich es bei meinem aktuellen Projekt genauso gemacht habe.
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Kitty Hello on 2007-Oct-28
nur so eine idee: dreh das objekt wie Du willst, aber verschieb es vorher mit:
x_movement
x_pushmatrix
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Schranz0r on 2007-Oct-28
wow hatte ich schon versucht, ging aber nicht....
Nochmal alles neu gemacht, und dann hab ich den fehler entdeckt :D

Geht jetzt astrein!

PS.: Ab morgen gibts ne art "Pin to Parent" fürs Entitysystem ;)
Habs bis jetzt nur bei meinen eigenen EntitySystem(Aus übungszwecken um es zu verstehen, was aber doch schon ganz gut ist ^^) drin, werds aber noch auf deins(Gernot's) umschreiben hoffe ich, wenn alles klappt :D
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Kitty Hello on 2007-Oct-29
Äh? Gibt's das in Blitz?
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Schranz0r on 2007-Oct-29
Ja z.B die Cam kann man an ein Model "Heften", ich dachte mir das mach ich auch, und mach gleich noch die möglichkeit das Parent als Drehpunkt zu nehmen... ;)

Gibts noch Probleme wenn ich ein Model an einen Parent hänge der schon ein Parent ist ....
Aber das bekomm ich heute noch gebacken :D
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Kitty Hello on 2007-Oct-29
uh-oh. Jetzt wird's kompliziert.
Du musst die matrix vom parent nehmen, invertieren, die position/rotation vom "kind" draufmultiplizieren.
Dazu müsste man äh... eine lokale Matrix vom Kind haben, oder?
Oh mann, mein Kopf... Das wird echt kompliziert, wenn das auch für die Kamera gehen soll.
Title: Rotation um einen festen punkt... ich könnte reiern ^^
Post by: Schranz0r on 2007-Oct-29
die soll ja nicht mir der Rotation des Models mitgehn....hmmm Obwohl :D

Wenn du eine Idee hast....wie würde es Herr Tramitz  bei Lisi(alias Sisi) sagen....: "Rück raus du sauuuuuuuu" :D