3d 空间中有行星和一些卫星。我需要计算每颗卫星的旋转轴。它们应该围绕行星中心旋转。
我计算了从卫星到地球中心的矢量。
vec1 = planetCenter - sputnikCenter;
有了 vec1 和 planetCenter,我可以计算垂直于 vec1 的平面方程。
这样的等式:
A.x + B.y + C.z + D = 0
现在,我应该得到这个平面上的随机向量。该矢量将是旋转轴。但是我怎样才能得到这个随机向量呢?
最佳答案
好吧,如果你有飞机 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
xb
- cross 乘积返回到a,b
的垂直向量 -
scalar = dot(a,b) = (a
.b)
- dot 产品返回0
如果a,b
是垂直的 -
|a| = abs(a)
- absolute 值(标量 和矢量) -
scalar = Rand()
- float 区间上的伪随机值<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 生成随机轨道参数相反......
关于c# - 在平面上获取随机 vector3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34461656/