具有两个车轮速度的Java转向对象
假设我有一个两轮物体,其中每个轮子都有一个独立的速度(lWheelV和rWheelV分别代表左手和右手的轮子)。每个车轮的速度限制在范围[-1,1](即-1和1之间)具有两个车轮速度的Java转向对象,java,math,physics,Java,Math,Physics,假设我有一个两轮物体,其中每个轮子都有一个独立的速度(lWheelV和rWheelV分别代表左手和右手的轮子)。每个车轮的速度限制在范围[-1,1](即-1和1之间) 如果lWheelV=1&rWheelV=1,则对象向前移动 如果lWheelV=-1&rWheelV=1,则对象向左旋转(逆时针) 如果lWheelV=0.5和rWheelV=1,则对象将在缓慢左转的同时向前行驶 如果lWheelV=-1&rWheelV=-1,则对象将向后移动 这可能更容易在下图中显示: 我需要什么数学来描
- 如果lWheelV=1&rWheelV=1,则对象向前移动
- 如果lWheelV=-1&rWheelV=1,则对象向左旋转(逆时针)
- 如果lWheelV=0.5和rWheelV=1,则对象将在缓慢左转的同时向前行驶
- 如果lWheelV=-1&rWheelV=-1,则对象将向后移动
我需要什么数学来描述这样一个对象,更重要的是,我如何实现在Java中复制这种行为的软件。这实际上取决于一系列因素,如车辆宽度、fps等 但是,有一些提示:
- 要在一帧内计算车辆的旋转,可以使用arctan函数
float leftWheel = 1.0f; float rightWheel = 0.5f; float vehicleWidth = 1.0f; float diff = rightWheel - leftWheel; float rotation = (float) Math.atan2(diff, vehicleWidth);
- 要确定车辆沿其轴移动的速度,请使用以下方法:
float speedAlongAxis = leftWheel + rightWheel; speedAlongAxis *= 0.5f;
- 按照第一个尖端计算的角度旋转车辆轴:
float axisX = ...; float axisY = ...; /* Make sure that the length of the vector (axisX, axisY) is 1 (which is * called 'normalised') */ float x = axisX; float y = axisY; axisX = (float) (x * Math.cos(rotation) - y * Math.sin(rotation)); axisY = (float) (x * Math.sin(rotation) + y * Math.cos(rotation));
- 要在轴上移动车辆,请执行以下操作:
float vehicleX = ...; float vehicleY = ...; vehicleX += axisX * speedAlongAxis; vehicleY += axisY * speedAlongAxis;
方法如下所示:normalise()
public float normalise() { float len = (float) Math.sqrt(x * x + y * y); x /= len; y /= len; return len; }
normalise()
调用?对向量进行归一化就是将其缩放,使其长度变为1。