我正在寻找一个简单有效的方法来解决以下问题:
我有一个三维向量,我想得到一个标准正交基(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) multi +float强制转换
获得轻微的改进。y = x ^ u
y.z += float(y==0); // this changes a zero-vector into (0,0,1)
z = x ^ y
在交叉积之后做一个向量比较会给你一个比检查u == x更稳定的解决方案,float强制转换取决于你的架构,但在大多数编译器/平台上都有效。
基本上当x与u共线时这种基函数总是有一个奇点,所以试着从上下文中明智地选择u,记住u不一定是常数。在大多数情况下,你可以选择u与一个平凡的情况相吻合,这样你就可以平滑奇点并保持整体变换的稳定。