【问题标题】:weird rotations in self made 3D engine自制 3D 引擎中的奇怪旋转
【发布时间】:2020-01-09 20:07:12
【问题描述】:

如果我的问题重复,您好,抱歉, 我使用 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 您可以调整角度并看到类似的效果。

为了绕轴完美旋转,我还缺少什么吗?

非常感谢!

【问题讨论】:

    标签: 3d rotation locking gimbal


    【解决方案1】:

    干得好。从我所看到的对象围绕轴旋转,没有偏移,但轴保持在原位。换句话说,对象围绕坐标系轴旋转,而不是它自己的轴。

    恐怕你的数学有点简单。它适用于固定轴,但当涉及到任意轴时,它会失败。当你开始堆叠转换时,它会变得更加复杂。您将需要了解四元数等。我建议您使用 OpenGL 而不是从头开始实现它。

    但我不想吓到你,这绝对是可行的。一个好的起点可能是这篇文章:https://stackoverflow.com/a/14609567/9090751

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多