给定矢量V =(x,y,z),我如何找到构成V轴的2个矢量?换句话说,其中一个垂直并位于同一平面,另一个垂直于这两个向量。
我需要这个在OpenGL中实现一个漂亮的摄像头管理器。
答案 0 :(得分:0)
只给出一个矢量,你可以找到无限数量的矢量垂直于它。特别是这组矢量形成了一个平面,你的给定矢量与其垂直。
鉴于某些矢量与第一个矢量不共线,您可以通过应用Gram-Schmidt orthogonalization找到垂直(=正交)矢量。让你的第一个向量为↑v ,↑u 是一些向量,这样↑u = / = l↑v,然后是一个垂直的↑u_ =↑u - ↑v (↑u·↑v)
答案 1 :(得分:0)
这个问题确实是StackOverFlow的主题,但我有一分钟。您要求形成三元组正交向量,其中两个与您给定的向量正交。最简单的方法是使用QR分解。
我将在MATLAB中完成,它可以很好地完成线性代数。从一些任意列向量v。
开始v = [1 2 3]'
v =
1
2
3
只有一列的那个数组的QR分解产生矩阵Q和R.我们只需要Q.
[Q,R] = qr(v);
Q的列给你你需要的东西。
Q =
-0.267261241912424 -0.534522483824849 -0.801783725737273
-0.534522483824849 0.774541920588438 -0.338187119117343
-0.801783725737273 -0.338187119117343 0.492719321323986
看到第一列只是v,缩放为“单位”向量。如果您不喜欢所产生的方向,我们也可以在任意轴上的一组轴上任意乘以-1。该矩阵的第二和第三列是与给定矢量正交的单位矢量。
当然,这不是你可能做到的唯一方法。例如,可以选择任何两个其他随机向量,然后使用Gram-Schmidt对三个向量的集合进行正交化。这是一个有效的方案,只要随机机会在您开始时不会产生一些线性相关集的向量。因此,该算法可能会失败,尽管极不可能。
另一种方案有效地使用了不超过一对交叉产品。因此,给定一些向量v1:
随机选择v2。
使用叉积,设置v3 = cross(v1,v2)。如果向量v3的范数为零,则返回步骤1,因为这意味着向量v1和v2是共线的。
设置v2 = cross(v1,v3)。
这个算法很简单,与Gram-Schmidt正交化有一些相似之处,但编写起来相当简单。您需要小心步骤2中的测试,因为测试数字是否正好为零并不是一个好主意。您可能还希望在计算向量时将向量缩放为单位范数,因为这将解决一些数值问题。
最后,我仍然更喜欢使用QR分解,因为它很简单,不需要测试“零”,因此不需要明确的容差。