旋转,平移和默认摄像机位置

时间:2016-10-24 21:50:50

标签: metal metalkit

我正在玩MTKView中的模板设置;而且,我一直试图理解以下内容:

  1. 相机的默认位置。

  2. 使用MDLMeshMTKMesh创建基元时的默认位置。

  3. 为什么轮换也涉及翻译。

  4. 相关代码:

    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 )。

    我试图找出默认情况下放置MDLMeshMTKMesh的位置(问题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中的默认位置的理解。

    感谢。

1 个答案:

答案 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作为相机矩阵进行额外的正向平移,使立方体远离相机移动,或使用负值将立方体移近。

回答你的问题:

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

  2. 模型I / O构建以#34;为中心的网格"在原点周围,这对于生成的形状是有意义的。圆柱体,椭圆体和盒子实际上以原点为中心,而圆锥体的原点位于原点,其轴线沿-Y延伸。

  3. 轮换并不像其组合那样真正涉及翻译。翻译的原因是我们需要将立方体放置在远离相机的位置;否则我们在绘图时会在里面。

  4. 关于操作顺序的最后一个注意事项:如果我们在旋转之前应用了翻译,那么它将导致该框进入"轨道"在相机周围,因为你注意到,旋转总是相对于当前参照系的原点。