我正在玩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));
为:
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中的默认位置的理解。
感谢。
答案 0 :(得分:3)
我认为在代码中编写矩阵的顺序有点模糊了意图,因此我已经将实际发生的事情归结为以下伪代码,以便更容易解释。
我已经用模板中的那个替换了最后一个矩阵,因为你的修改只会使绕Y轴的旋转加倍。
modelViewMatrix = identity *
translate(0, 0, 5) *
rotate(angle, axis(0, 1, 0)) *
rotate(angle, axis(1, 1, 1))
由于矩阵在着色器中向量的左侧相乘,我们将从右向左读取矩阵以确定它们的累积效应。
首先,我们围绕轴(1,1,1)旋转立方体,该轴沿对角线穿过原点。然后,我们围绕Y轴围绕立方体旋转。这些旋转结合起来形成一种“翻滚”#34;动画。然后,我们沿着+ Z轴将立方体平移5个单位(正如您所观察到的那样,进入屏幕,因为我们将我们的世界视为左撇子)。最后,我们应用我们的相机变换,它被硬编码为单位矩阵。我们本可以使用+ Z作为相机矩阵进行额外的正向平移,使立方体远离相机移动,或使用负值将立方体移近。
回答你的问题:
除了原点(0,0,0)之外,没有相机的默认位置,如果你想这样想的话。你"位置"世界上的相机,通过将顶点位置乘以表示相机在世界中的放置方式的变换的倒数。
模型I / O构建以#34;为中心的网格"在原点周围,这对于生成的形状是有意义的。圆柱体,椭圆体和盒子实际上以原点为中心,而圆锥体的原点位于原点,其轴线沿-Y延伸。
轮换并不像其组合那样真正涉及翻译。翻译的原因是我们需要将立方体放置在远离相机的位置;否则我们在绘图时会在里面。
关于操作顺序的最后一个注意事项:如果我们在旋转之前应用了翻译,那么它将导致该框进入"轨道"在相机周围,因为你注意到,旋转总是相对于当前参照系的原点。