在3d空间中有行星和一些卫星。我需要计算每颗卫星的旋转轴。它们应围绕行星中心旋转。
我计算了从卫星到地球中心的矢量。
vec1 = planetCenter - sputnikCenter;
使用vec1和planetCenter,我可以计算平面方程,垂直于vec1。
这样的等式:
A.x + B.y + C.z + D = 0
现在,我应该在这架飞机上得到随机矢量。该向量将是旋转轴。但是我怎样才能得到这个随机向量?
答案 0 :(得分:2)
如果你得到了飞机A.x + B.y + C.z + D = 0
,那么n(A,B,C)
就是法线向量。因此,我认为最简单的方法是使用基础向量。因此,您需要在此平面上使用2
个垂直向量。为此,您可以利用跨产品。首先是一些定义:
<强>的已知,强>
p
行星中心位置(或旋转的中心点或飞机上的任何点,所以在最坏的情况下,您可以尝试p=0,0,-D/C
或任何其他组合......)n
法向量q= (1,0,0) or (0,1,0)
选择了|dot(n,q)|
<强>操作:强>
vector = cross(a,b) = a
x b
- 交叉产品将垂直向量返回到a,b
scalar = dot(a,b) = (a
。 b)
- 点产品如果0
垂直则返回a,b
|a| = abs(a)
- abs olute值(标量和向量)scalar = Rand()
<0.0,1.0>
- 浮动伪随机值
<强>未知强>
u,v
- 基础向量 r
- 您的伪随机点首先通过利用跨产品来获取u,v
:
u=cross(n,q)
v=cross(n,u)
现在要点:
r = p + u*(2.0*Rand()-1.0) + v*(2.0*Rand()-1.0)
如果您只想要随机向量,则忽略起始位置p
r' = u*(2.0*Rand()-1.0) + v*(2.0*Rand()-1.0)
这就是全部...所以你可以计算u,v
一次(每次正常向量更改)并根据需要生成r
。如果u,v
是单位向量,那么这将在2x2
平方内生成点...如果您想要或多或少只是为它们添加标度......
请参阅Is it possible to make realistic n-body solar system simulation?并生成Kepler's equation的随机轨道参数,而不是......
答案 1 :(得分:0)
现在你的问题很清楚了。你想围绕另一个旋转物体,如地球和太阳。也许可以使用其他一些解决方案,但我会通过LookAt和圆的参数方程来实现。
x = r * cos(theta) + displacementX
z = r * sin(theta) + displacementZ
其中r
是半径,距您的距离
displacementX
和displacementZ
是与原点的距离。如果两者(displacementX
和displacementZ
)都为0,那么它将围绕origin (0,0)
旋转
在对象(地球)脚本中,按照以下步骤进行操作
public Transform _sun;
float _theta = 0;
void Start ()
{
StartCoroutine ("ChangeAngle");
}
void Update ()
{
transform.LookAt (_sun);
float newX = (5 * Mathf.Cos (_theta)) + _sun.position.x;
float newZ = (5 * Mathf.Sin (_theta)) + _sun.position.z;
transform.position = new Vector3 (newX, _sun.position.y, newZ);
}
IEnumerator ChangeAngle ()
{
while (true) {
yield return new WaitForSeconds (0.01f);
_theta += 0.1f;
if (_theta >= 360)
_theta = 0;
}
}
你可以进一步玩它
答案 2 :(得分:0)
看起来你的旋转轴可能是独立于vec1的随机向量。 您可以使用Sphere Point Picking的方法生成具有均匀分布的随机单位向量。
Marsaglia方法(方程9-11)方便生成此向量:
生成范围-1..1中的x1和x2,例如p = x1^2 +x2^2 <= 1
(拒绝坏对)
然后
x = 2 * x1 * Sqrt(1 - p)
y = 2 * x2 * Sqrt(1 - p)
z = 1 - 2 * p