Как я могу вычислить матрицу проекции, заданную ARKamera ARKit? - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь перепроектировать projectionMatrix ARCamera (для: viewportSize: zNear: zFar:) , но я получаю неправильные значения для m[2][0] и m[2][1] (основной столбец) , Вот что я получил до сих пор (я использую ориентацию landscapeRight):

// intrinsics:
//   933.9137        0.0   617.7059
//        0.0   933.9137   363.0624
//        0.0        0.0        1.0
//
// viewportSize:
//   width: 700.0, height: 300.0
//
// imageSize (obtained from ARKit's camera):
//   width: 1280.0, height: 720.0
//
// zNear: 0.007, zFar: 1300.0
//
// Calculated matrix:
//   1.4592402         0.0   0.034834575            0.0
//         0.0   3.4048939   0.034834575            0.0
//         0.0         0.0    -1.0000054   -0.007000038
//         0.0         0.0          -1.0            0.0
//
// Expected matrix from projectionMatrix(for:viewportSize:zNear:zFar:):
//   1.4592401         0.0   0.034053326           0.0
//         0.0   3.4048936   0.012987971           0.0
//         0.0         0.0    -1.0000054  -0.007000038
//         0.0         0.0          -1.0           0.0

func calculateProjectionMatrix(intrinsics: simd_float3x3,
                               viewportSize: Size,
                               imageSize: Size,
                               zNear: Float,
                               zFar: Float) -> simd_float4x4 {

    let aspect = viewportSize.height / viewportSize.width
    let right: Float = imageSize.width - intrinsics[2][0]
    let left: Float = -intrinsics[2][0]
    let top: Float = right * aspect
    let bottom: Float = left * aspect

    return simd_float4x4(
        simd_float4(2 * intrinsics[0][0] / (right - left), 0, 0, 0),
        simd_float4(0, 2 * intrinsics[1][1] / (top - bottom), 0, 0),
        simd_float4((right + left) / (right - left), (top + bottom) / (top - bottom), -zFar / (zFar - zNear), -1.0),
        simd_float4(0, 0, -zFar * zNear / (zFar - zNear), 0)
    )
}

Похоже, что я неправильно устанавливаю left, right, top и bottom. Я знаю, что проигнорировал intrinsics[2][1], что, вероятно, не следует, но даже результат, который зависел только от right и left (m[2][0]), неверен.

Я читал некоторые сообщения в блоге ( например, 1 , 2 ) по этому поводу (большинство из них об OpenGL), но я не смог получить точную матрицу, заданную этим методом. Есть ли у вас какие-либо мысли о том, что не так с моей реализацией и что я должен сделать, чтобы получить те же результаты, что и функция ARKit?

...