在三维空间中只给出一个向量,构造一个标准正交基



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

我有一个三维向量,我想得到一个标准正交基(xyz),其中一个基向量(假设x)是给定的向量。所以我要找的是两个相互垂直的向量,它们也垂直于给定的向量

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

我们称x为单位向量。呼叫u = (1,0,0)。若为dot(u,x) ~= 0,则取u = (0,1,0)。然后,y = x ^ uz = 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与一个平凡的情况相吻合,这样你就可以平滑奇点并保持整体变换的稳定。

相关内容

  • 没有找到相关文章

最新更新