立方体 3D 点旋转 X 和 Z
Cube 3D points rotations X & Z
包括有关您的目标的详细信息:
- 所以首先,我的目标是让立方体的点围绕 X、Y 和 Z 轴旋转,以旋转立方体本身。
描述预期:
- 我希望在围绕 X 轴旋转 17.18° 后得到它:
- 我希望在绕 Z 轴旋转 17.18° 后得到它:
实际结果:
黑色形状是没有旋转的默认立方体
白色的形状是旋转后的立方体
我用我的公式绕X轴旋转17.18°后的实际结果:
- 我用我的公式绕Z轴旋转17.18°后的实际结果:
展示您尝试过的内容并告诉我们您发现了什么(在此站点或其他地方)以及为什么它不能满足您的需求。当您提供研究时,您可以获得更好的答案。
我看到一些网站准确描述了我想要的内容:
- https://www.desmos.com/calculator/imazvy40oz?lang=fr
- https://fr.khanacademy.org/computer-programming/cube-rotating-with-user-interaction/5953495622746112
显示一些代码
- 首先我正在使用 Java 因为我的问题是我的 Minecraft 虚拟形状与真实形状不符;
旋转方式
public void rotateX() {
for(int i = 0; i < points.size(); i++) {
Vector vector = points.get(i);
double sinTheta = Math.sin(eulerAngle.getX());
double cosTheta = Math.cos(eulerAngle.getX());
double y = vector.getY();
double z = vector.getZ();
vector.setY(y * cosTheta - z * sinTheta);
vector.setZ(z * cosTheta + y * sinTheta);
}
}
public void rotateY() {
for(int i = 0; i < points.size(); i++) {
Vector vector = points.get(i);
double sinTheta = Math.sin(eulerAngle.getY());
double cosTheta = Math.cos(eulerAngle.getY());
double x = vector.getX();
double z = vector.getZ();
vector.setX(x * cosTheta - z * sinTheta);
vector.setZ(z * cosTheta + x * sinTheta);
}
}
public void rotateZ() {
for(int i = 0; i < points.size(); i++) {
Vector vector = points.get(i);
double sinTheta = Math.sin(eulerAngle.getZ());
double cosTheta = Math.cos(eulerAngle.getZ());
double x = vector.getX();
double y = vector.getY();
vector.setX(x * cosTheta - y * sinTheta);
vector.setY(y * cosTheta + x * sinTheta);
}
}
我的设置方法
public void setupPoints() {
ArrayList<Vector> points = new ArrayList<Vector>();
points.add(getA());
points.add(getB());
points.add(getC());
points.add(getD());
points.add(getE());
points.add(getF());
points.add(getG());
points.add(getH());
this.points = points;
rotateZ();
rotateY();
rotateX();
}
我的积分位置是(我知道它不是一个精确的立方体):
我的环境:
注意:只有 Y 旋转完美,我注意到 Y 轴上的旋转对应于坐标系中的 Z 轴旋转,其中 Y 将是“高度”,这是我第一次工作3d space 计划所以我正在学习。感谢您阅读到这里。
您的旋转方法是正确的,但它们是围绕通过原点的轴旋转的。
您希望它们围绕穿过物体中心的轴旋转。你没有看到围绕 Y 轴旋转的问题,因为它恰好穿过立方体的中心。
您可以通过在旋转前将对象“移动”到原点,并在旋转后将其移回原点来解决此问题。例如,对于 X 旋转:
double y = vector.getY() - objectCenterY;
double z = vector.getZ() - objectCenterZ;
vector.setY(y * cosTheta - z * sinTheta + objectCenterY);
vector.setZ(z * cosTheta + y * sinTheta + objectCenterZ);