Камера в OpenGL (комментарии)
Это сообщение сгенерировано автоматически.
>>Четвёртый параметр является масштабным множителем, для первых трёх. Его назначение в этом методе неясно, но я не стал менять код, а просто всегда передаю 1 в качестве его значения.
Наверное, подразумевалось использование нормализованного вектора для первых 3ёх параметров.
Ещё неясен мне вызов LoadIdentity перед LoadMatrix
Если уж собрался рассказывать про камеру, то расскажи и про кватернионы и про сферические координаты.
И приведи с ними код.
snake32
> Наверное, подразумевалось использование нормализованного вектора для первых 3ёх
> параметров.
То есть он просто для удобства введён, чтобы можно было указывать одни и те же координаты, и, просто меняя множитель, двигать камеру? Я подозревал это, но уверенности не было. В этом случае нужно его вообщек убрать, чтобы было меньше путаницы.
> Ещё неясен мне вызов LoadIdentity перед LoadMatrix
Да, не заметил его, скорее всего он не нужен. Проверю и уберу.
UPD: убрал. Вызов остался в тех времён, когда в коде был вызов glMultMatrixf, а не glLoadMatrixf.
Pokimon
> Если уж собрался рассказывать про камеру, то расскажи и про кватернионы и про
> сферические координаты.
Я не могу писать про то, чего не знаю :)
Мне кватернионы ни в одной программе ещё не понадобились (наверное, потому, что там очень простое управление камерой при помощи мыши).
Про сферические координаты могу добавить кусочек работы с камерой из реального проекта.
Но вообще, я уже забыл, что написал эту статью, тем более, что код для неё практически неактуален.
Поясните пожалуйста почему при поворотах/переносах локальных/глобальных работа с матрицей transform идёт как с матрицей в OpenGL(column-major), но в самом конце при передаче этой матрицы непосредственно в OpenGL(SetView) транспонируем её причём только часть 3х3? Это баг или...
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};
>>выполняются, как если бы матрица хранилась в 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: Не думайте что я придираюсь, просто самому очень хочется наконец разобраться с этим раз и навсегда
snake32
> Какая же здесь transform матрица? (row-major или column-major)
Я как-то над этим не задумывался... Надо будет исследовать этот вопрос, по результатам отпишу.
Итак, отписываю: ни к чему конкретному не пришёл, так как есть более приоритетные задачи. С каждым днём убеждаюсь, что шансы на то, что разберусь с этим самостоятельно, падают.
Могу только посовтетовать поиграться с этой программой, можеь она прольёт свет на то, как устроена "камера" в OpenGL.
Автору респект хотя статью не вникал и вообще в эту тему автор красава , учит молодых : ) !!!
Тема в архиве.