我正在开发一款3D游戏引擎(LWJGL3),而且我真的停留在父母周围的旋转对象上。
以下是一些概述:
每个GameObject
可以有其他GameObject
作为孩子。
每个GameObject
都有一个Transform
类:
public Vector3f translation;
public Quaternion rotation;
public Vector3f scale;
public Transform() {
this.translation = new Vector3f(0.0f);
this.rotation = new Quaternion();
this.scale = new Vector3f(1.0f);
}
Quaternion
类使用一些额外的方法从 JOML lib 扩展Quaternionf
,但您可以将其视为纯JOML类。当我向另一个添加GameObject
时,它会更新其本地转换,以便继承父级翻译,轮换和缩放:
public void updateToParent(GameObject parent) {
this.translation.add(parent.getWorldTransform().translation);
rotateAroundParent(parent.getWorldTransform());
this.scale.mul(parent.getWorldTransform().scale);
}
private void rotateAroundParent(Transform transform) {
this.translation.sub(transform.translation);
this.translation.rotateZ(-transform.rotation.z);
this.translation.rotateY(-transform.rotation.y);
this.translation.rotateX(-transform.rotation.x);
this.translation.add(transform.translation);
this.rotation.add(transform.rotation);
}
这部分"工作"好。父级在x,y和z轴上旋转了45个子项:
"魔术"当我尝试应用旋转时开始:
public void rotateAroundPoint(float dx, float dy, float dz, Transform transform) {
this.translation.sub(transform.translation);
this.translation.rotateZ(-(float)Math.toRadians(dz));
this.translation.rotateY(-(float)Math.toRadians(dy));
this.translation.rotateX(-(float)Math.toRadians(dx));
this.translation.add(transform.translation);
this.rotation.add(dx, dy, dz);
}
(请注意!这是我最近尝试实施它,我知道它不起作用)
当父对象以及子对象未应用旋转时(至少在与旋转不同的轴上),此旋转可以有效但一次仅在一个轴上。当我尝试在2轴或3轴或旋转的物体上应用旋转时,它会很难:
我已尝试实施四元数轮换,改变轮换顺序等。基本上我在这里和谷歌叔叔身上找到的一切,但仍然无法解决这个问题。我知道它与Gimbal Lock有关,"旋转旋转"轴等。
我也认为这可能是ModelViewMatrix
的问题,但是在这个问题上坐了一个多星期之后,我不知道什么是好的,什么不是:P
public static Matrix4f getModelViewMatrix(Model model) {
Quaternion rotation = model.getTransform().rotation;
MODEL_VIEW_MATRIX.identity()
.translate(model.getTransform().translation)
.rotateX(-rotation.x)
.rotateY(-rotation.y)
.rotateZ(-rotation.z)
.scale(model.getTransform().scale);
viewCurrent.set(VIEW_MATRIX);
return viewCurrent.mul(MODEL_VIEW_MATRIX);
}
我想要达到的目标是:当GameObject
旋转时 - 他的每个孩子都与他一起作为一个部分旋转。
我很感激你能给我的每一个帮助:)。