使用rotate方法在JMonkeyEngine中旋转几何体有什么区别:
float r = FastMath.DEG_TO_RAD * 45f; // convert degrees to radians
geom.rotate(r, 0.0f, 0.0f); // rotate the geometry around the x-axis by 45 degrees
使用四元数旋转几何体:
Quaternion roll045 = new Quaternion(); // create the quaternion
roll045.fromAngleAxis(45*FastMath.DEG_TO_RAD, Vector3f.UNIT_X); // supply angle and axis as arguments)
geom.setLocalRotation(roll045); // rotate the geometry around the x-axis by 45 degrees
这对我来说很困惑,因为两者的结果相同。所以我想找出差异以及何时使用其中一个。
我正在阅读的书中说第一种方法是相对的,而使用四元数的第二种方法是绝对的,但我对这意味着什么仍然模糊。
答案 0 :(得分:4)
使用四元数和使用欧拉角之间的差异
对于标题中的问题,使用四元数和角度表示之间没有功能差异,实际上.rotate()
函数内部是
public Spatial rotate(float xAngle, float yAngle, float zAngle) {
TempVars vars = TempVars.get();
Quaternion q = vars.quat1;
q.fromAngles(xAngle, yAngle, zAngle);
rotate(q);
vars.release();
return this;
}
换句话说,无论您是否直接使用四元数,都使用四元数。
.rotate()和.setLocalRotation()之间的区别
然而您使用的两个函数并不等效,实际上.rotate(angles)
和.rotate(quaternion)
都有({{1} }}仅适用于四元数)。因此,问题的第二部分是.setLocalRotation()
和.rotate(anything)
之间的区别。再看一下源代码,我们得到了答案
.setLocalRotation(anything)
public Spatial rotate(Quaternion rot) {
this.localTransform.getRotation().multLocal(rot);
setTransformRefresh();
return this;
}
因此,public void setLocalRotation(Quaternion quaternion) {
localTransform.setRotation(quaternion);
setTransformRefresh();
}
将对象(在其本地框架中)从现在的位置旋转,而.setLocalRotation()更改旋转,而不管它在何处现在强>
<强>结论强>
如果您的对象当前没有旋转,则两个函数是相同的,但是如果对象已经旋转,那么它们相当于“以及当前旋转”和“而不是当前旋转”。
与标准角度方法相比,四元数有许多优点;最明显的是避免gimbal lock。 可以使用四元数的地方做使用它们。角度方法都是方便的方法,可以在您需要时帮助您。