Получение clip-плоскостей по матрице проектирования

В OpenGL произведение модельно-втиджовой матрицы и матрицы проектирования определяет все 6 отсекающих плоскостей (clip planes).

Пусть у нас задана матрица M, являющаяся произведением модельно видовой матрицы и матрицы проектирования. Тогда преобразование входной вершины с координатами (x,y,z)T в clip space задается следующим уравнением.

В этом пространстве вся видимая область определяется следующими уравнениями -

Перепишем эти неравентсва, используя первое уравнение.

Тогда после приведения всех подобных членов мы получаем следующую систему неравенств

Отсюда легко получить уравнения для всех отсекающих плоскотей - достаточно заменить знак неравентсва на знак равенства.

Ниже приводится функция, по заданной матрице, строящая все шесьб отсекающих плоскосткей.

void buildClipPlanes( const float m [16], plane * p )
{
        // right clipping plane.
    p [0] = plane ( m[3]-m[0], m[7]-m[4], m[11]-m[8], m[15]-m[12] );

        // left clipping plane.
    p [1] = plane ( m[3]+m[0], m[7]+m[4], m[11]+m[8], m[15]+m[12] );

        // bottom clipping plane.
    p [2] = plane ( m[3]+m[1], m[7]+m[5], m[11]+m[9], m[15]+m[13] );

        // top clipping plane.
    p [3] = plane ( m[3]-m[1], m[7]-m[5], m[11]-m[9], m[15]-m[13] );

        // far clipping plane.
    p [4] = plane ( m[3]-m[2], m[7]-m[6], m[11]-m[10], m[15]-m[14] );

        // near clipping plane.
    p [5] = plane ( m[3]+m[2], m[7]+m[6], m[11]+m[10], m[15]+m[14] );
}

Используются технологии uCoz