c# - 在平面上获取随机 vector3

标签 c# math vector unity3d geometry

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 x b - 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/

相关文章:

c++ - 我们可以使用 const_cast 将 const vector<string> 转换为 vector<string> 吗?

c++ - 在没有特定容器时检查迭代器是否未分配给项目

c# - 在csproj文件中配置XamlRuntime和DefaultXamlRuntime意义

c# - 在 Entity Framework 中创建动态 linq 排序和搜索顺序语句时

c# - 二叉树到数学表达式

python - pyEphem - 计算非地球卫星的位置

c# - Linq 到实体 "does not recognize the method ... method, and this method cannot be translated into a store expression."

c# - 动态修改 LINQ to SQL Select 语句的列

python - 为什么 scipy.special.comb 和 math.comb 之间存在差异?

c++ - 无法使用 Microsoft Visual Studio 2012 列出初始化 vector