You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

3D相机矩阵实现中X轴旋转异常问题求助

X轴旋转矩阵实现异常问题排查

为学习矩阵与3D相机原理,我使用Swift和SwiftUI制作了一个自学项目。目前遇到一个数学层面的问题:X轴旋转效果异常,但Y轴与Z轴旋转表现正常。

以下是实现的旋转矩阵与相机矩阵代码:

extension Matrix {
    static func rotateX(_ angle: CGFloat) -> Matrix 
    {
        Matrix([
            [ 1, 0, 0, 0],
            [ 0, cos(angle), sin(angle), 0],
            [ 0, sin(angle), cos(angle), 0],
            [ 0, 0, 0, 1 ]
        ])
    }
    
    static func rotateY(_ angle: CGFloat) -> Matrix 
    {
        Matrix([
            [ cos(angle), 0,sin(angle), 0],
            [ 0, 1, 0, 0],
            [ -sin(angle), 0, cos(angle), 0],
            [ 0, 0, 0, 1 ],
        ])
    }
    
    static func rotateZ(_ angle: CGFloat) -> Matrix 
    {
        Matrix([
            [ cos(angle), sin(angle), 0, 0],
            [-sin(angle), cos(angle), 0, 0],
            [ 0, 0, 1, 0],
            [ 0, 0, 0, 1 ]
        ])
    }
    
    static func rotate(_ p: Point3D) -> Matrix {
        Matrix.rotateZ(p.z)
        ° .rotateY(p.y)
        ° .rotateX(p.x)
    }

    static func reverseZ() -> Matrix {
        Matrix([
            [ 1, 0, 0, 0],
            [ 0, 1, 0, 0],
            [ 0, 0, -1, 0],
            [ 0, 0, 0, 1 ]
        ])
    }
    
    static func setWtoZ() -> Matrix {
        Matrix([
            [ 1, 0, 0, 0],
            [ 0, 1, 0, 0],
            [ 0, 0, -1, -1],
            [ 0, 0, 0, 0 ]
        ])
    }
    
    static func projectionMatrix(fov: CGFloat, near: CGFloat, far: CGFloat) -> Matrix {
        let scale = 1 / tan(fov/2.0 * CGFloat.pi / 180.0)
        let r = Matrix([
            [ scale, 0, 0, 0],
            [ 0, scale, 0, 0],
            [ 0, 0, -far / (far - near), -1],
            [ 0, 0, -(far * near / (far - near)), 0 ]
        ])
        return r
    }
     
    static func camera(fov: CGFloat, near: CGFloat, far: CGFloat) -> Matrix {
        Self.reverseZ()
        ° setWtoZ()
        ° projectionMatrix(fov: fov, near: near, far: far)
    }
}

变换调用逻辑如下:

var result = point3d.matrix
            ° .rotate(objectRotation)
            ° .translate(by: objectTranslation)
            ° .translateToCamera(position: viewPosition)
            ° .camera(fov: fov, near: near, far:far)

我使用SwiftMatrix库处理矩阵运算,°符号代表矩阵乘法,相关知识参考自3D基础渲染教程。Y轴与Z轴旋转效果正常:

Y轴旋转正常效果

Z轴旋转正常效果

内容的提问来源于stack exchange,提问作者Łukasz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:56:01