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

Вычисление NearZ и FarZ для ортогональной проекции

#0
13:26, 13 июня 2017

Изучаю демку Island11. Для теней строится ортогональная проекция.

D3DXVECTOR3 EyePoint= D3DXVECTOR3(-10000.0f,6500.0f,10000.0f);

float nr, fr;
nr=sqrt(EyePoint.x*EyePoint.x+EyePoint.y*EyePoint.y+EyePoint.z*EyePoint.z)-terrain_far_range*0.7f;
fr=sqrt(EyePoint.x*EyePoint.x+EyePoint.y*EyePoint.y+EyePoint.z*EyePoint.z)+terrain_far_range*0.7f;

D3DXMATRIX mProjMatrix = *D3DXMatrixOrthoLH(&mProjMatrix,terrain_far_range*1.5,terrain_far_range,nr,fr);

Этот фрагмент понять не получается. Что за выражение используется для вычисления NearZ и FarZ?

Получается что-то типа:
NearZ=sqrt(x*x+y*y*+z*z)-terrain_far_range*0.7
FarZ=sqrt(x*x+y*y*+z*z)+terrain_far_range*0.7

sqrt(x*x+y*y*+z*z) - что-то очень знакомое. Никак вспомнить не могу как называется.


#1
13:39, 13 июня 2017

Длина вектора, дядя, длина вектора. В данном случае - расстояние от начала координат до EyePoint

#2
13:46, 13 июня 2017

> Никак вспомнить не могу как называется.

Там еще такой пифагор был, со штанами во все стороны одинаковыми.

#3
19:40, 13 июня 2017

Deamon
> Длина вектора, дядя, длина вектора.
Прав однако. Сам позабыл уже такие базовые вещи. Привык пользоваться готовыми функциями вроде XMVector3Length.

Кое что остается до сих пор не ясным:

float nr, fr;
nr=sqrt(EyePoint.x*EyePoint.x+EyePoint.y*EyePoint.y+EyePoint.z*EyePoint.z)-terrain_far_range*0.7f;
fr=sqrt(EyePoint.x*EyePoint.x+EyePoint.y*EyePoint.y+EyePoint.z*EyePoint.z)+terrain_far_range*0.7f;

D3DXMATRIX mProjMatrix = *D3DXMatrixOrthoLH(&mProjMatrix,terrain_far_range*1.5,terrain_far_range,nr,fr);
Правильно понимаю, что тут NearZ и FarZ вычисляются таким образом, чтобы весь ландшафт поместился в shadow map?
Зачем еще тут магические числа вроде 0.7 и 1.5.

Опытным путем выяснилось, что умножение на 1.5 нужно, чтобы подогнать ширину проекции под длину диагонали ландшафта. А вот умножение на 0.7 пока загадка. Изменения без умножения незначительные.

#4
9:36, 14 июня 2017

Тут угол наклона между источником и плоскостью земли примерно .41rad (из произведения векторов нормали территории и источника света) отсюда уже и считаем все эти 1.5 и .7, для того чтобы​ вся территория влезла матрицу проекции источника света. Если непонятно объяснил, то могу схему нарисовать - задача из курса школьной геометрии.

>Изменения без умножения незначительные.
Естественно, больше не меньше. А Вы попробуйте на .5 умножить вместо .7, или даже на .2, что бы наверняка....

#5
11:11, 14 июня 2017

iKest
> Тут угол наклона между источником и плоскостью земли примерно .41rad (из
> произведения векторов нормали территории и источника света) отсюда уже и
> считаем все эти 1.5 и .7, для того чтобы​ вся территория влезла матрицу
> проекции источника света. Если непонятно объяснил, то могу схему нарисовать -
> задача из курса школьной геометрии.
Достаточно название темы курса, которая поможет разобраться как в зависимости от угла наклона вычисляются коэффициенты вроде 1.5 и 0.7.

#6
11:40, 14 июня 2017

Геометрия, подобие треугольников, теорема Пифагора, смежные углы.

#7
16:12, 14 июня 2017

Длина вектора 15564,3828. Это по сути длина гипотенузы прямоугольного треугольника.
Высота катета 6500 (берем из y). Этого достаточно, чтобы найти синус угла: 6500/15564,3828 = 0,4176 радиан или где-то 24 градуса.

По теореме Пифагора можно найти длину второго катета: 15564,3828^2 - 6500^2 = 14142,14^2, т.е. длина катета получается 14142,14.
Периметр треугольника получается: 15564,3828 + 6500 + 14142,14 = 36206,5228.

Сумма смежных углов равна 180. Значит смежные угол второго треугольника равен 156 градусов. Cos(156) = -0,9135.

По теореме косинусов (по двум сторонам и углу между ними) можно найти третью сторону прилегающего треугольника, будет равна 29058,52.
Периметр треугольника получается: 15564,3828 + 29058,52 + 14142,14 = 58765,0428.

Коэффициент подобия это отношение периметров:  36206,5228 / 58765,0428 = 0,6161. Это и получается что-то близкое к 0,7.

Все верно?

#8
16:38, 14 июня 2017

Ещё не забываем, что террайн имеет высоту и глубину, поэтому матрица шире, чем диагональ (по Пифагору 1.41, а они 1.5 взяли), и коэффициент near/far .7, вместо 0.62

#9
20:37, 14 июня 2017

Какие-то странные формулы, я просто считал AABB сцены, потом умножал на ModelView матрицу от источника освещения и получал новый AABB, где x и y - размеры для ортогональной проекции, а z - плоскости отсечения.
Единственное надо подогнать вращение чтоб не было пустых областей (хз как это правильно объяснить, а скриншоты неоткуда взять пока).

#10
20:49, 14 июня 2017

/A\
Крути-ни крути, один фиг пустые области будут, если только источник не лежит на одной из осей...

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

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