我正在寻找一种简单有效的方法来解决以下问题:
我在3d中有一个向量,我希望得到一个正交基( x , y , z )其中一个基数向量(假设 x )是给定的向量。所以我正在寻找两个相互垂直的向量,它们也垂直于我给定的向量。
我知道这有很多解决方案,但我不关心我得到哪一个,只要它满足上述要求并使其简单有效。
答案 0 :(得分:0)
让我们调用你的单位向量x
。致电u = (1,0,0)
。如果是dot(u,x) ~= 0
,请点击u = (0,1,0)
。然后,y = x ^ u
和z = x ^ y
。
答案 1 :(得分:0)
要摆脱Tibur's if,你可以通过使用廉价(呃)mul + float cast来获得轻微改善
y = x ^ u
y.z += float(y==0); // this changes a zero-vector into (0,0,1)
z = x ^ y
在交叉产品之后进行矢量比较比检查u == x提供更稳定的解决方案,浮动转换取决于您的体系结构,但适用于大多数编译器/平台。
基本上,当x与u共线时,这种基函数总是具有奇点,所以尽量从上下文中明智地选择,记住你不必是常数。在大多数情况下,你可以选择你与一个简单的案例相吻合,这样你就可以平滑奇点并保持你的整体变换稳定。