Общая проблема с поворотом простой трехмерной матрицы - PullRequest
0 голосов
/ 07 декабря 2011

У меня проблема с моим вращением на моем 3D-объекте (он в java, но это не имеет большого значения)

Фон:

У меня есть простая 3d-модель, и выесли вы играете от первого лица, вы перемещаете мышь вверх, чтобы посмотреть вверх (IE Rotate по оси X 3D), и двигаете мышь вниз, чтобы смотреть вниз (Rotate в противоположном направлении)

Но:

У меня также есть клавиши со стрелками влево и вправо для поворота влево / вправо (который вращает ось Y 3D)

Теперь проблема заключается в том, когда я поворачиваюсь, когда я поворачиваюсь на x-ось больше не поворачивается, как ожидалось, т.е. если вы поворачиваетесь на 180 градусов, перемещая мышь вниз, вы на самом деле смотрите вверх, а если вы перемещаете мышь вверх, вы на самом деле смотрите вниз.

Какой поворот я могу выполнить на х /ось у, чтобы это исправить?

-Так как бы я ни повернулся, перемещение мыши вверх будет смотреть вверх, а перемещение мыши вниз -

Извините, я не могу объяснитьлучше, но если вам нужна дополнительная информация, просто оставьте комментарий.

Большое спасибо,

Вероятно, это простое преобразование, но я не могу думать: (

Часть кода вращения Java:

Мышь вверх / вниз:

  public void rotateXY(double radians, double Yradians)
  {
      vpTrans.getTransform(T3D); 
      Transform3D test = new Transform3D();
      Transform3D testX = new Transform3D();
      Transform3D testY = new Transform3D();
      translate.set(lastXcord, lastYcord, lastZcord);
      testX.rotX(radians);
      testY.rotY(Yradians);
      test.mul(testX, testY);
      test.setTranslation(translate);
      vpTrans.setTransform(test);
      //System.out.println(test);
  } // end of rotateXY()

Слева: (справа точно так же, но с минусом вместо плюса при изменении угла)

 public void run() {
    Transform3D test = new Transform3D();
    Transform3D rotX = new Transform3D();
    Transform3D rotY = new Transform3D();

    vpTrans.getTransform(T3D);
    translate.set(lastXcord, lastYcord, lastZcord);
    angle += 0.05;
    trueangle += 0.05;
    rotX.rotX(angle);
    rotY.rotY(Yangle);

    test.mul(rotX, rotY);

    test.setTranslation(translate);
    vpTrans.setTransform(test);
}

Какие преобразования / повороты мне нужно добавить к этому, независимо от моей оси y, камера будет смотреть вверх, когда мышь перемещается вверх и вниз, когда мышь перемещается вниз ??

1 Ответ

2 голосов
/ 07 декабря 2011

Похоже, у вас проблема с порядком преобразований. В отличие от числового умножения, матричное умножение не является коммутативным . 3D-приложения очень чувствительны к порядку преобразований.

На английском языке:

, если x и y - числа, то x * y = y * x

Однако, если x и y являются матрицами , то x * y y * x!

Имея это в виду, давайте посмотрим, что вы делаете.

test.mul(rotX, rotY);

Чтобы визуализировать, что происходит с этим умножением, представьте, что у вас есть прямая линия, выходящая из вашей головы. Мы назовем это LineUp. Теперь посмотрите на свою клавиатуру, представьте, LineUp наклоняется вместе с вами. Теперь поверните голову на 90 градусов на LineUp. Это то, что происходит с вашей матрицей вращения. Сумасшедший, да?

Теперь давайте обратим умножение следующим образом: test.mul(rotY, rotX);

Так что сидите прямо, смотрите вперед и поворачивайте голову / тело / стул. Теперь посмотри немного вниз. Сначала вы повернули на истинную ось LineUp, а затем применили преобразование вверх / вниз. Веселье да?

Отличный способ думать о матричных преобразованиях подобен набору команд, который должен быть в порядке.

  1. Поверните голову направо. (rotY)
  2. Поверни голову вверх. (rotX)
  3. Перейти к компьютеру (translate)
  4. ... и т.д.

Изменение порядка одной операции меняет все последующие инструкции смешным и возмутительным образом.

Вы создаете камеру, поэтому я настоятельно рекомендую прочитать, как ее построить .

Отличным упражнением для понимания матричных преобразований является построение солнечной системы, содержащей орбитальные луны и вращающиеся планеты. Это будет открытие глаз и очень информативно.

...