Урок 4 - Свет, камера, материал! Часть 1 (комментарии)
Это сообщение сгенерировано автоматически.
Можешь прокомментировать функцию LookAT в особенности, что такое dot?
RigoN
> что такое dot?
А ты ещё хотел чтобы в уроке понапиханы мат формулы были... :)
dot это скалярное произведение - косинус угла между двумя векторами (конечно если вектора нормализовать)...
Арккосинус этого числа даст угол в радианах...
Executor
> dot это скалярное произведение
я уточняю...
А у тебя lookat так же считается? Имеется ввиду алгоритм получения матрицы.
RigoN
> А у тебя lookat так же считается? Имеется ввиду алгоритм получения матрицы.
Обычно я пользуюсь функцией которая строит мне матрицу, но и транслейт + ротейт применяю, например в той же статье про шадоумапы, насколько мне помнится я сделал вращение камеры с помощью ротейтов и транслейтов...
RigoN
> А у тебя lookat так же считается? Имеется ввиду алгоритм получения матрицы.
Этот алгоритм из доки по DirectX, ибо в доке к glLookAt кривой алгоритм.
Кстати не помню чтобы у меня там использовалась эта функция, я ее в этом уроке оставил без внимания.
KpeHDeJIb
> Этот алгоритм из доки по DirectX, ибо в доке к glLookAt кривой алгоритм.
Я это заметил..., поэтому и спрашиваю, почему ты решил использовать именно этот вариант?
Так как и в документации к glu, откуда берет корни данная функция и в wiki и в исходниках glu используется другой алгоритм. Этот же алгоритм я использую у себя. KpeHDeJIb
> Кстати не помню чтобы у меня там использовалась эта функция, я ее в этом уроке
> оставил без внимания.
Видовую матрицу ты же создаешь и умножаешь её на матрицу проекции.
Executor
> Обычно я пользуюсь функцией которая строит мне матрицу, но и транслейт + ротейт
> применяю,
А никто и не спорит в том, что это две стороны одной медали - модельно-видовых преобразований. Вопрос не глобальный, а вопрос в реализации создания видовой матрицы ака LookAt.
RigoN
> Так как и в документации к glu, откуда берет корни данная функция и в wiki и в
> исходниках glu используется другой алгоритм. Этот же алгоритм я использую у
> себя
Ну я же сказал, взял из DX-а алгоритм потому что он мне больше понравился, никакого тайного умысла тут нет.
KpeHDeJIb
Зачем «Чтение: Всем зарегистрированным»? Открой доступ.
wat
> Зачем «Чтение: Всем зарегистрированным»? Открой доступ.
Открыл.
KpeHDeJIb
> Ну я же сказал, взял из DX-а алгоритм потому что он мне больше понравился,
> никакого тайного умысла тут нет.
Я не про тайный умысел я про алгоритм вычисления
мне не понятно вот в этом коде:
inline const mat4 GLLookAt(const vec3 &position, const vec3 ¢er, const vec3 &up) { const vec3 f = normalize( position - center); const vec3 s = normalize( cross( up, f)); const vec3 u = normalize( cross( f, s)); return mat4( s.x, s.y, s.z, -dot( s, position), u.x, u.y, u.z, -dot( u, position), f.x, f.y, f.z, -dot( f, position), 0, 0, 0, 1); }
что ты вычисляешь используя -dot(s, position) исходя из коментов выше косинус угла причем еще и с минусом, проясни плиз
в исходниках gluLookAt сделано иначе. Что матрицы у тебя строчные мы определились ранее, то после транспонирования твои доты лягут в четвертую строку, верно?
У себя я делал по анологии с исходниками glu.
вот так в glu
void GLAPIENTRY gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz) { float forward[3], side[3], up[3]; GLfloat m[4][4]; forward[0] = centerx - eyex; forward[1] = centery - eyey; forward[2] = centerz - eyez; up[0] = upx; up[1] = upy; up[2] = upz; normalize( forward); /* Side = forward x up */ cross( forward, up, side); normalize( side); /* Recompute up as: up = side x forward */ cross( side, forward, up); __gluMakeIdentityf( &m[0][0]); m[0][0] = side[0]; m[1][0] = side[1]; m[2][0] = side[2]; m[0][1] = up[0]; m[1][1] = up[1]; m[2][1] = up[2]; m[0][2] = -forward[0]; m[1][2] = -forward[1]; m[2][2] = -forward[2]; glMultMatrixf( &m[0][0]); glTranslated( -eyex, -eyey, -eyez); }
RigoN
Эта функция откуда? У него же в примере нет никакого lookat...
Executor
> Эта функция откуда? У него же в примере нет никакого lookat...
а это
Ну так эта функция в примере же никак не фигурирует, соответственно для чего её в примере объяснять?
Или я чего не понял?
Тема в архиве.