怎样在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 );
**********************************************
怎样在osg中动态的设置drawable的最近最远裁剪面的更多相关文章
- Android代码中动态设置图片的大小(自动缩放),位置
项目中需要用到在代码中动态调整图片的位置和设置图片大小,能自动缩放图片,用ImageView控件,具体做法如下: 1.布局文件 <RelativeLayout xmlns:android=&qu ...
- 在后台代码中动态生成pivot项并设置EventTrigger和Action的绑定
最近在做今日头条WP的过程中,遇到需要动态生成Pivot项的问题.第一个版本是把几个频道写死在xaml里了,事件绑定也写在xaml里,每个频道绑定一个ObservableCollection<A ...
- Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)
什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户 ...
- 使用装饰器模式动态设置Drawable的ColorFilter
使用装饰器模式动态设置Drawable的ColorFilter 欢迎各位关注我的新浪微博:微博 转载请标明出处(kifile的博客) 非常多时候我们都希望Android控件点击的时候,有按下效果,选中 ...
- mvc中动态给一个Model类的属性设置验证
原文:mvc中动态给一个Model类的属性设置验证 在mvc中有自带的验证机制,比如如果某个字段的类型是数字或者日期,那么用户在输入汉字或者英文字符时,那么编译器会自动验证并提示用户格式不正确,不过这 ...
- Quartz在Spring中动态设置cronExpression
什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...
- 微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法
前段时间开发了一款微信小程序,运行了也几个月了,在index.js中的onLoad生命周期里获取app.js中onLaunch生命周期中在接口里动态设置的globalData一直没有问题,结果昨天就获 ...
- 分别在javascript和JSP中动态设置下拉列表默认值
一.JavaScript中动态设置select标签中<option>选项的默认值: 比如,要完成下边这个下拉列表的动态显示,并且当进行前后翻页时,下拉列表中的值自动更新为当前页码: 图1 ...
- OSG中的示例程序简介
OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...
随机推荐
- 微信开发之Ngrok环境准备(一)
一.为什么要使用ngrok? 各位肯定都知道,做微信开发,我们的开发服务器需要和微信服务器做交互,SO,我们需要准备一台放置在公网的服务器,能够使得我们的服务器可以正常访问微信服务器,并且微信服务器也 ...
- 使用carrierwave出现MiniMagick::Invalid错误的解决方法
安装Imagemagick不能从源码安装,要从软件市场安装,否则会出现错误:MiniMagick::Invalid 使用make uninstall卸载后,重新在软件市场里安装,问题解决.
- 【转】使用NetBeans和Eclipse开发PHP应用程序
[51CTO独家特稿]各位用户如果单独看NetBeans和Eclipse的市场占有率,你可能会认为使用其中任何一种IDE开发PHP应用程序都没有 问题,例如: 1.NetBeans:一款开源的集成开发 ...
- bzoj 2555 SubString(SAM+LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2555 [题意] 给定一个字符串,可以随时插入字符串,提供查询s在其中作为连续子串的出现 ...
- bzoj 1458 士兵占领(最大流)
[题意] n行m列,第i行必须放L[i],第j列必须放C[j],有障碍格,求满足条件至少需要放多少. [思路] 至少放多少等价于最多不放多少. 对行列分别建XY点,则连边(S,Xi,a)(Yi,T,b ...
- mybatis系列-12-多对多查询
12.1 需求 查询用户及用户购买商品信息. 12.2 sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表: orders.or ...
- 一起刷LeetCode1-Two Sum
感觉有必要重新刷刷题了,为以后找工作做做准备,选择LeetCode+topcoder上的Data Science Tutorials, 争取每天晚上10:00开始刷一道,复习一下相关知识点. ---- ...
- Java8新特性 1——利用流和Lambda表达式操作集合
Java8中可以用简洁的代码来操作集合,比如List,Map,他们的实现ArrayList.以此来实现Java8的充分利用CPU的目标. 流和Lambda表达式都是Java8中的新特性.流可以实现对集 ...
- Uploadify 3.2使用
我今天介绍的Uploadify 3.2的,以前旧版本的并不适用,说到这个,我就火大,我也是第一次使用,也百度了下使用手册,结果坑爹的那些手册都是旧版的,新版的Uploadify接口和旧版的差太多了.废 ...
- Entity Framework Power Tools
http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d