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轴旋转效果正常:


内容的提问来源于stack exchange,提问作者Łukasz
相关产品推荐
相关产品推荐

