zoukankan      html  css  js  c++  java
  • osg求交,模型矩阵

    Intersector* LineSegmentIntersector::clone(osgUtil::IntersectionVisitor& iv)
    {
        if (_coordinateFrame==MODEL && iv.getModelMatrix()==0)
        {
            osg::ref_ptr<LineSegmentIntersector> lsi = new LineSegmentIntersector(_start, _end);
            lsi->_parent = this;
            return lsi.release();
        }

        // compute the matrix that takes this Intersector from its CoordinateFrame into the local MODEL coordinate frame
        // that geometry in the scene graph will always be in.//
        osg::Matrix matrix;
        switch (_coordinateFrame)
        {
            case(WINDOW):
                if (iv.getWindowMatrix()) matrix.preMult( *iv.getWindowMatrix() );
                if (iv.getProjectionMatrix()) matrix.preMult( *iv.getProjectionMatrix() );
                if (iv.getViewMatrix()) matrix.preMult( *iv.getViewMatrix() );
                if (iv.getModelMatrix()) matrix.preMult( *iv.getModelMatrix() );
                break;
            case(PROJECTION):
                if (iv.getProjectionMatrix()) matrix.preMult( *iv.getProjectionMatrix() );
                if (iv.getViewMatrix()) matrix.preMult( *iv.getViewMatrix() );
                if (iv.getModelMatrix()) matrix.preMult( *iv.getModelMatrix() );
                break;
            case(VIEW):
                if (iv.getViewMatrix()) matrix.preMult( *iv.getViewMatrix() );
                if (iv.getModelMatrix()) matrix.preMult( *iv.getModelMatrix() );
                break;
            case(MODEL):
                if (iv.getModelMatrix()) matrix = *iv.getModelMatrix();
                break;
        }

        osg::Matrix inverse;
        inverse.invert(matrix);

        osg::ref_ptr<LineSegmentIntersector> lsi = new LineSegmentIntersector(_start * inverse, _end * inverse);//把相交点转到模型矩阵

        //而模型本身不需要转换,其坐标就是在模型坐标系中的坐标,求得的交点也是在局部坐标系中的坐标
        lsi->_parent = this;
        return lsi.release();

      switch(mode)
            {
                case(GL_TRIANGLES):
                {
                    const Vec3* vlast = &_vertexArrayPtr[first+count];                                   ///一个geometry下面挂几个drawable,每个drawable下有几个

                                                                                                                                //primitive,每一个primitive就在此循环一次求交
                    for(const Vec3* vptr=&_vertexArrayPtr[first];vptr<vlast;vptr+=3)
                        this->operator()(*(vptr),*(vptr+1),*(vptr+2),_treatVertexDataAsTemporary);
                    break;
                }
                case(GL_TRIANGLE_STRIP):
                {
                    const Vec3* vptr = &_vertexArrayPtr[first];
                    for(GLsizei i=2;i<count;++i,++vptr)
                    {
                        if ((i%2)) this->operator()(*(vptr),*(vptr+2),*(vptr+1),_treatVertexDataAsTemporary);
                        else       this->operator()(*(vptr),*(vptr+1),*(vptr+2),_treatVertexDataAsTemporary);
                    }
                    break;
                }
                case(GL_QUADS):
                {
                    const Vec3* vptr = &_vertexArrayPtr[first];
                    for(GLsizei i=3;i<count;i+=4,vptr+=4)
                    {
                        this->operator()(*(vptr),*(vptr+1),*(vptr+2),_treatVertexDataAsTemporary);
                        this->operator()(*(vptr),*(vptr+2),*(vptr+3),_treatVertexDataAsTemporary);
                    }
                    break;
                }
                case(GL_QUAD_STRIP):
                {
                    const Vec3* vptr = &_vertexArrayPtr[first];
                    for(GLsizei i=3;i<count;i+=2,vptr+=2)
                    {
                        this->operator()(*(vptr),*(vptr+1),*(vptr+2),_treatVertexDataAsTemporary);
                        this->operator()(*(vptr+1),*(vptr+3),*(vptr+2),_treatVertexDataAsTemporary);
                    }
                    break;
                }
                case(GL_POLYGON): // treat polygons as GL_TRIANGLE_FAN
                case(GL_TRIANGLE_FAN):
                {
                    const Vec3* vfirst = &_vertexArrayPtr[first];
                    const Vec3* vptr = vfirst+1;
                    for(GLsizei i=2;i<count;++i,++vptr)
                    {
                        this->operator()(*(vfirst),*(vptr),*(vptr+1),_treatVertexDataAsTemporary);
                    }
                    break;
                }
                case(GL_POINTS):
                case(GL_LINES):
                case(GL_LINE_STRIP):
                case(GL_LINE_LOOP):
                default:
                    // can't be converted into to triangles.
                    break;
            }
        }
    }

  • 相关阅读:
    mysql之SQL入门与提升(三)
    DROOLS通过URL访问changset
    drools规则管理Guvnor的安装
    kafka offset manage
    kafka comsumer
    kafka与zookeeper
    kafka数据祸福和failover
    kafka一些问题点的分析
    近期开发storm遇到一些问题的解决点
    关于大数据平台ETL可行性方案
  • 原文地址:https://www.cnblogs.com/lizhengjin/p/1836356.html
Copyright © 2011-2022 走看看