ПрограммированиеФорумГрафика

Камера в OpenGL (комментарии)

#0
16:48, 20 сен 2012

Камера в OpenGL (комментарии)

Это сообщение сгенерировано автоматически.

#1
16:48, 20 сен 2012

>>Четвёртый параметр является масштабным множителем, для первых трёх. Его назначение в этом методе неясно, но я не стал менять код, а просто всегда передаю 1 в качестве его значения.

Наверное, подразумевалось использование нормализованного вектора для первых 3ёх параметров.

Ещё неясен мне вызов LoadIdentity перед LoadMatrix

#2
17:18, 20 сен 2012

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

#3
17:52, 20 сен 2012

snake32
> Наверное, подразумевалось использование нормализованного вектора для первых 3ёх
> параметров.
То есть он просто для удобства введён, чтобы можно было указывать одни и те же координаты, и, просто меняя множитель, двигать камеру? Я подозревал это, но уверенности не было. В этом случае нужно его вообщек убрать, чтобы было меньше путаницы.

> Ещё неясен мне вызов LoadIdentity перед LoadMatrix
Да, не заметил его, скорее всего он не нужен. Проверю и уберу.
UPD: убрал. Вызов остался в тех времён, когда в коде был вызов glMultMatrixf, а не glLoadMatrixf.

Pokimon
> Если уж собрался рассказывать про камеру, то расскажи и про кватернионы и про
> сферические координаты.
Я не могу писать про то, чего не знаю :)
Мне кватернионы ни в одной программе ещё не понадобились (наверное, потому, что там очень простое управление камерой при помощи мыши).
Про сферические координаты могу добавить кусочек работы с камерой из реального проекта.

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

#4
19:43, 20 сен 2012

Поясните пожалуйста почему при поворотах/переносах локальных/глобальных работа с матрицей transform идёт как с матрицей в OpenGL(column-major), но в самом конце при передаче этой матрицы непосредственно в OpenGL(SetView) транспонируем её причём только часть 3х3? Это баг или...

#5
22:03, 20 сен 2012

snake32
Всё верно, так и задумано. На этом рисунке видно, что визуальное расположение элементов соответствует расположению элементов для операций, описанных в разделе Теория:
Изображение

То есть, например, для переноса мы должны умножить элементы m12, m13 и m14 (которые соответствуют элементам матрицы l, m и n на этой картинке
Изображение).

Другими словами, все матричные операции в методах выполняются, как если бы матрица хранилась в row-major порядке, но при установке матрицы мы
а) транспонируем левую верхнюю подматрицу 3х3
б) инвертируем ось Z
в) домножаем каждую ось базиса на вектор переноса

Если бы OpenGL хранил модельно-видовую матрицу в row-major порядке, то мы бы получили примерно такой код:

float[] viewmatrix = new float[]{
          transform[0], transform[1], transform[2],      -(transform[0]*transform[12] +
                                                          transform[1]*transform[13] +
                                                          transform[2]*transform[14]),
          transform[4], transform[5], transform[6],      -(transform[4]*transform[12] +
                                                          transform[5]*transform[13] +
                                                          transform[6]*transform[14]),
          -transform[8], -transform[9], -transform[10],   (transform[8]*transform[12] +
                                                          transform[9]*transform[13] +
                                                          transform[10]*transform[14]),
          0, 0, 0, 1};
#6
14:41, 21 сен 2012

>>выполняются, как если бы матрица хранилась в row-major порядке
Тогда очень странно выглядят RotateLoc и RotateGlob

GL.LoadMatrix(transform);
GL.Rotate(deg, dx, dy, dz);
GL.GetFloat(GetPName.ModelviewMatrix, transform);

потому что мы получается передаём row-major матрицу(хотя OpenGL ждёт column-major)
и получаем row-major хотя GetFloat тоже возвращает column-major.
Какая же здесь transform матрица? (row-major или column-major)

Почему нельзя сразу выполнять действия в column-major формате(в родном для OpenGL)?
Может часть ниже перечисленных действий отпала бы само собой?
>>> но при установке матрицы мы
>>а) транспонируем левую верхнюю подматрицу 3х3
>>б) инвертируем ось Z
>>в) домножаем каждую ось базиса на вектор переноса

PS: Не думайте что я придираюсь, просто самому очень хочется наконец разобраться с этим раз и навсегда

#7
9:36, 24 сен 2012

snake32
> Какая же здесь transform матрица? (row-major или column-major)
Я как-то над этим не задумывался... Надо будет исследовать этот вопрос, по результатам отпишу.

#8
13:25, 9 окт 2012

Итак, отписываю: ни к чему конкретному не пришёл, так как есть более приоритетные задачи. С каждым днём убеждаюсь, что шансы на то, что разберусь с этим самостоятельно, падают.
Могу только посовтетовать поиграться с этой программой, можеь она прольёт свет на то, как устроена "камера" в OpenGL.

#9
20:11, 9 окт 2012

Автору респект хотя статью не вникал и вообще в эту тему автор красава , учит молодых : ) !!!

ПрограммированиеФорумГрафика

Тема в архиве.