ARcore:如何围绕 Y 轴旋转对象?

Posted

技术标签:

【中文标题】ARcore:如何围绕 Y 轴旋转对象?【英文标题】:ARcore : how to rotate an object around its Y axis? 【发布时间】:2018-08-02 02:18:08 【问题描述】:

我想知道如何围绕 Y 轴旋转对象。

例如,我想将 Google 示例应用程序 hello_ar_java https://github.com/google-ar/arcore-android-sdk/tree/master/samples/hello_ar_java 的机器人机器人绕 Y 轴旋转,角度为 alpha。

【问题讨论】:

【参考方案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。一个常见的四元数规则是浮点数的平方根xyzw 应始终等于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)
    

希望这会有所帮助。

【讨论】:

【参考方案4】:

这不是 ARCore 问题,而是 OpenGL ES 问题。但是要实现您想要的,您必须在 ObjectRenderer.updateModelMatrix(float[] modelMatrix, float scaleFactor) 中将旋转添加到模型矩阵。解释了如何进行旋转,例如这里:http://www.learnopengles.com/tag/rotation/

【讨论】:

以上是关于ARcore:如何围绕 Y 轴旋转对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 webgl 和 glMatrix 围绕世界轴旋转对象

如何围绕轴旋转三个js的对象?

如何围绕节点的 Y 轴旋转 SKSpriteNode?

如何匹配另一个对象的旋转增量?

如何围绕任意轴旋转一个点?

使用OpenGL在C ++中同时围绕其(x,y&z)轴旋转对象