2

我只是在玩模板设置MTKView;而且,我一直在尝试了解以下内容:

  1. 相机的默认位置。

  2. 使用MDLMesh和创建基元时的默认位置MTKMesh

  3. 为什么旋转还涉及平移。

相关代码:

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 )上旋转。

我试图找出默认放置MDLMeshand的位置(问题 2),但我找不到记录其位置的属性。以下也是通过模板创建原语的方式:MTKMesh

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 中的默认位置的理解。

谢谢。

4

1 回答 1

3

我认为矩阵在代码中的写入顺序有点混淆了意图,所以我将实际发生的事情归结为以下伪代码,以便于解释。

我已经用模板中的那个矩阵替换了最后一个矩阵,因为您的修改只会使绕 Y 轴的旋转加倍。

modelViewMatrix = identity *
                  translate(0, 0, 5) *
                  rotate(angle, axis(0, 1, 0)) *
                  rotate(angle, axis(1, 1, 1))

由于矩阵在着色器中向量的左侧相乘,我们将从右到左读取矩阵以确定它们的累积效果。

首先,我们围绕轴 (1, 1, 1) 旋转立方体,该轴斜穿过原点。然后,我们围绕 Y 轴围绕立方体旋转。这些旋转结合起来形成一种“翻滚”动画。然后,我们将立方体沿 +Z 轴平移 5 个单位(正如您所见,由于我们认为我们的世界是左撇子,所以它进入屏幕)。最后,我们应用我们的相机变换,它被硬编码为单位矩阵。我们可以使用沿 +Z 的附加正平移作为相机矩阵来将立方体移动到离相机更远的位置,或者使用负值来将立方体移动得更近。

要回答您的问题:

  1. 如果您想这样想的话,除了原点 (0, 0, 0) 之外,相机没有默认位置。通过将顶点位置乘以表示相机在世界中放置方式的变换的倒数,您可以在世界中“定位”相机。

  2. 模型 I/O 构建围绕原点“居中”的网格,在某种程度上这对生成的形状有意义。圆柱体、椭球体和长方体实际上以原点为中心,而圆锥体的顶点位于原点,轴沿 -Y 延伸。

  3. 旋转并不真正涉及翻译,而是与其结合。平移的原因是我们需要将立方体放置在远离相机的位置;否则我们在绘图时会在里面。

关于操作顺序的最后一点说明:如果我们在旋转之前应用平移,它将导致框围绕相机“环绕”,因为正如您所注意到的,旋转总是相对于当前参考系的原点。

于 2016-10-25T01:06:38.537 回答