Java рулевой объект с двумя скоростями колеса - PullRequest
3 голосов
/ 30 января 2012

Допустим, у меня есть двухколесный объект, где каждое колесо имеет независимую скорость (lWheelV и rWheelV для левого и правого колес соответственно).Скорости каждого из колес ограничены диапазоном [-1, 1] (то есть между -1 и 1).

  • Если lWheelV = 1 & rWheelV = 1, объект перемещается вперед
  • Если lWheelV = -1 & rWheelV = 1, объект поворачивается влево (против часовой стрелки)
  • Если lWheelV = 0,5 & rWheelV = 1, объект будет двигаться вперед, медленно поворачивая влево
  • Если lWheelV = -1 & rWheelV = -1, объект будет двигаться назад.

Это может быть проще визуализировать на следующем изображении:

object motion diagram

Какая математика мне нужна, чтобы описать такой объект, и, что более важно, как я могу реализоватьпрограммное обеспечение, которое будет воспроизводить это поведение в Java .

1 Ответ

1 голос
/ 30 января 2012

Это зависит от целого ряда вещей, таких как ширина транспортного средства, количество кадров в секунду и т. Д. ...

Однако некоторые советы:

  • Чтобы вычислить вращениетранспортное средство в одном кадре, вы можете использовать функцию арктана.

    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;
    
  • A normalise() метод выглядит следующим образом:

    public float normalise()
    {
        float len = (float) Math.sqrt(x * x + y * y);
        x /= len;
        y /= len;
        return len;
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...