所以我有一个形状,我想相对于y轴旋转它。我很确定自己的旋转矩阵正确,这就是指南中的旋转矩阵:
这是我实现的代码:
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;
}
}
仅向上/向下/向左/向右旋转形状,但是在向上/向下旋转后向左或向右旋转形状会开始倾斜。
我在这里想念什么/做错什么了吗?
答案 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;
}
也许可以解决问题。