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
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.
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
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
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?
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.
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
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.
ja wenns so einfach wäre :D
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.
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)
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.
nur so eine idee: dreh das objekt wie Du willst, aber verschieb es vorher mit:
x_movement
x_pushmatrix
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
Äh? Gibt's das in Blitz?
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
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.
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