Da sind der Planet und ein paar Satelliten im 3D-Raum. Ich muss die Rotationsachse für jeden Satelliten berechnen. Sie sollten sich um das Planetenzentrum drehen.
Ich berechnete den Vektor vom Satelliten zum Zentrum des Planeten.
%Vor%Mit vec1 und planetCenter kann ich die Gleichung der Ebene berechnen, die senkrecht auf vec1 steht.
Gleichung wie folgt:
%Vor%Jetzt sollte ich zufällig Vektor auf dieser Ebene bekommen. Dieser Vektor wird eine Rotationsachse sein. Aber wie kann ich diesen zufälligen Vektor bekommen?
Nun, wenn du die Ebene A.x + B.y + C.z + D = 0
hast, dann ist n(A,B,C)
der normale Vektor. Daher denke ich, dass der einfachste Ansatz für Ihre Aufgabe die Verwendung von Basisvektoren ist. Sie benötigen 2
senkrechte Vektoren auf dieser Ebene. Dafür können Sie Cross-Produkte nutzen. zuerst einige Definitionen:
Bekannte:
p
Planetenmittelpunkt (oder der Mittelpunkt Ihrer Rotationen oder jeder Punkt auf der Ebene, im schlimmsten Fall können Sie p=0,0,-D/C
oder eine andere Kombination ausprobieren ...) n
normaler Vektor q= (1,0,0) or (0,1,0)
wählte das mit dem kleineren |dot(n,q)|
Operationen:
vector = cross(a,b) = a
x b
- cross Produkt gibt den senkrechten Vektor an a,b
zurück
scalar = dot(a,b) = (a
. b)
- Punkt Produkt gibt 0
zurück, wenn a,b
lotrecht sind |a| = abs(a)
- abs alter Wert (sowohl Skalar als auch Vektor ) scalar = Rand()
- float pseudozufälliger Wert im Intervall <0.0,1.0>
Unbekannte:
u,v
- Basisvektoren
r
- Ihr pseudozufälliger Punkt Bekommen Sie also zuerst u,v
, indem Sie das Cross-Produkt ausnutzen:
Und jetzt der Punkt:
%Vor% Wenn Sie nur einen zufälligen Vektor wollen, dann ignorieren Sie die Startposition p
Das ist alles ... so können Sie u,v
einmal (pro normaler Vektoränderung) berechnen und r
so oft wie nötig generieren. Wenn u,v
Einheitsvektoren sind, erzeugt dies Punkte innerhalb von 2x2
square ... wenn Sie mehr oder weniger nur Skalen hinzufügen möchten ...
Siehe Ist es möglich, eine realistische n-Körper-Sonnensystem-Simulation zu erstellen? und zufällige Bahnparameter für Keplers Gleichung statt ...
Es scheint, dass Ihre Rotationsachse zufälliger Vektor sein könnte, der unabhängig von vec1 ist. Sie können einen Zufallseinheitsvektor mit einheitlicher Verteilung mithilfe von Methoden für Sphere Point Picking generieren.
Die Marsaglia-Methode (Gl. 9-11) ist praktisch, um diesen Vektor zu erzeugen:
Erzeuge x1 und x2 im Bereich -1..1 wie p = x1^2 +x2^2 <= 1
(schlechte Paare werden abgelehnt).
Dann
Jetzt ist deine Frage klar. Sie möchten das Objekt um ein anderes herum drehen, wie die Erde und die Sonne. Möglicherweise sind einige andere Lösungen verfügbar, aber ich würde es durch LookAt und parametrische Kreisgleichung machen.
x = r * cos(theta) + displacementX
z = r * sin(theta) + displacementZ
wo r
ist Radius, Entfernung in Ihrem Fall
displacementX
und displacementZ
sind die Entfernung vom Ursprung. Wenn beide ( displacementX
und displacementZ
) 0 sind, wird es um origin (0,0)
Im Objekt (Earth) -Skript tun Sie es wie folgt
%Vor%Sie können weiter damit spielen