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;
            }
        }
    }

  • 相关阅读:
    系统架构设计师软考总结
    统一用户认证系统CUAS实现要点
    Activiti使用总结
    性能优化总结篇
    CVE-2016-5734-phpmyadmin-4.0.x-4.6.2-代码执行
    WooYun-2016-199433 -phpmyadmin-反序列化-getshell
    CVE-2015-1635-HTTP.SYS远程执行代码
    泛微OA 多版本存在命令执行
    CVE-2019-20372-Nginx error_page 请求走私
    通达OA 页面敏感信息-2013/2015版本
  • 原文地址:https://www.cnblogs.com/lizhengjin/p/1836356.html
Copyright © 2011-2022 走看看