沿X轴3D旋转的问题

发布于 2025-02-05 03:01:01 字数 2923 浏览 0 评论 0原文

我正在研究一个需要一个3D立方体沿3轴旋转的项目。该立方体由12个三角形组成,每个三角形都有Triangle类的实例。每个三角形都有一个P0p1p2,带有类型sf :: vector3f。三角形还具有float*位置float*旋转。使用此方法更新三角形的位置和旋转。

void Triangle::update() {
    position;

    p0 = originalP0;
    p1 = originalP1;
    p2 = originalP2;

    sf::Vector3f rotatedP0;
    sf::Vector3f rotatedP1;
    sf::Vector3f rotatedP2;

    // along z
    rotatedP0.x = p0.x * cos((*rotation).z * 0.0174533) - p0.y * sin((*rotation).z * 0.0174533);
    rotatedP0.y = p0.x * sin((*rotation).z * 0.0174533) + p0.y * cos((*rotation).z * 0.0174533);
    rotatedP0.z = p0.z;

    rotatedP1.x = p1.x * cos((*rotation).z * 0.0174533) - p1.y * sin((*rotation).z * 0.0174533);
    rotatedP1.y = p1.x * sin((*rotation).z * 0.0174533) + p1.y * cos((*rotation).z * 0.0174533);
    rotatedP1.z = p1.z;

    rotatedP2.x = p2.x * cos((*rotation).z * 0.0174533) - p2.y * sin((*rotation).z * 0.0174533);
    rotatedP2.y = p2.x * sin((*rotation).z * 0.0174533) + p2.y * cos((*rotation).z * 0.0174533);
    rotatedP2.z = p2.z;

    p0 = rotatedP0;
    p1 = rotatedP1;
    p2 = rotatedP2;

    // along y
    rotatedP0.x = p0.x * cos((*rotation).y * 0.0174533) + originalP0.z * sin((*rotation).y * 0.0174533);
    rotatedP0.y = p0.y;
    rotatedP0.z = p0.x * -sin((*rotation).y * 0.0174533) + originalP0.z * cos((*rotation).y * 0.0174533);

    rotatedP1.x = p1.x * cos((*rotation).y * 0.0174533) + originalP1.z * sin((*rotation).y * 0.0174533);
    rotatedP1.y = p1.y;
    rotatedP1.z = p1.x * -sin((*rotation).y * 0.0174533) + originalP1.z * cos((*rotation).y * 0.0174533);

    rotatedP2.x = p2.x * cos((*rotation).y * 0.0174533) + originalP2.z * sin((*rotation).y * 0.0174533);
    rotatedP2.y = p2.y;
    rotatedP2.z = p2.x * -sin((*rotation).y * 0.0174533) + originalP2.z * cos((*rotation).y * 0.0174533);

    p0 = rotatedP0;
    p1 = rotatedP1;
    p2 = rotatedP2;

    // along x
    rotatedP0.x = p0.x;
    rotatedP0.y = p0.y * cos((*rotation).x * 0.0174533) - p0.z * sin((*rotation).x * 0.0174533);
    rotatedP0.z = p0.y * sin((*rotation).x * 0.0174533) + p0.z * cos((*rotation).x * 0.0174533);

    rotatedP1.x = p1.x;
    rotatedP1.y = p1.y * cos((*rotation).x * 0.0174533) - p1.z * sin((*rotation).x * 0.0174533);
    rotatedP1.z = p1.y * sin((*rotation).x * 0.0174533) + p1.z * cos((*rotation).x * 0.0174533);

    rotatedP2.x = p2.x;
    rotatedP2.y = p2.y * cos((*rotation).x * 0.0174533) - p2.z * sin((*rotation).x * 0.0174533);
    rotatedP2.z = p2.y * sin((*rotation).x * 0.0174533) + p2.z * cos((*rotation).x * 0.0174533);


    p0 = rotatedP0 + *position;
    p1 = rotatedP1 + *position;
    p2 = rotatedP2 + *position;
}

此方法适用于除X轴以外的所有轴。该立方体有两个红色的脸,与Z轴相交,两个绿色的面与Y轴相交,两个蓝色的脸相交,将X轴相交。沿Z和Y轴旋转立方体效果很好。立方体正在围绕红色和绿色的面孔旋转。当沿X轴旋转时,立方体不会围绕蓝色面旋转,而是全局X轴。 我做错了吗?应该这样吗?有什么方法可以解决吗?我全都搜索了,找不到任何有帮助的东西。

I'm working on a project that required a 3d cube to be rotated along 3 axes. The cube is made up of 12 triangles, each with an instance of the Triangle class. Each triangle has a p0, p1, and p2 with the type sf::Vector3f. The triangles also have a float* position and a float* rotation. The position and rotation of a triangle is updated using this method.

void Triangle::update() {
    position;

    p0 = originalP0;
    p1 = originalP1;
    p2 = originalP2;

    sf::Vector3f rotatedP0;
    sf::Vector3f rotatedP1;
    sf::Vector3f rotatedP2;

    // along z
    rotatedP0.x = p0.x * cos((*rotation).z * 0.0174533) - p0.y * sin((*rotation).z * 0.0174533);
    rotatedP0.y = p0.x * sin((*rotation).z * 0.0174533) + p0.y * cos((*rotation).z * 0.0174533);
    rotatedP0.z = p0.z;

    rotatedP1.x = p1.x * cos((*rotation).z * 0.0174533) - p1.y * sin((*rotation).z * 0.0174533);
    rotatedP1.y = p1.x * sin((*rotation).z * 0.0174533) + p1.y * cos((*rotation).z * 0.0174533);
    rotatedP1.z = p1.z;

    rotatedP2.x = p2.x * cos((*rotation).z * 0.0174533) - p2.y * sin((*rotation).z * 0.0174533);
    rotatedP2.y = p2.x * sin((*rotation).z * 0.0174533) + p2.y * cos((*rotation).z * 0.0174533);
    rotatedP2.z = p2.z;

    p0 = rotatedP0;
    p1 = rotatedP1;
    p2 = rotatedP2;

    // along y
    rotatedP0.x = p0.x * cos((*rotation).y * 0.0174533) + originalP0.z * sin((*rotation).y * 0.0174533);
    rotatedP0.y = p0.y;
    rotatedP0.z = p0.x * -sin((*rotation).y * 0.0174533) + originalP0.z * cos((*rotation).y * 0.0174533);

    rotatedP1.x = p1.x * cos((*rotation).y * 0.0174533) + originalP1.z * sin((*rotation).y * 0.0174533);
    rotatedP1.y = p1.y;
    rotatedP1.z = p1.x * -sin((*rotation).y * 0.0174533) + originalP1.z * cos((*rotation).y * 0.0174533);

    rotatedP2.x = p2.x * cos((*rotation).y * 0.0174533) + originalP2.z * sin((*rotation).y * 0.0174533);
    rotatedP2.y = p2.y;
    rotatedP2.z = p2.x * -sin((*rotation).y * 0.0174533) + originalP2.z * cos((*rotation).y * 0.0174533);

    p0 = rotatedP0;
    p1 = rotatedP1;
    p2 = rotatedP2;

    // along x
    rotatedP0.x = p0.x;
    rotatedP0.y = p0.y * cos((*rotation).x * 0.0174533) - p0.z * sin((*rotation).x * 0.0174533);
    rotatedP0.z = p0.y * sin((*rotation).x * 0.0174533) + p0.z * cos((*rotation).x * 0.0174533);

    rotatedP1.x = p1.x;
    rotatedP1.y = p1.y * cos((*rotation).x * 0.0174533) - p1.z * sin((*rotation).x * 0.0174533);
    rotatedP1.z = p1.y * sin((*rotation).x * 0.0174533) + p1.z * cos((*rotation).x * 0.0174533);

    rotatedP2.x = p2.x;
    rotatedP2.y = p2.y * cos((*rotation).x * 0.0174533) - p2.z * sin((*rotation).x * 0.0174533);
    rotatedP2.z = p2.y * sin((*rotation).x * 0.0174533) + p2.z * cos((*rotation).x * 0.0174533);


    p0 = rotatedP0 + *position;
    p1 = rotatedP1 + *position;
    p2 = rotatedP2 + *position;
}

This method works well for all axes except the X axis. The cube has two red faces intersecting the Z axis, two green faces intersecting the Y axis, and two blue faces intersecting the X axis. Rotating the cube along the Z and Y axes works fine. The cube is rotating around the red and green faces. When rotating along the X axis, the cube is not rotated around the blue faces, but rather the global X axis.
Am I doing something wrong? Is it supposed to be this way? Is there any way to fix it? I searched all over and couldn't find anything helpful.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

宛菡 2025-02-12 03:01:01

兄弟,你做错了。使用此 3D点旋转算法。我知道这是JavaScript,但数学仍然相同

bro you did it all wrong. use this 3D point rotation algorithm. i know it is javascript but the math still the same

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文