Предельная подача камеры

Как я могу эффективно ограничить подачу камеры, когда у меня есть только кватернион камеры? Я должен преобразовать в эйлеровы углы и затем обратно в кватернион или есть ли какой-либо другой путь?

12
задан walkytalky 9 August 2010 в 17:56
поделиться

3 ответа

Кватернионы поворота камеры могут быть определены как:

vector A = [x, y, z] 
Q.x = A.x * sin(theta/2)
Q.y = A.y * sin(theta/2)
Q.z = A.z * sin(theta/2)
Q.w = cos(theta/2)

Где A - позиция, а тета - угол, на который вы хотите повернуть камеру (отрегулируйте шаг).

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

Я думаю, что вы можете избежать преобразования, если установите свои пределы как

+cos(supLim/2) < (Q.w + P.w) < -cos(infLim/2)

Поскольку косинус является непрерывной функцией, это должно работать.

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

0
ответ дан 2 December 2019 в 23:50
поделиться

Если у камеры никогда не бывает крена (как это часто бывает во многих играх, например, в шутерах от первого лица), то решение простое. Если есть бросок, то нужно сделать дополнительный шаг. Я начну с того, что делать, если броска нет, и обобщу решение, что делать, если есть.

Пусть qc - поворот камеры. Пусть qy вращается с таким же рысканием, что и qc, но с нулевым шагом. Если крена нет, вращение камеры - это поворот по рысканью, за которым следует вращение по тангажу:

qc = qp * qy

Мы можем восстановить вращение по тангажу qp как вращение от qy до qc:

qp = qc * qy^-1

Таким образом, уловка состоит в том, чтобы построить qy, так что мы можем вставить его в приведенное выше уравнение, чтобы найти qp. Пусть vc будет единичным вектором, направленным из объектива камеры, или «прямым вектором». Пусть vy будет тем же вектором, но спроецированным на горизонтальную плоскость и нормализованным. Наконец, пусть v0 будет прямым вектором, когда вращение камеры qc является единичным вращением. Вращение, которое превращает v0 в vy, называется поворотом по рысканью. Угол может быть задан как:

yaw = asin(Norm(cross(v0, vy)))

Соответствующее вращение по рысканью:

qy = { cos(yaw/2), up * sin(yaw/2) }

Где «вверх» - единичный вектор в направлении вверх, он же ось для поворотов по рысканью. Вставьте это в qp = qy ^ -1 * qc выше, чтобы получить кватернион высоты тона qp. Наконец, получите угол тангажа из qp как:

pitch = 2*asin(Dot(right, [qp[1], qp[2], qp[3]]))

Где «вправо» - это единичный вектор в правильном направлении, также известный как ось для вращений шага.

Как я уже сказал, все усложняется, если у камеры есть крен, но общая стратегия остается той же. Вы формулируете вращение камеры как произведение компонентов вращения, а затем выделяете нужный компонент (в данном случае шаг).Например, если последовательность Эйлера, которую вы используете для определения «тангажа», является обычной последовательностью рыскания-тангажа-крена, вы определяете qc как:

qc = qr * qp * qy

Мы можем определить переменную qx как комбинированное вращение тангажа и крена:

qx = qr * qp

Теперь мы можем записать qc как:

qc = qx * qy

Мы уже знаем, как решить для qx в этой форме, повторяя шаги, которые мы использовали выше для решения для qp. Переставляя определение для qx, мы получаем:

qp = qr^-1 * qx

Мы только что решили для qx, поэтому для определения угла поворота qp нам нужен только крен qr. Мы можем построить его, используя векторы, как мы это делали ранее. Пусть vc снова будет прямым вектором. Бросок будет вращением вокруг этого вектора. Пусть vu будет вектором вверх камеры (в мировых координатах), и пусть vu0 будет вектором вверх камеры с нулевым креном. Мы можем построить vu0, спроецируя глобальный вектор вверх на плоскость, перпендикулярную vc, а затем нормализуя. Вращение рулона qr - это вращение от vu0 до vu. Осью этого вращения является прямой вектор vc. Угол крена

roll = asin(Dot(vc, cross(vu0, vu)))

Соответствующий кватернион:

qr = { cos(roll/2), forward * sin(roll/2) }

Где «вперед» - ось вращения крена.

2
ответ дан 2 December 2019 в 23:50
поделиться

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

Простое преобразование в углы Эйлера и обратно, когда вам нужно ограничить движение, может работать не слишком хорошо, так как вам нужно запомнить последний кадр (если он у вас есть), чтобы увидеть, перешли ли вы предел и в каком направление.

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

1
ответ дан 2 December 2019 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: