ARcore: как повернуть объект вокруг оси Y?

Интересно, как повернуть объект вокруг оси Y?

Например, я хотел бы повернуть дроида-бота в примере приложения Google hello_ar_java https://github.com/google-ar/arcore-android-sdk/tree/master/samples/hello_ar_java вокруг оси Y с углом альфа.


person Regis_AG    schedule 22.02.2018    source источник


Ответы (4)


Мне недавно пришлось сделать нечто подобное. В методе рисования средства визуализации объектов вы можете добавить:

    Matrix.translateM(mModelMatrix, 0, x, y, z);
    Matrix.rotateM(mModelMatrix, 0, rotationAngle, 0f, 1f, 0f);
    Matrix.translateM(mModelMatrix, 0, -x, -y, -z);
person ahomphophone    schedule 07.03.2018

Просто заставил это работать более простым способом, хотя это не обрабатывает дельту частоты кадров должным образом, это может быть полезным стартером. В моем классе, который расширяет 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));
    }
}
person edencorbin    schedule 01.10.2018

Я использовал Котлин для своего ответа.

Используйте Quaternions для поворота, чтобы избежать блокировки подвеса. Распространенное правило кватерниона состоит в том, что квадратный корень из квадратов чисел с плавающей запятой x, y, z и w всегда должен быть равен 1.

sqrt((x * x) + (y * y) + (z * z) + (w * w)) = 1

Чтобы повернуть куб вокруг Y Counter Clock Wise, используйте следующий код:

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)
    }
}

Надеюсь это поможет.

person Andy Fedoroff    schedule 08.04.2019

Это не проблема ARCore, а проблема OpenGL ES. Но для достижения желаемого вам нужно добавить поворот к матрице модели в ObjectRenderer.updateModelMatrix (float [] modelMatrix, float scaleFactor). Как делать вращение объясняется, например, здесь: http://www.learnopengles.com/tag/rotation/

person Steven Mohr    schedule 02.03.2018