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

5
如何仅通过向量创建坐标系?(左手坐标系、右手坐标系、本地坐标系或不同空间)

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
我真的不知道你想了解什么...... - Simon Kraemer
2
我投票关闭此问题,因为似乎没有具体的编程问题。 - NathanOliver
3个回答

5

你可以使用双重叉乘技巧。

  1. 取出向量(我们称其为本地X),再取任意上向量(通常是世界上向量)并计算其叉积。这将成为您的本地Z。
  2. 取出您的本地X和本地Z并计算交叉产品,这将成为您的本地Y。

请注意,使用任意向量 [0,0,1] 进行叉积运算时,如果给定的 Z=[0, 0, 1] 就是同一个向量,则结果可能为零。在这种情况下,您需要选择另一个轴来开始计算。 - Patrick Stalph

0

假设给定向量中绝对值最小的分量为Zz,则定义X=(Zy,-Zx,0),且Y=(-Zx.Zz,-Zy.Zz,Zx²+Zy²)

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

请注意这些向量未经归一化处理,我也没有考虑左右手坐标系。


很高兴听到更多细节,例如为什么(Zy,-Zx,0)是正交的。 - Patrick Stalph
@PatrickStalph 向量正交可以通过计算 X·Z、X·Y 和 Y·Z 并检查它们是否都为零来证明。例如,X·Z = ZxZy - ZyZx = 0。同时,可以轻松地检查到 X 叉乘 Y 指向负 Z 方向,因此如果您想要一个右手坐标系,必须交换 X 和 Y。 - DavidS
@PatrickStalph 我应该说:“如果你想要一个右手坐标系,你可以例如交换X和Y。”在这里使用“必须”太强烈了。 - DavidS

-1

只需使用坐标旋转概念。

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

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

通过在适当的平面上旋转来获取第三个轴。


谢谢Bibek。我添加了一些信息以澄清我的问题。如何通过点积将向量旋转90度?如果我知道向量z,如何使用某些数学和代码计算y或x向量。如果我找到y或z,叉积会给我其他向量。我知道两个向量的叉积会创建垂直向量。 - user5044221
不需要点积,只需旋转点并重新计算向量。 - Bibek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接