自制 3D 引擎中的奇怪旋转
weird rotations in self made 3D engine
您好,抱歉,如果我的问题是重复的,
我正在使用 python 和 pygame 构建我的第一个 3D 引擎。
主要的 3D 变换是:
def param(x,y,z):
vec_rx = rotate_x((x,y,z), angle_x)
vec_ry = rotate_y(vec_rx , angle_y)
vec = rotate_z(vec_ry , angle_z)
return ((zoom * vec[0])/(70-vec[2]) + win_width/2,( (zoom * vec[1])/(70-vec[2]) ) + win_height/2)
70 是距离原点的距离。
旋转是通过乘以矩阵:
def rotate_x(vec,angle):
a = vec[0]
b = vec[1]*math.cos(angle) - vec[2]*math.sin(angle)
c = vec[1]*math.sin(angle) + vec[2]*math.cos(angle)
return (a,b,c)
def rotate_y(vec,angle):
a = vec[0]*math.cos(angle) + vec[2]*math.sin(angle)
b = vec[1]
c = -vec[0]*math.sin(angle) + vec[2]*math.cos(angle)
return (a,b,c)
def rotate_z(vec,angle):
a = vec[0]*math.cos(angle) - vec[1]*math.sin(angle)
b = vec[0]*math.sin(angle) + vec[1]*math.cos(angle)
c = vec[2]
return (a,b,c)
角度是随 keyboard/mouse 输入变化的 3 个全局参数。
当角度为零时,每个轴的旋转都是完美的,但当角度不为零时,物体不会绕轴旋转,而是出现一些奇怪的偏移。虽然我不确定,但可能是万向节锁。
这是我在desmos中制作的项目中的3d引擎示例:
https://www.desmos.com/calculator/8by2wg0cek
您可以调整角度并看到类似的效果。
为了绕轴进行完美旋转,我是否遗漏了什么?
非常感谢!
干得好。据我所见,物体绕轴旋转,没有偏移,但轴保持原位。换句话说,对象围绕坐标系轴旋转,而不是它自己的轴。
恐怕你的数学有点简化了。它适用于固定轴,但当涉及到任意轴时,它会失败。当您开始堆叠转换时,它会变得更加复杂。您将需要了解四元数等。我建议您使用 OpenGl 而不是从头开始实现它。
但我不想吓唬你,这绝对是可行的。一个好的起点可以是 post:
您好,抱歉,如果我的问题是重复的, 我正在使用 python 和 pygame 构建我的第一个 3D 引擎。 主要的 3D 变换是:
def param(x,y,z):
vec_rx = rotate_x((x,y,z), angle_x)
vec_ry = rotate_y(vec_rx , angle_y)
vec = rotate_z(vec_ry , angle_z)
return ((zoom * vec[0])/(70-vec[2]) + win_width/2,( (zoom * vec[1])/(70-vec[2]) ) + win_height/2)
70 是距离原点的距离。 旋转是通过乘以矩阵:
def rotate_x(vec,angle):
a = vec[0]
b = vec[1]*math.cos(angle) - vec[2]*math.sin(angle)
c = vec[1]*math.sin(angle) + vec[2]*math.cos(angle)
return (a,b,c)
def rotate_y(vec,angle):
a = vec[0]*math.cos(angle) + vec[2]*math.sin(angle)
b = vec[1]
c = -vec[0]*math.sin(angle) + vec[2]*math.cos(angle)
return (a,b,c)
def rotate_z(vec,angle):
a = vec[0]*math.cos(angle) - vec[1]*math.sin(angle)
b = vec[0]*math.sin(angle) + vec[1]*math.cos(angle)
c = vec[2]
return (a,b,c)
角度是随 keyboard/mouse 输入变化的 3 个全局参数。 当角度为零时,每个轴的旋转都是完美的,但当角度不为零时,物体不会绕轴旋转,而是出现一些奇怪的偏移。虽然我不确定,但可能是万向节锁。
这是我在desmos中制作的项目中的3d引擎示例: https://www.desmos.com/calculator/8by2wg0cek 您可以调整角度并看到类似的效果。
为了绕轴进行完美旋转,我是否遗漏了什么?
非常感谢!
干得好。据我所见,物体绕轴旋转,没有偏移,但轴保持原位。换句话说,对象围绕坐标系轴旋转,而不是它自己的轴。
恐怕你的数学有点简化了。它适用于固定轴,但当涉及到任意轴时,它会失败。当您开始堆叠转换时,它会变得更加复杂。您将需要了解四元数等。我建议您使用 OpenGl 而不是从头开始实现它。
但我不想吓唬你,这绝对是可行的。一个好的起点可以是 post: