Rotation um einen festen punkt... ich könnte reiern ^^

Previous topic - Next topic

Schranz0r

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
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Baggi

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

Schranz0r

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
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Baggi

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?

S.O.P.M.

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.
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

Schranz0r

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
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Baggi

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.

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Baggi

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.

Schranz0r

So hie rmal ein bild von dem was ich meine:

KLICK das Bild, für die volle größe!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

S.O.P.M.

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.
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

Kitty Hello

nur so eine idee: dreh das objekt wie Du willst, aber verschieb es vorher mit:
x_movement
x_pushmatrix

Schranz0r

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
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello


Schranz0r

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
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard