在3d中仅给定一个向量构造正交基

在3d中仅给定一个向量构造正交基,3d,vector-graphics,base,3d,Vector Graphics,Base,我正在寻找一种简单有效的方法来解决以下问题: 我在3d中有一个向量,我想得到一个正交基(x,y,z),其中一个基向量(比如x)是给定的向量。我在寻找两个向量,相互垂直,也垂直于给定向量 我知道这有无限多的解决方案,但我不在乎我得到哪一个,只要它满足上述要求,并且得到它是简单有效的 让我们调用x你的单位向量。调用u=(1,0,0)。如果dot(u,x)~=0,则取u=(0,1,0)。然后,y=x^u和z=x^y为了摆脱Tibur的if,您可以通过使用便宜的(er)mul+float铸造获得轻微的改

我正在寻找一种简单有效的方法来解决以下问题:

我在3d中有一个向量,我想得到一个正交基(xyz),其中一个基向量(比如x)是给定的向量。我在寻找两个向量,相互垂直,也垂直于给定向量


我知道这有无限多的解决方案,但我不在乎我得到哪一个,只要它满足上述要求,并且得到它是简单有效的

让我们调用
x
你的单位向量。调用
u=(1,0,0)
。如果
dot(u,x)~=0
,则取
u=(0,1,0)
。然后,
y=x^u
z=x^y

为了摆脱Tibur的if,您可以通过使用便宜的(er)mul+float铸造获得轻微的改进

y = x ^ u
y.z += float(y==0); // this changes a zero-vector into (0,0,1)
z = x ^ y
与检查u==x相比,在叉积之后进行向量比较可以提供更稳定的解决方案,浮点转换取决于您的体系结构,但在大多数编译器/平台中都有效


基本上,当x与u共线时,这种基函数总是有一个奇点,所以试着从上下文中明智地选择u,记住u不一定是常数。在大多数情况下,您可以选择u与一个简单的情况重合,以便平滑奇点并保持整体变换的稳定。

谢谢,这很有效。我使用了您的解决方案,但做了一些小的修改:我将
u=(-x1,x0,x2)
放进去以避免if。只要向量
(x0,x1,x2)
(-x1,x0,x2)
是线性独立的,直觉上似乎是这样的(对巨大随机数据集的测试支持它)。我不同意你的
u
向量选择:
点((x0,x1,x2),(-x1,x0,x2))=-x0.x1+x0.x1+x2=x2.x2
。因此,只有当
x2!=0
。我认为使用这个向量是不安全的。不,我使用u向量只是为了帮助我像这样计算y和z:
u=(-x1,x0,x2);y=x^u;z=y^u
所以我不需要它垂直于x,只需要线性独立。嗯,现在我实际上做了一些数学运算,只看到当
x0
x1
都为零时,我对线性独立向量的选择失败了。似乎没有办法解决这个问题,如果…没有。当x2等于零时,
u
向量选择失败。我仍然认为我的
if
u=X
u=Y
测试是最可靠的。为什么要测试点(X,u)~=0?