旋转时的java倾斜形状

时间:2018-12-01 23:50:25

标签: java graphics awt java-2d rotational-matrices

所以我有一个形状,我想相对于y轴旋转它。我很确定自己的旋转矩阵正确,这就是指南中的旋转矩阵:

enter image description here

这是我实现的代码:

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;
    }
}

仅向上/向下/向左/向右旋转形状,但是在向上/向下旋转后向左或向右旋转形状会开始倾斜。

enter image description here

我在这里想念什么/做错什么了吗?

1 个答案:

答案 0 :(得分:2)

大概是由旋转变换中的以下缺陷引起的:在rotate3Dy方法的循环中,变换xCoords[i],然后使用 transformed 值来转换zCoords[i],而不是使用 untransformed 值为xCoords[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;
    }

也许可以解决问题。