2015-01-23 4 views
1

У меня есть объект, который я хочу повернуть с помощью мыши в Opengl (я использую перегиб). Я отслеживаю движение мыши и вращаюсь в соответствии с изменением x и y мыши. Но проблема в том, что объект не движется, как я этого хочу. Например, когда я перемещаюсь по x, а затем перемещаюсь по y, а затем снова перемещаюсь в x, объект, кажется, перемещается по диагонали, в то время как я хочу, чтобы он перемещался слева направо. Я знаю, что это связано с тем, что более новые вращения выполняются до более старых поворотов (что приводит к неинтуитивному вращению) из-за того, как работает матричное умножение.Opengl вращать объект с помощью мыши (C++)

Но я не знаю, как решить эту проблему. Один из способов, я думал, это изменить оси, вокруг которых я вращаюсь в соответствии с текущим вращением, но я не знаю, приведет ли это к правильному результату. Еще одна вещь, о которой я думал, - убедиться, что последняя ротация завершена последней (но прежде чем glulookat переведет сцену), но я не знаю, как это сделать. Итак, какой был бы лучший способ решить эту проблему?

+0

Мы понятия не имеем, что такое поведение вашего кода и какое поведение вы считаете правильным. Вам нужно будет добавить свой код и рассказать нам, что он делает и что вы хотите. – beaker

+2

Трудно узнать, что вы хотите, но похоже, что вы после реализации «arcball» какого-то типа. Оригинальная статья Кена Шоемэка [здесь] (http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.457.6530&rep=rep1&type=pdf), но вы должны иметь возможность находить реализации и описания [ quaternions] (http://en.wikipedia.org/wiki/Quaternion) онлайн. Кроме того, вам нужен кватернион, описывающий текущее состояние вращения, а во время анимации временный кватернион умножается на ток до тех пор, пока вы не отпустите «мышь», чтобы предотвратить гистерезис. –

+0

Извините, если на 100% не понятно, что я имею в виду. Я googled 'arcball', и это как-то то, что я хочу, но менее строгий, я думаю. Я просто хочу повернуть на основе движения мыши, это не имеет значения, если я или нет, я на самом деле нажимаю на объект. Если я нажму кнопку мыши, и я перейду от скажем, слева направо, я хочу, чтобы объект вращался вокруг оси y. – SilverTear

ответ

1

Есть два основных подхода, которые вы можете предпринять.

  • Использование кватернионов путем проецирования координат мыши на сферу (подход дуги). Сделайте сферу размером окна, поэтому вам не нужно беспокоиться о щелчке по объекту.

  • Поворот вокруг y для горизонтального перемещения мыши. Затем, для вертикального движения мыши, поверните вокруг поперечного произведения вектора вида и y (будьте осторожны, если кросс-произведение равно нулю). Это подход, используемый Майей и другими для ориентации вида редактирования.

+0

Спасибо за предложения. Я думаю, что я уже использовал ваш второй метод. Но так как я смотрю прямо на ось -z, то поперечное произведение - это ось x (вокруг которой я вращался). Проблема в том, что я вращаю ее, и она умножается на текущую матрицу, которую она применяет перед вращением до этого (если это имеет смысл). Так что может случиться так, что когда я хочу повернуть влево, перемещая мышь влево, объект движется по диагонали. – SilverTear

Смежные вопросы