0

问题:我的玩家模型应该转向最后一次鼠标点击的方向,但它不是缓慢转动,而是以所有可能的方式旋转(游戏有等距视图,模型应该只绕 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);
}

和运动方法(也称为渲染()):

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 的 inputprocessor 使代码更具可读性和开放性
4

1 回答 1

0

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

因此,在调用的情况下:

TestGround.player.transform.getTranslation(Vector3.Y)

这实际上会将Vector3.Y变量从 default修改[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方法移出方法,因此最好删除posX,posYposZ成员以支持该pos成员。

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

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

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

于 2016-03-30T21:42:37.007 回答