Компьютерная графика

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Компьютерная графика » Программирование графики и GPU » Камера на кватернионах


Камера на кватернионах

Сообщений 1 страница 8 из 8

1

Приветствую всех! Такая проблема. Есть класс камеры на кватернионах. Вроде всё правильно работает, кроме одной штуки – координата z с обратным знаком. Т. е., например, камера находиться в первом октанте декартовой системы координат, координата x и y отрицательны, а вот координата z с положительным знаком. Достало уже, не знаю, как с этим справиться. API - OpenGL с вытекающими отсюда последствиями. Система координат правосторонняя – синяя линия ось z, зелёная – ось y, красная – ось x.

Функция, обновляющая видовую матрицу:

Код:
inline GLvoid Cam::SetPrespective()
{
	static GLfloat qx2, qy2, qz2, qxx, qyy, qzz, qxy, qyz, qxz, qwy, qwx, qwz;

	qSide.CreateFromAxisAngle(ecVector3f(1.0f, 0.0f, 0.0f), CamPitchDegs);
	qHead.CreateFromAxisAngle(ecVector3f(0.0f, 1.0f, 0.0f), CamHeadingDegs);

	Q = qHead * qSide;
	Q.CreateMatrix(m);

	Q = qSide * qHead;

	qx2 = Q.q[1] + Q.q[1];
	qy2 = Q.q[2] + Q.q[2];
	qz2 = Q.q[3] + Q.q[3];

	qxx = Q.q[1] * qx2;	qxy = Q.q[1] * qy2;	qxz = Q.q[1] * qz2;
	qyy = Q.q[2] * qy2;	qyz = Q.q[2] * qz2;	qzz = Q.q[3] * qz2;
	qwx = Q.q[0] * qx2;	qwy = Q.q[0] * qy2;	qwz = Q.q[0] * qz2;

	vSide.v[0] = 1.0f - qyy - qzz;
	vSide.v[1] = qxy - qwz;
	vSide.v[2] = qxz + qwy;

	vHead.v[0] = qxy + qwz;
	vHead.v[1] = 1.0f - qxx - qzz;
	vHead.v[2] = qyz - qwx;

	vView.v[0] = qxz - qwy;
	vView.v[1] = qyz + qwx;
	vView.v[2] = 1.0f - qxx - qyy;

	m[12] = vSide.GetInner(vLoc);
	m[13] = vHead.GetInner(vLoc);
	m[14] = -vView.GetInner(vLoc);

	glMultMatrixf(m);
}

Само приложение: Камера.

0

2

Отдыхают все чтоль?

0

3

В этом примере я не понял а зачем вообще кватернионы - все делается из эйлеровых углов.
Проблема со знаком может быть из-за ориентации координатной системы (правая/левая)
Посмотрите мой класс - http://steps3d.narod.ru/downloads/libCamera.zip
Вообще основной плюс кватеринонов - их легко интерполировать (в отличии от углов Эйлера)

0

4

Спасибо за ответ и за класс камеры. Буду разбираться.

P. S. Эйлеровы углы не использую в принципе).

0

5

При управлении камерой при помощи мыши (для FPS) Эйлеровы углы очень удобны

0

6

Решил пока повременить с камерами на кватернионах - на матрицах работает, ну вот и прекрасно! А пока займусь более интересными вещами. Ещё раз спасибо!

0

7

Steps3D написал(а):

При управлении камерой при помощи мыши (для FPS) Эйлеровы углы очень удобны

А для не FPS? Для стратегии a-la Homeworld, например, что посоветуете?

0

8

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

0


Вы здесь » Компьютерная графика » Программирование графики и GPU » Камера на кватернионах


создать форум