[你好,抱歉,如果我的问题是重复的,我使用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您可以使用角度玩,并看到类似的效果。
为了使围绕轴的完美旋转缺少任何信息吗?
非常感谢!
不错的工作。从我可以看到的对象绕轴旋转,没有偏移,但轴保持在原位。换句话说,对象围绕坐标系轴而不是其自身轴旋转。
恐怕您的数学有点简化。它适用于固定轴,但涉及任意轴时,它将失败。当您开始堆叠转换时,它将变得更加复杂。您将需要了解四元数等。我建议您使用OpenGl,而不是从头开始实现所有功能。
但是我不想吓you你,这绝对是可行的。这篇文章可能是一个很好的起点:https://stackoverflow.com/a/14609567/9090751