如果我的问题是重复的,您好,抱歉,我使用 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)
角度是 3 个随键盘/鼠标输入而变化的全局参数。当角度为零时,围绕每个轴的旋转是完美的,但当不为零时,对象不是围绕轴旋转,而是一些奇怪的偏移。虽然我不确定,但这可能是万向节锁。
这是我在 desmos 中制作的项目中的 3d 引擎的示例: https ://www.desmos.com/calculator/8by2wg0cek 您可以使用角度并看到类似的效果。
为了围绕轴进行完美旋转,我有什么遗漏吗?
非常感谢!