我刚开始学习金属,可以最好地向您展示我对以下系列屏幕截图的挫败感。从上到下我们有 (1)我的模型,其中模型矩阵是单位矩阵 (2)我的模型绕x轴旋转60度,正交投影 (3)我的模型绕y轴旋转60度,正交投影 (4)我的模型围绕z轴旋转60度
所以我使用以下函数转换为规范化设备坐标:
- (CGPoint)normalizedDevicePointForViewPoint:(CGPoint)point
{
CGPoint p = [self convertPoint:point toCoordinateSpace:self.window.screen.fixedCoordinateSpace];
CGFloat halfWidth = CGRectGetMidX(self.window.screen.bounds);
CGFloat halfHeight = CGRectGetMidY(self.window.screen.bounds);
CGFloat px = ( p.x - halfWidth ) / halfWidth;
CGFloat py = ( p.y - halfHeight ) / halfHeight;
return CGPointMake(px, -py);
}
以下旋转并正交投影模型:
- (matrix_float4x4)zRotation
{
self.rotationZ = M_PI / 3;
const vector_float3 zAxis = { 0, 0, 1 };
const matrix_float4x4 zRot = matrix_float4x4_rotation(zAxis, self.rotationZ);
const matrix_float4x4 modelMatrix = zRot;
return matrix_multiply( matrix_float4x4_orthogonal_projection_on_z_plane(), modelMatrix );
}
正如您所看到的,当我使用完全相同的方法旋转其他两个轴时,它看起来很好 - 没有扭曲。我究竟做错了什么?是否有某种缩放/宽高比的东西我应该设置在某个地方?可能是什么东西?我一直在盯着这个令人尴尬的长时间,所以任何可以引导我朝着正确方向前进的帮助/想法都会受到高度赞赏。提前谢谢。
答案 0 :(得分:0)
您的旋转矩阵或投影矩阵没有任何问题。视觉上的奇怪之处在于您在旋转之前将顶点移动到NDC空间。在NDC空间中旋转时,矩形不保持其纵横比,因为从NDC到屏幕坐标的映射不是1:1。
我建议不要在NDC工作直到顶点管道的最后(即,将顶点传递到你的顶点函数" world" space,并且 out 作为NDC的光栅化器)。您可以使用经典的正交投影矩阵构造来缩放和偏置顶点,正确地考虑窗口坐标的非方形纵横比。