在飞机上获得随机vector3

时间:2015-12-25 09:27:14

标签: c# math vector unity3d geometry

在3d空间中有行星和一些卫星。我需要计算每颗卫星的旋转轴。它们应围绕行星中心旋转。

我计算了从卫星到地球中心的矢量。

vec1 = planetCenter - sputnikCenter;

使用vec1和planetCenter,我可以计算平面方程,垂直于vec1。

这样的等式:

A.x + B.y + C.z + D = 0

现在,我应该在这架飞机上得到随机矢量。该向量将是旋转轴。但是我怎样才能得到这个随机向量?

3 个答案:

答案 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是半径,距您的距离 displacementXdisplacementZ是与原点的距离。如果两者(displacementXdisplacementZ)都为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