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

时间:2015-11-17 13:12:20

标签: c++ math vector coordinate-systems

如何只给出一个矢量来创建坐标系? (左撇子,右撇子,本地或不同的空间)

enter image description here

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

原因:

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 ..
}

3 个答案:

答案 0 :(得分:3)

你可以使用双十字产品技巧。

  1. 拿你的矢量(让我们称之为局部X)采取任意向上矢量(通常是世界向上矢量)并计算交叉乘积。这将是你当地的Z.
  2. 拿你当地的X和当地的Z并计算交叉产品,这将是你当地的Y

答案 1 :(得分:1)

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

如果最小的组件不是Zz,则相应地调整公式。

请注意,这些向量是非标准化的,我没有看到手性。

答案 2 :(得分:0)

只需使用坐标旋转概念。

最初,你有一个向量(假设在x方向)

现在将该矢量旋转90度,您将获得第二个轴(如果在XY平面中旋转90度,则为y轴)

类似地通过在适当的平面中旋转来获得第三轴。