繁体   English   中英

沿 X 轴的 3d 旋转问题

[英]Issue with 3d rotation along the X axis

我正在开发一个需要沿 3 个轴旋转 3d 立方体的项目。 立方体由 12 个三角形组成,每个三角形都有一个Triangle类的实例。 每个三角形都有一个类型为sf::Vector3fp0p1p2 三角形也有一个float* position和一个float* rotation 使用此方法更新三角形的位置和旋转。

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 轴旋转。 难道我做错了什么? 应该是这样吗? 有什么办法可以解决吗? 我到处搜索,找不到任何有用的东西。

兄弟你做错了。 使用这个3D 点旋转算法 我知道这是 javascript 但数学还是一样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM