zoukankan      html  css  js  c++  java
  • 怎样在osg中动态的设置drawable的最近最远裁剪面

        // draw callback that will tweak the far clipping plane just
        // before rendering a drawable.
        struct OverrideNearFarValuesCallback : public osg::Drawable::DrawCallback
        {
            OverrideNearFarValuesCallback(double radius)
                : _radius(radius) {}

            virtual void drawImplementation(osg::RenderInfo& renderInfo,
                const osg::Drawable* drawable) const
            {
                osg::Camera* currentCamera = renderInfo.getCurrentCamera();
                if (currentCamera)
                {
                    // Get the current camera position.
                    osg::Vec3 eye, center, up;
                    renderInfo.getCurrentCamera()->getViewMatrixAsLookAt( eye, center, up);

                    // Get the max distance we need the far plane to be at,
                    // which is the distance between the eye and the origin
                    // plus the distant from the origin to the object (star sphere
                    // radius, sun distance etc), and then some.
                    double distance = eye.length() + _radius*2;

                    // Save old values.
                    osg::ref_ptr<osg::RefMatrixd> oldProjectionMatrix = new osg::RefMatrix;
                    oldProjectionMatrix->set( renderInfo.getState()->getProjectionMatrix());

                    // Get the individual values
                    double left, right, bottom, top, zNear, zFar;
                    oldProjectionMatrix->getFrustum( left, right, bottom, top, zNear, zFar);

                    // Build a new projection matrix with a modified far plane
                    osg::ref_ptr<osg::RefMatrixd> projectionMatrix = new osg::RefMatrix;
                    projectionMatrix->makeFrustum( left, right, bottom, top, zNear, distance );

                    renderInfo.getState()->applyProjectionMatrix( projectionMatrix.get());

                    // Draw the drawable
                    drawable->drawImplementation(renderInfo);

                    // Reset the far plane to the old value.
                    renderInfo.getState()->applyProjectionMatrix( oldProjectionMatrix.get() );
                }
                else
                {
                    drawable->drawImplementation(renderInfo);
                }
            }

            double _radius;
        };

        struct AddCallbackToDrawablesVisitor : public osg::NodeVisitor
        {
            AddCallbackToDrawablesVisitor(double radius)
                : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN),
                _radius(radius) {}

            virtual void apply(osg::Geode& node)
            {
                for (unsigned int i = 0; i < node.getNumDrawables(); i++)
                {
                    node.getDrawable(i)->setDrawCallback( new OverrideNearFarValuesCallback(_radius) );

                    // Do not use display lists otherwise the callback will only
                    // be called once on initial compile.
                    node.getDrawable(i)->setUseDisplayList(false);
                }
            }

            double _radius;
        };

    调用

    ***********************************************

     AddCallbackToDrawablesVisitor visitor( mpr_innerRadius );
     geode->accept( visitor );

    **********************************************

  • 相关阅读:
    02-模板字符串
    01-学习vue前的准备工作
    21-z-index
    20-定位
    19-background
    18-超链接导航栏案例
    17-文本属性和字体属性
    16-margin的用法
    jBPM
    Table of Contents
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/3804176.html
Copyright © 2011-2022 走看看