Я просто играю с настройкой шаблона в MTKView
; и я пытался понять следующее:
Расположение камеры по умолчанию.
Расположение по умолчанию при создании примитивов с использованием
MDLMesh
иMTKMesh
.Почему вращение включает в себя и перевод.
Соответствующий код:
matrix_float4x4 base_model = matrix_multiply(matrix_from_translation(0.0f, 0.0f, 5.0f), matrix_from_rotation(_rotation, 0.0f, 1.0f, 0.0f));
matrix_float4x4 base_mv = matrix_multiply(_viewMatrix, base_model);
matrix_float4x4 modelViewMatrix = matrix_multiply(base_mv, matrix_from_rotation(_rotation, 0.0f, 1.0f, 0.0f));
Предыдущий код взят из метода _update
по шаблону; очевидно, он пытается вращать модель вместо камеры. Но что меня смущает, так это то, что это требует еще и перевода. Я читал такие утверждения, как «потому что это всегда вращается на (0, 0, 0)
». Но зачем (0, 0, 0)
, если объект находится в другом месте? Кроме того, мне кажется, что камера смотрит на положительную ось Z (вопрос 1) вместо обычной отрицательной оси Z, потому что если я изменю:
matrix_float4x4 base_model = matrix_multiply(matrix_from_translation(0.0f, 0.0f, 5.0f), matrix_from_rotation(_rotation, 0.0f, 1.0f, 0.0f));
to:
matrix_float4x4 base_model = matrix_multiply(matrix_from_translation(0.0f, 0.0f, -5.0f), matrix_from_rotation(_rotation, 0.0f, 1.0f, 0.0f));
на экране ничего не будет отображаться, потому что кажется, что объект находится за камерой, а это означает, что камера смотрит на положительную ось z.
Если я установлю matrix_from_translation(0.0f, 0.0f, 0.0f)
(все нули), объект просто повернется не по оси Y (вопрос 3), как я ожидал.
Я попытался выяснить, где по умолчанию размещаются MDLMesh
и MTKMesh
(вопрос 2), но не смог найти свойство, которое регистрирует их положение. Ниже показано, также по шаблону, как создается примитив:
MDLMesh *mdl = [MDLMesh newBoxWithDimensions:(vector_float3){2,2,2} segments:(vector_uint3){1,1,1}
geometryType:MDLGeometryTypeTriangles inwardNormals:NO
allocator:[[MTKMeshBufferAllocator alloc] initWithDevice: _device]];
_boxMesh = [[MTKMesh alloc] initWithMesh:mdl device:_device error:nil];
Не зная его местоположения, сгенерированного вышеуказанным методом, это мешает мне понять, как работают вращение и перемещение, а также расположение камеры по умолчанию в Metal.
Спасибо.