如何从一个向量计算坐标系?

5 c++ math vector coordinate-systems

如何仅给定向量创建坐标系? (左手、右手、局部或不同空间)

在此输入图像描述

我正在搜索计算一种仅给定一个向量的局部坐标系统算法:

原因:

1)也许Z是表面法线,那么X和Y向量将是切线和双切线向量

2) 另一个原因是光线追踪:对光源进行采样。给定一个交点,从该点构造局部坐标系,然后将光线追踪到光形状。

Vector3 Z = {0.0f, 0.0f, 1.0f}; // given
// fill x and y
CreateXHandedCoordinateSystem(Vector3* X, Vector3* Y, const Vector3& Z) {
   // implementation goes here..
   // evaluate algorithm
   // calculate X
   // Y = cross(X, Z) or something ..
}
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以使用双叉积技巧。

  1. 取你的向量(我们称之为局部X)取任意向上向量(通常是世界向上向量)并计算叉积。这将是您本地的 Z。
  2. 取你的本地 X 和本地 Z 并计算叉积,这将是你的本地 Y


小智 0

假设给定向量的最小分量(绝对值)是Zz。然后定义X(Zy, -Zx, 0), 和Y = (-Zx.Zz, -Zy.Zz, Zx\xc2\xb2+Zy\xc2\xb2)

\n\n

如果最小分量不是Zz,则相应地调整公式。

\n\n

请注意,这些向量是非标准化的,并且我没有考虑惯用手。

\n