Матрица LookAt (комментарии)
Это сообщение сгенерировано автоматически.
Почините верстку, вся главная в этой статье.
0xc0de
Это подсказки. Кроме того ассемблер знают не все.
В чем причина вашей ереси?
Dampire
> Почините верстку, вся главная в этой статье.
>
>
Это к модераторам.
eDmk
> По вашей логике все подсказки надо удалить?
Не так. По моей логике информация должна быть упорядочена и скомпонована, а не разбросана по подсказкам. И это должен быть не тупо кусок кода для копипаста, а пояснения. В подсказках имхо должна быть специфическая информация, которую найти довольно сложно.
Представь, что будет если создать на каждую функцию из библиотеки glm отдельную подсказку.
0xc0de
> должна быть упорядочена и скомпанована
Она упорядочена, скомпонована и лежит на сайте GameDev. Модератор опубликовал.
Я не понимаю, что вам не нравится в подсказке? Почему вам другие подсказки нравятся?
Там тоже куча, на мой взгляд, глупостей, которые очевидны.
Одни считают, что надо только формулы приводить, другие считают, что без кода - не дело.
Третьим подавай чертежи с подробной докой. Я вам так скажу - не нравится - не щупай.
eDmk
> Я не понимаю, что вам не нравится в подсказке?
Не, ну если ты бы вместо того, чтобы удалять сообщения, еще бы в них вникал, то наверное понял бы, что не нравится и как твои подсказки можно улучшить. Или критика уже запрещена?
0xc0de
> Или критика уже запрещена?
А что вы хотите критиковать? Это просто готовая функция с комментариями в коде.
Я писал все сам. Время потратил. Это работа и не самая плохая. Критикуйте, если есть чего.
>вместо того, чтобы удалять сообщения
Эти сообщения не о чем. Тут чел мне на доктора намекал. Я его удалил.
Зачем хамить то?
Где что вылезло на главную? У меня всё нормально.
Mikle
wat поправил.
eDmk
> другие считают, что без кода - не дело
На таких можешь не обращать внимания, им даже если дать готовый код, они всё равно ничего не поймут и сделают всё неправильно. На гд.ру даже наглядные примеры есть.
Delfigamer
Поискал на этом сайте LookAt - первая ссылка на страницу из книги по OpenGL на английском. Вообщем ни о чем. Следующие 9 ссылок также ни о чем. 1 ссылка корректная, но нужна библиотека glu. Дальше все советуют пользоваться glm. 3 страницы ссылок в google просмотрел и везде не рабочий код.
Функция не секретная. Взял из книги Фрэнсиса Хилла OpenGL для профессионалов, но она там не готовая, а в виде формул. Написал, отладил и оптимизировал. Куча работы сделана. Все равно не нравится что-то. Не нравится - не бери. Нравится - возьми и пользуйся. Странные люди.
Не у всех анрилы и юнити стоят. Кто то и по старинке сам пишет.
заведи свой блог и пиши там, так все делают(и я тоже)
на публичных форумах не все труды принимаются, подстраивайся че
eDmk
> Кто то и по старинке сам пишет
посоветую тебе прочитать про рейтрейсинг, и посмотреть код простейших рейтрейсеров,где в том числе матрица lookAt применяется постоянно
все 3Д передвижения с клавиатуры/мышки и поворот камеры занимают пару десятков строк кода
вот все расчеты на чистом Си, весь код можно скопипастить и скомпилировать на любой ОС под любое железо (на Си добавив определений под типы vecX и все)
Danilw
> посоветую тебе прочитать про рейтрейсинг, и посмотреть код простейших
> рейтрейсеров,где в том числе матрица lookAt применяется постоянно
struct Camera { FMat mwc; FMat mcw; float utan; float vtan; static Camera Targeted(FPoint const& origin, FPoint const& target, float utan, float vtan) { FDisp forward = norm( target - origin); FDisp up = FDisp{ 0, 0, 1 }; FDisp right = norm( cross( forward, up)); FDisp down = norm( cross( forward, right)); Camera c; c.mwc = FMat::basis( right, down, forward, origin); c.mcw = inverse( c.mwc); c.utan = utan; c.vtan = vtan; return c; } };
void ForwardSampler::Iterate() { for ( int iy = height - 1; iy >= 0; --iy) { for ( int ix = 0; ix < width; ++ix) { float dx; float dy; GenerateTriangle( dx); GenerateTriangle( dy); float cx = 2.0f * ( ix + dx + 0.5f) / width - 1.0f; float cy = 1.0f - 2.0f * ( iy + dy + 0.5f) / height; float cu = cx * camera.utan; float cv = cy * camera.vtan; TraceRequest tr; tr.origin = camera.mwc.origin( ); tr.dir = norm( camera.mwc * FDisp{ cu, cv, 1.0f }); <...> } } }
void BidirSampler::RecordContribution(FDisp dir, FDisp value) { FDisp cdir = camera.mcw * dir; float cdx, cdy, cdz; cdir.unpack( cdx, cdy, cdz); if ( cdz >= 0) { return; } float cu = cdx / cdz; float cv = cdy / cdz; float cx = cu / camera.utan; float cy = cv / camera.vtan; float nx = 0.5f * ( 1.0f + cx) * width - 0.5f; float ny = 0.5f * ( 1.0f - cy) * height - 0.5f; float nfx = floorf( nx); float nfy = floorf( ny); float dx = nx - nfx; float dy = ny - nfy; int ix = ( int)nfx; int iy = ( int)nfy; float q; GenerateUniform( q); if ( q < dx) { ix += 1; } GenerateUniform( q); if ( q < dy) { iy += 1; } RecordToFrame( ix, iy, value); }
(сами лучи считаются в мировых координатах)
Тема в архиве.