裁剪空间法--实现细节

来源:互联网 发布:win10解压缩软件 编辑:程序博客网 时间:2024/05/29 04:28

下面从类FrustumG的函数,就像下面描述的平面,假设给予的参数矩阵A=M*P:

#define m(row,col)  m[col*4+row-5]

void FrustumG::setFrustum(float *m) {

    pl[NEARP].setCoefficients(

                 m(3,1) + m(4,1),

                 m(3,2) + m(4,2),

                 m(3,3) + m(4,3),

                 m(3,4) + m(4,4));

    pl[FARP].setCoefficients(

                -m(3,1) + m(4,1),

                -m(3,2) + m(4,2),

                -m(3,3) + m(4,3),

                -m(3,4) + m(4,4));

    pl[BOTTOM].setCoefficients(

                 m(2,1) + m(4,1),

                 m(2,2) + m(4,2),

                 m(2,3) + m(4,3),

                 m(2,4) + m(4,4));

    pl[TOP].setCoefficients(

                -m(2,1) + m(4,1),

                -m(2,2) + m(4,2),

                -m(2,3) + m(4,3),

                -m(2,4) + m(4,4));

    pl[LEFT].setCoefficients(

                 m(1,1) + m(4,1),

                 m(1,2) + m(4,2),

                 m(1,3) + m(4,3),

                 m(1,4) + m(4,4));

    pl[RIGHT].setCoefficients(

                -m(1,1) + m(4,1),

                -m(1,2) + m(4,2),

                -m(1,3) + m(4,3),

                -m(1,4) + m(4,4));

}

#undef M

函数setCoefficients是从类Plane定义的:

void Plane::setCoefficients(float a, float b, float c, float d) {

    // set the normal vector

    normal.set(a,b,c);

    //compute the lenght of the vector

    float l = normal.length();

    // normalize the vector

    normal.set(a/l,b/l,c/l);

    // and divide d by th length as well

    this->d = d/l;

}

为了从OpenGL状态函数glGetFloatv得到矩阵M和P:

  float m[16],p[16];

    glGetFloatv(GL_PROJECTION_MATRIX,p);

    glGetFloatv(GL_MODELVIEW_MATRIX,m);

矩阵相乘就是计算A=M*P。一个矩阵相乘可以如下方式:

void multMat(float *res,float *a, float *b) {

    for (int i=0;i<4;i++) {

        for (int j = 0;j < 4;j++) {

            res[i*4+j] = 0.0;

            for (int k = 0; k < 4; k++) {

                res[i*4+j] += a[i*4+k] * b[k*4+j];

            }

        }

    }

}

下面就是对于懒惰的人的解决方案,对我们使用OpenGL实现矩阵相乘(在我的笔记本电脑上它实际上是比较快的):

void multMat2(float *res, float *a, float *b) {

    glPushMatrix();

    glLoadMatrixf(b);

    glMultMatrixf(a);

    glGetFloatv(GL_MODELVIEW_MATRIX, res);

    glPopMatrix();

}

一旦平面计算出来,那么接下来的点测试,球体和立方体,就是跟几何体分析的一样了。

英文地址

转载于:http://www.arcosu.com/post/index/106

原创粉丝点击