【问题标题】:ARcore : how to rotate an object around its Y axis?ARcore:如何围绕 Y 轴旋转对象?
【发布时间】:2018-08-02 02:18:08
【问题描述】:
【问题讨论】:
标签:
opengl-es
opengl-es-2.0
augmented-reality
arcore
【解决方案1】:
我最近不得不做类似的事情。在对象渲染器的draw方法中可以添加:
Matrix.translateM(mModelMatrix, 0, x, y, z);
Matrix.rotateM(mModelMatrix, 0, rotationAngle, 0f, 1f, 0f);
Matrix.translateM(mModelMatrix, 0, -x, -y, -z);
【解决方案2】:
刚刚以更简单的方式工作,虽然这不能正确处理帧速率增量,但它可能是一个有用的启动器。在我扩展 AnchorNode 的类中,我在类中定义了我的新节点,因此它可以像这样使用:
private Node myNode = null;
然后像这样覆盖 onUpdate:
@Override
public void onUpdate(FrameTime frameTime) {
super.onUpdate(frameTime);
if (myNode!=null){
Quaternion q1 = myNode.getLocalRotation();
Quaternion q2 = Quaternion.axisAngle(new Vector3(0, 1f, 0f), .2f);
myNode.setLocalRotation(Quaternion.multiply(q1, q2));
}
}
【解决方案3】:
我使用 Kotlin 作为答案。
使用Quaternions 进行旋转以避免Gimbal Lock。一个常见的四元数规则是浮点数的平方根x、y、z 和w 应始终等于1。
sqrt((x * x) + (y * y) + (z * z) + (w * w)) = 1
要围绕Y 旋转立方体逆时针方向,请使用以下代码:
var value: Float = 5.0
override fun onLeft(value: Float) {
cubeNode.apply {
Log.d("left", value.toString())
localRotationCCW = Quaternion.axisAngle(Vector3(0.0f, 1.0f, 0.0f), value)
}
}
要围绕Y 旋转立方体Clock Wise,请使用以下代码:
var value: Float = 5.0
override fun onRight(value: Float) {
cubeNode.apply {
Log.d("right", value.toString())
localRotationCW = Quaternion.axisAngle(Vector3(0.0f, 1.0f, 0.0f), -value)
}
}
希望这会有所帮助。