怎样在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 );
**********************************************
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2006-06-23 开始学MapServer了