Экстерьер камеры Tango

Внешняя матрица для калибровки камеры на основе ссылки MATLAB должна быть матрицей 4х3 (включая ориентацию и перевод), что означает, что нам нужно 12 элементов, однако, исходя из объяснения в документации Tango, мы получаем только 3 числа для перевода и 4 числа для вращения. Как я могу создать матрицу 4x3 с этими 7 числами?

Спасибо, Вахид.

1 ответ

Матрица просмотра используется для хранения этих значений. Это матрица 4х4, которая позволяет манипулировать 3D-позами (позициями + ориентациями).

Вы можете найти более подробную информацию об этой матрице здесь: http://www.3dgep.com/understanding-the-view-matrix/

Обратите внимание, что Java-библиотека Tango основана на 3D-библиотеке Rajawali. Вы можете увидеть структуру этого MatrixX44 здесь:

https://github.com/Rajawali/Rajawali/blob/master/rajawali/src/main/java/org/rajawali3d/math/Matrix4.java

В частности, следующий метод показывает, как хранятся 7 значений. Для удобства чтения можно предположить, что вектор масштаба включен (1,1,1)

public Matrix4 setAll(@NonNull Vector3 position, @NonNull Vector3 scale, @NonNull Quaternion rotation) {
    // Precompute these factors for speed
    final double x2 = rotation.x * rotation.x;
    final double y2 = rotation.y * rotation.y;
    final double z2 = rotation.z * rotation.z;
    final double xy = rotation.x * rotation.y;
    final double xz = rotation.x * rotation.z;
    final double yz = rotation.y * rotation.z;
    final double wx = rotation.w * rotation.x;
    final double wy = rotation.w * rotation.y;
    final double wz = rotation.w * rotation.z;

    // Column 0
    m[M00] = scale.x * (1.0 - 2.0 * (y2 + z2));
    m[M10] = 2.0 * scale.y * (xy - wz);
    m[M20] = 2.0 * scale.z * (xz + wy);
    m[M30] = 0;

    // Column 1
    m[M01] = 2.0 * scale.x * (xy + wz);
    m[M11] = scale.y * (1.0 - 2.0 * (x2 + z2));
    m[M21] = 2.0 * scale.z * (yz - wx);
    m[M31] = 0;

    // Column 2
    m[M02] = 2.0 * scale.x * (xz - wy);
    m[M12] = 2.0 * scale.y * (yz + wx);
    m[M22] = scale.z * (1.0 - 2.0 * (x2 + y2));
    m[M32] = 0;

    // Column 3
    m[M03] = position.x;
    m[M13] = position.y;
    m[M23] = position.z;
    m[M33] = 1.0;
    return this;
}
Другие вопросы по тегам