寻找向量

时间:2012-12-17 00:56:17

标签: math opengl algebra

给定矢量V =(x,y,z),我如何找到构成V轴的2个矢量?换句话说,其中一个垂直并位于同一平面,另一个垂直于这两个向量。

我需要这个在OpenGL中实现一个漂亮的摄像头管理器。

2 个答案:

答案 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:

  1. 随机选择v2。

  2. 使用叉积,设置v3 = cross(v1,v2)。如果向量v3的范数为零,则返回步骤1,因为这意味着向量v1和v2是共线的。

  3. 设置v2 = cross(v1,v3)。

  4. 这个算法很简单,与Gram-Schmidt正交化有一些相似之处,但编写起来相当简单。您需要小心步骤2中的测试,因为测试数字是否正好为零并不是一个好主意。您可能还希望在计算向量时将向量缩放为单位范数,因为这将解决一些数值问题。

    最后,我仍然更喜欢使用QR分解,因为它很简单,不需要测试“零”,因此不需要明确的容差。

相关问题