3轴3D旋转; Java的

时间:2018-02-27 15:43:23

标签: java math 3d rotation lwjgl

我正在开发一款3D游戏引擎(LWJGL3),而且我真的停留在父母周围的旋转对象上。

以下是一些概述:

  1. 每个GameObject可以有其他GameObject作为孩子。

  2. 每个GameObject都有一个Transform类:

  3. 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个子项:

    **Parent rotated 45 in x,y and z axis with children**

    "魔术"当我尝试应用旋转时开始:

    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轴或旋转的物体上应用旋转时,它会很难:

    **fails hard**

    我已尝试实施四元数轮换,改变轮换顺序等。基本上我在这里和谷歌叔叔身上找到的一切,但仍然无法解决这个问题。我知道它与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旋转时 - 他的每个孩子都与他一起作为一个部分旋转。

    我很感激你能给我的每一个帮助:)。

0 个答案:

没有答案