为什么我的形状在绕z轴旋转时会扭曲?

时间:2016-02-04 16:59:24

标签: ios metal

我刚开始学习金属,可以最好地向您展示我对以下系列屏幕​​截图的挫败感。从上到下我们有 (1)我的模型,其中模型矩阵是单位矩阵 (2)我的模型绕x轴旋转60度,正交投影 (3)我的模型绕y轴旋转60度,正交投影 (4)我的模型围绕z轴旋转60度

My model where the model matrix is the identity matrix

My model rotated 60 deg about the x axis with orthogonal projection

My model rotated 60 deg about the y axis with orthogonal projection My model rotated 60 deg about the z axis with orthogonal projection. So distorted :(! But why? Why?!

所以我使用以下函数转换为规范化设备坐标:

- (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 );
}

正如您所看到的,当我使用完全相同的方法旋转其他两个轴时,它看起来很好 - 没有扭曲。我究竟做错了什么?是否有某种缩放/宽高比的东西我应该设置在某个地方?可能是什么东西?我一直在盯着这个令人尴尬的长时间,所以任何可以引导我朝着正确方向前进的帮助/想法都会受到高度赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您的旋转矩阵或投影矩阵没有任何问题。视觉上的奇怪之处在于您在旋转之前将顶点移动到NDC空间。在NDC空间中旋转时,矩形不保持其纵横比,因为从NDC到屏幕坐标的映射不是1:1。

我建议不要在NDC工作直到顶点管道的最后(即,将顶点传递到你的顶点函数" world" space,并且 out 作为NDC的光栅化器)。您可以使用经典的正交投影矩阵构造来缩放和偏置顶点,正确地考虑窗口坐标的非方形纵横比。