Java / libgdx 3D模型旋转错误

时间:2016-03-30 20:10:31

标签: java libgdx rotation 3d-model

问题:我的播放器模型应该转向最后一次鼠标点击的方向但不是慢慢转动它会以所有可能的方式旋转(游戏有一个等轴测视图,模型应该只围绕Y轴旋转但它也围绕X轴和Z轴旋转。

以下方法(在render()中调用)负责模型的转向行为:

public static void turnUnit(){
    if(Gdx.input.isButtonPressed(Input.Buttons.LEFT)){
        mX = Gdx.input.getX();
        mY = Gdx.input.getY();
        angle = (float) (180+Math.atan2(mX-Gdx.graphics.getWidth()/2, mY-Gdx.graphics.getHeight()/2)*(180/Math.PI));

        newAngle = ((((currentAngle - angle) % 360) + 540) % 360) - 180;
        turning = newAngle/60*turnRate;

        currentAngle = currentAngle-turning;
    }
    TestGround.player.transform.setToRotation(Vector3.Y, currentAngle).setTranslation(posX,0,posZ);
}

运动方法(也称为render()):

public static void movement(){
    if(northM==true){
        TestGround.player.transform.trn(0,0,-1f);
    }
    if(southM==true){
        TestGround.player.transform.trn(0,0,1f);
    }
    if(westM==true){
        TestGround.player.transform.trn(-1f,0,0);
    }
    if(eastM==true){
        TestGround.player.transform.trn(1f,0,0);
    }

    posX = TestGround.player.transform.getTranslation(Vector3.X).x;
    posY = TestGround.player.transform.getTranslation(Vector3.Y).y;
    posZ = TestGround.player.transform.getTranslation(Vector3.Z).z;

}

试图使用"旋转"在最后一行,但它只是旋转得更快。

此外,即使这对我没有意义,但经过一些测试后,似乎运动方法会以某种方式干扰转弯方法(沿某个方向移动会以某种方式旋转模型)。

我在这里做了一些根本错误的事情吗?

其他信息:

  • 最初我使用简单轮询来获取所有键盘和鼠标输入
  • 以一种大方法计算运动/旋转,一切正常
  • 决定使用libgdx的输入处理器来使代码更具可读性和开放性

1 个答案:

答案 0 :(得分:0)

Matrix4#getTranslation(Vector3)方法将指定的向量设置为矩阵的转换组件并将其返回以进行链接。这意味着您作为TestGround.player.transform.getTranslation(vector)方法的参数提供的向量将被设置(读取:覆盖)到模型实例的转换(位置)。

因此,在致电:

的情况下
TestGround.player.transform.getTranslation(Vector3.Y)

这实际上会将Vector3.Y变量从默认[x:0, y:1, z:0]修改为矩阵的转换组件设置为。这将导致使用Vector3.Y变量的任何其他调用(例如您对setToRotation的调用)的行为方式不同。

要解决此问题,您可以将最后几行修改为:

Vector3 pos = new Vector3();
TestGround.player.transform.getTranslation(pos);
posX = pos.x;
posY = pos.y;
posZ = pos.z;

请注意,您应该将Vector3的创建移出方法,因此可能会移除posXposYposZ成员以支持pos成员。

所以,你可能想知道两个问题:

为什么getTranslation方法会修改其参数?这是因为libGDX旨在避免创建垃圾,因为这会在Android等某些平台上创建hick-up。因此,每次调用该方法时,都不允许创建新的Vector3,而是允许您指定要重用的该类的实例。由于这个原因,您将在多个位置的整个lib中看到此模式。

为什么甚至可以修改Vector3.Y,使其无用并导致各种问题?这是因为Vector3类是可变的并且没有封装它成员。所以实际上它允许你vector.x += 3;而不是强迫你拨打vector.setX(vector.getX() + 3);。这是出于可读性和性能原因(尽管后者可能会因您的目标平台而异)。此外,java不支持与const相当的东西。