【发布时间】:2016-07-19 01:01:03
【问题描述】:
问题:我的玩家模型应该转向最后一次鼠标点击的方向,但不是缓慢转动,而是以所有可能的方式旋转(游戏有等距视图,模型应该只绕 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 的输入处理器,使代码更具可读性和开放性
【问题讨论】:
-
我刚看到 180/Math.PI - 您确定要将 180 除以(弧度为 180)吗?
-
您失去控制的一个可能原因可能是每 1/60(ish) 秒调用一次 render() 方法。考虑到您想要做什么,这非常非常非常快。相反,您可能希望使用增量时间来缓和每帧旋转的变化。这是一个关于如何使用 delta 的好例子:stackoverflow.com/questions/22405390/…
-
Krab:是的,那里的数学有点不靠谱,但 newAngle 中的计算解决了所有可能的问题 Fish:好吧,我试试 deltatime,如果它有效,我会报告。也许我的原始代码真的很慢,这就是它没有失控的原因?
-
@Fish 好吧,正如你所料,旋转速度慢了很多,但不完全围绕 Y 轴旋转的问题仍然存在。谢谢你提醒我 deltatime,但我总是忘记它的存在。
标签: java libgdx rotation 3d-model