java 旋转时倾斜的形状

java skewed shape when rotated

所以我有一个形状,我想相对于 y-axis 旋转它。我很确定我的旋转矩阵是正确的,这是我们指南中旋转矩阵的样子:

这是我实现的代码:

public static void rotate3Dy(float[] xCoords, float[] yCoords, float[] zCoords, float angle) {
    float cosine_angle = (float) Math.cos(angle);
    float sine_angle = (float) Math.sin(angle);

    for (int i = 0; i < yCoords.length; i++) {
        xCoords[i] = (xCoords[i] * cosine_angle) + (zCoords[i] * sine_angle) + 0;
        zCoords[i] = (-xCoords[i] * sine_angle) + (zCoords[i] * cosine_angle) + 0;
    }
}

单独旋转形状 up/down/left/right 看起来不错,但是当我在旋转后向左或向右旋转时 up/down 它开始倾斜。

我哪里错了missing/doing?

估计偏斜是由旋转变换中的以下缺陷引起的:在 rotate3Dy 方法的循环中,您变换 xCoords[i] 然后使用 transformed 值转换 zCoords[i] 而不是用 untransformedxCoords[i] 计算后者。

尝试以下操作:在转换前克隆 xCoords 数组,即替换

    for (int i = 0; i < yCoords.length; i++) {
        xCoords[i] = (xCoords[i] * cosine_angle) + (zCoords[i] * sine_angle) + 0;
        zCoords[i] = (-xCoords[i] * sine_angle) + (zCoords[i] * cosine_angle) + 0;
    }

    float[] xCoordsTmp = xCoords.clone();
    for (int i = 0; i < yCoords.length; i++) {
        xCoords[i] = (xCoordsTmp[i] * cosine_angle) + (zCoords[i] * sine_angle) + 0;
        zCoords[i] = (-xCoordsTmp[i] * sine_angle) + (zCoords[i] * cosine_angle) + 0;
    }

也许这可以解决问题。