2012-01-04 55 views
4

好了,所以我试图让两个四元数的角度,它几乎完美的作品,但随后从问题获得两个四元数的角度

evec angle: 237.44999653311922 
evec angle: 119.60001380112993 

跳,我想不出为什么为了我的生活。 (注:evec是,就留在打印一个旧变量名)

总之,这里是我的代码:

FloatBuffer fb = BufferUtils.createFloatBuffer(16); 

// get the current modelview matrix 
GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, fb); 
Matrix4f mvm = new Matrix4f(); 
mvm.load(fb); 

Quaternion qmv2 = new Quaternion(); 
Matrix4f imvm = new Matrix4f(); 
Matrix4f.invert(mvm, imvm); 
qmv2.setFromMatrix(imvm); 
qmv2.normalise(); 

Matrix3f nil = new Matrix3f(); 
nil.setIdentity(); 
Quaternion qnil = new Quaternion(); 
qnil.setFromMatrix(nil); 
qnil.normalise(); 

float radAngle = (float)(2.0 * Math.acos(Quaternion.dot(qmv2, qnil))); 

System.out.println("evec angle: " + Math.toDegrees(radAngle)); 

如何让它停止从237跳到119,并继续上涨至全360?

+0

我现在对四元数学并不完全新鲜,但事实上,你得到的角度大于180°会让我感到腥味 - 并且表明逻辑中出现了问题。两个矢量之间没有超过180°的角度。 – Daniel 2012-02-06 01:35:16

回答

1

首先,几何上对你而言意味着什么对两个四维向量(=四元数)你可以计算它,但结果可能没有意义。也许你正在寻找两个四元数表示的旋转轴之间的角度?

其次,你这里有一个错误:

float radAngle = (float)(2.0 * Math.acos(Quaternion.dot(qmv2, qnil))); 
         ^^^^^ 

结果从acos的角度。不要乘以2.

第三,3D或4D空间中两个矢量之间的角度不能大于180°。在飞机上它可以因为飞机施加一个方向。在3D空间中,您必须将任意方向定义为“向上”以获得高于180°的角度。