2016-03-30 62 views
0

问题:我的播放器模型应该转变为最后一次鼠标点击的方向,但不是慢慢转动,它会以各种可能的方式旋转(游戏具有等轴视图,模型应该是仅围绕Y轴旋转,但也围绕X轴和Z轴旋转)。Java/libgdx 3D模型旋转错误

以下方法(称为渲染())负责模型的转弯行为:

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; 

} 

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

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

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

附加信息:

  • 原来我用简单的投票来获得所有键盘和鼠标输入
  • 计算的移动/旋转在一个大的方法,一切工作 精细
  • 决定使用的inputprocessor libgdx使代码更具可读性和开放性
+0

我刚刚看到180/Math.PI - 你确定要用180(180弧度)来分割180吗? – Krab

+0

为什么你失去控制可能是因为render()方法每1/60(ish)秒被调用一次。考虑到你想要做什么,这是非常非常快的。相反,您可能需要使用增量时间来缓和每个帧的旋转变化。下面是如何使用德尔塔的一个很好的例子:http://stackoverflow.com/questions/22405390/delta-value-in-render-method-libgdx?answertab=votes – Fish

+0

Krab:是的数学有一种不可思议,但newAngle中的计算修复了所有可能的问题 鱼:好的,我会尝试deltatime,如果它有效,我会报告回来。也许我原来的代码真的很慢,这就是为什么它没有失去控制? – Boskop88

回答

0

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

所以,在通话的情况下:

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

这将切实从默认[x:0, y:1, z:0],对什么矩阵的平移组件设置为修改Vector3.Y变量。这将导致使用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)上创建垃圾回收。因此,每次调用方法时都不会创建新的Vector3,而是允许您指定要重用的那个类的实例。由于这个原因,您会在多个地方看到这种模式。

为什么甚至有可能修改Vector3.Y,使其无用并导致所有类型的问题?这是因为Vector3类是可变的,并且不封装其成员。所以几乎可以让你做vector.x += 3;,而不是强迫你致电vector.setX(vector.getX() + 3);。这是出于可读性和性能原因(尽管后者可能会在您的目标平台上有所不同)。另外,java不支持与const相媲美的东西。

+0

谢谢你,现在有效。此外,感谢您解释getTranslation是如何工作的,而不仅仅是倾销代码(最初没有工作,但后来我意识到相机也依赖于它)。 – Boskop88