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]
而不是用 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;
}
也许这可以解决问题。
所以我有一个形状,我想相对于 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]
而不是用 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;
}
也许这可以解决问题。