Vulkan — Отладка проблемы с матрицей камеры

#c #matrix #3d #vulkan

#c #матрица #3D #vulkan

Вопрос:

Проблема, с которой я сталкиваюсь, заключается в том, что я экспортирую сцену из Blender, и моя сцена повернута на 90 вокруг оси Y. Это явно проблема с матрицей, и у меня возникают проблемы с визуализацией решения. Blender настроен на экспорт с помощью ‘up’ = (0, 1, 0) и ‘forward’ = (0, 0, 1).

Я использую основные матрицы строк, как указано ниже.

 mat4x4 cons_mat4x4_perspective(float fovy, float aspect_ratio, float near, float far)
{
    mat4x4 result = cons_mat4x4_zero(); 
    float half_tan_fovy = tan(fovy / 2.0f); /* in radians */

    result.as_rows[0] = cons_vec4(1.0f / (aspect_ratio * half_tan_fovy), 0.0f, 0.0f, 0.0f);
    result.as_rows[1] = cons_vec4(0.0f, 1.0f / half_tan_fovy, 0.0f, 0.0f);
    result.as_rows[2] = cons_vec4(0.0f, 0.0f, -(far   near) / (far - near), -1.0f);
    result.as_rows[3] = cons_vec4(0.0f, 0.0f, -(2.0f * far * near) / (far - near), 0.0f);
    
    return resu<
}

// Vulkan clip matrix
clip = cons_mat4x4_floats(1.0f, 0.0f, 0.0f, 0.0f,
                        0.0f,-1.0f, 0.0f, 0.0f,
                        0.0f, 0.0f, 0.5f, 0.0f,
                        0.0f, 0.0f, 0.5f, 1.0f);

mat4x4 cons_mat4x4_lookat(vec3 eye, vec3 center, vec3 up)
{
    mat4x4 result = cons_mat4x4_identity();

    vec3 f = normalize(vec3_sub(center, eye));
    vec3 s = normalize(cross(f, up));
    vec3 u = cross(s, f);

    result.as_rows[0] = cons_vec4(s.x, u.x, -f.x, 0.0f);
    result.as_rows[1] = cons_vec4(s.y, u.y, -f.y, 0.0f);
    result.as_rows[2] = cons_vec4(s.z, u.z, -f.z, 0.0f);
    result.as_rows[3] = cons_vec4(-vec3_dot(s, eye),
                              vec3_dot(u, eye),
                              vec3_dot(f, eye),
                              1.0f);
    return resu<
}
 

Моя модельная матрица — это идентификационная матрица, и я создаю матрицу просмотра со следующими параметрами:

 vec3 _camera = cons_vec3(0.0f, 5.0f, 0.0f);
vec3 _at = cons_vec3(0.0f, 0.0f, 0.0f);

cons_mat4x4_lookat(_camera, _at, cons_vec3(0.0f, 1.0f, 0.0f));
 

Комментарии:

1. Я просто перехожу к последнему блоку кода, но вы уверены, что этот блок правильный? center - eye и up содержатся в одном и том же подпространстве, так что матрица LookAt в этом случае даже не будет общим линейным преобразованием.

2. Совсем нет. Я вижу проблему в том, что она не является линейной xform.