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

Отсечение по пирамиде видимости(frustum culling)

Страницы: 1 2 Следующая »
#0
10:40, 18 мая 2006

Привет всем.
Начал изучать отсечение по пирамиде видимости. Нашел уравнения 6 плоскостей:

D3DXMATRIX viewProjection=View*Projecton;
m_frustum[0].A = viewProjection.M14 + viewProjection.M11;
m_frustum[0].B = viewProjection.M24 + viewProjection.M21;
m_frustum[0].C = viewProjection.M34 + viewProjection.M31;
m_frustum[0].D = viewProjection.M44 + viewProjection.M41;
etc....
скажите мне, откуда взялись эти уравнения. Есть ли математическое доказательство этому? В СДК примере Cull пользуются другим методом. Матрица(перемноженная)инвертируется и трансформируется куб с осями=1. Немного суть я уловил, в слк сказано, что проекционная матрица трансформирует frustum в кубоид с осями=1. Поэтому можно сделать наоборот и получить точки пирамиды. Но откуда опять же взялось, что проекционная матрица трансформирует вид. пирамиду в кубоид???
З.Ы.
Наверное я сильно много написал, нигде просто объяснения не видел. Мне интересно докопаться до самой сути, а не просто copy-paste, не понимая как это работает.


#1
10:57, 18 мая 2006

Ravager
Эти плоскости формируются согласно уравнению плоскости согласно аналитической геометрии:
A*x + b*y + C*z + D = 0;
где A,D,C - Vector Normal{A, B. C} - нормаль к плоскости;
D- ароде расстояние по нормале до плоскоси от начала координат.
как конкретно получаются эти значения из матриц можно подробно проследить согласно формируемым матрицам зная что храниться в строке столбце. Но этим я не занимался поэтому не могу сказать.

#2
19:19, 18 мая 2006

Andrey
Про уравнение плоскости я знаю, а вот почему извл. так? Смотреть как формируется матрица иоже не катит. Я смотрел описание в сдк там как-то непонятно

w       0       0               0
0       h       0               0
0       0       zf/(zf-zn)      1
0       0       -zn*zf/(zf-zn)  0
where:
h is the view space height. It is calculated from
h = cot(fovY/2);
w is the view space width. It is calculated from
w = h / Aspect.
по идее, если рассматривать прямоугольный треугольник, то
cot=cos/sin или z/y если они рассматривают плоскость zy и расстояние до плоскости проецирования=1, то y=h=(z/cot) т.к z=1 то у=h=(1/cot)=tan(fovY/2) хотя можно понять,что при увеличении угла обзора объекты должны уменьшаться и большее их кол-во проецируется на плоскость. В данном случае cot убывающая функция и при увеличении аргумента уменьшается значение=то, что нужно. Это еще можно понять логически.
Но вот Aspect=w/h, откуда
w=h*Aspect и само собой ширина должна быть больше, а не то,что там они написали(w=h/aspect). Я вот и пытаюсь разобраться с этим проецированием.
#3
22:10, 18 мая 2006

Учи аналитическую геометрию. Я думаю, вряд ли кто будет здесь пересказывать несколько сотен страниц из учебника.

PS. Кстати, если ты не знаешь таблицу умножения, то тоже можешь требовать доказательство, что 12*13=156. Надеюсь, аналогия понятна.

Прошло более 8 лет
#4
17:18, 15 июля 2014

Копну тему чтоб не плодить:

Достал я FrustumPlanes[6] из ViewProjMatrix,  нужно ли эти Planes нормализовать,
какой в этом смысл, и когда это может пригодиться?

Спс.

#5
18:51, 15 июля 2014

TheGrayWolf
> какой в этом смысл, и когда это может пригодиться?

Есть такой принцип определения нахождения точки во frustum, если точка лежит по одну и туже сторону от всех плоскостей во frustum, то она внутри последнего. И это только один пример на память, когда оно надо.

#6
20:26, 15 июля 2014

TheGrayWolf
Нормализовать плоскость имеет смысл только чтобы находить расстояние. Иначе результат скажет только с какой стороны от плоскости находится точка. Полезно для проверки вхождения сферы в пирамиду видимости. Только же нормализация плоскости != нормализация четырехмерного вектора, которым она описывается.

#7
22:36, 15 июля 2014

Ravager
> по идее, если рассматривать прямоугольный треугольник, то
> cot=cos/sin или z/y если они рассматривают плоскость zy и расстояние до
> плоскости проецирования=1, то y=h=(z/cot) т.к z=1 то у=h=(1/cot)=tan(fovY/2)
> хотя можно понять,что при увеличении угла обзора объекты должны уменьшаться и
> большее их кол-во проецируется на плоскость. В данном случае cot убывающая
> функция и при увеличении аргумента уменьшается значение=то, что нужно. Это еще
> можно понять логически.
> Но вот Aspect=w/h, откуда
> w=h*Aspect и само собой ширина должна быть больше, а не то,что там они
> написали(w=h/aspect). Я вот и пытаюсь разобраться с этим проецированием.
Тоже не понял (ты опередил меня с созданием темы), откуда в сдк это. На бумажке чертил - никак не сходится.

#8
22:54, 15 июля 2014

x
> А так, кто сказал, что это горизонтальный аспект
Мне непонятен смысл M[2][2], M[2][3], M[3][2]. Зачем они там?

#9
3:30, 16 июля 2014


http://pmg.org.ru/ - спасет отечественного отсекателя по пирамиде видимости.

#10
9:04, 16 июля 2014

alorken
Спс за вразумительный ответ.

#11
12:35, 16 июля 2014

x
Ну вот я умножаю вектор v на матрицу во втором посте и получаю вектор v2:

v2.x = v.x * w;
v2.y = v.y * h;
v2.z = v.z *zf/(zf-zn) - -zn*zf/(zf-zn);
v2.w = v.z;

v2.z = zf*(v.z - zn)/(zf-zn);
(v.z - zn)/(zf-zn)
- это маппинг в [0,1]. Доля расстояния точки от передней плоскости от расстояния между передней и дальней плоскостями. А зачем умножать на zf?
#12
14:58, 16 июля 2014

graveman
> (ты опередил меня с созданием темы)

На 8 лет.

#13
15:16, 16 июля 2014

Executor
> graveman
> > (ты опередил меня с созданием темы)
>
> На 8 лет.
Ну не читал про точки схода. Читану пойду, может прояснится.

#14
11:22, 21 июля 2014

Подскажите книги, где подробно объяснено про расчет матрицы перспективной проекции.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

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