gpt4 book ai didi

metal - 旋转,平移和默认相机位置

转载 作者:行者123 更新时间:2023-12-04 17:36:51 27 4
gpt4 key购买 nike

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


相机的默认位置。
使用MDLMeshMTKMesh创建基元时的默认位置。
为什么轮换还涉及翻译。


相关代码:

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

谢谢。

最佳答案

我认为在代码中编写矩阵的顺序在某种程度上掩盖了意图,因此我将以下伪代码归结为实际情况,以便于解释。

我已经用模板中的最后一个矩阵替换了最后一个矩阵,因为您所做的修改仅具有使绕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的附加正平移作为摄影机矩阵来将立方体移动到距离摄影机更远的位置,或者使用负值来使立方体移近些。

要回答您的问题:


如果要这样想,则相机没有默认位置,除了原点(0、0、0)之外。您可以通过将顶点位置乘以表示相机在世界中的放置方式的逆变换来“定位”相机在世界中的位置。
模型I / O建立围绕原点“居中”的网格,在某种程度上,这对生成的形状有意义。圆柱体,椭圆体和盒子实际上以原点为中心,而圆锥体的顶点位于原点,其轴沿-Y延伸。
轮换并没有真正涉及翻译,而是与其结合在一起。进行平移的原因是我们需要将立方体放置在远离相机的位置。否则我们在绘图时会在里面。


关于操作顺序的最后一点说明:如果我们在旋转之前应用平移,则将导致框在摄影机周围“旋转”,因为如您所述,旋转始终相对于当前参照系的原点。

关于metal - 旋转,平移和默认相机位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40228099/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com