osgWidget示例

2 篇文章 0 订阅
1 篇文章 0 订阅

转自:http://blog.sina.com.cn/s/blog_5d76edd801016nuf.html

要在OSG的三维场景中添加界面元素,找了个《OSG Cookbook》上的例子,学习并分析一下:


int main(int argc, char * argv[])
{
osgViewer::Viewer viewer;
//新建一个 WindowManager,这个是必须的。其中定义了整个UI系统的大小和基本属性。
osg::ref_ptr<osgWidget::WindowManager> wm = new osgWidget::WindowManager(&viewer, 1024.f, 768.f, 0xf0000000);
//创建一个正射投影的相机
osg::Camera *camera = wm->createParentOrthoCamera();
//添加tabs, 代码见下面
wm->addChild(createSimpleTabs(100.f, 100.f));
wm->resizeAllWindows();

osg::ref_ptr<osg::Group> root =  new osg::Group;
root->addChild(osgDB::readNodeFile("cow.osg"));
//把创建出来的camera加到root上
root->addChild(camera);

viewer.setSceneData(root.get());
viewer.setUpViewInWindow(50, 50, 1024, 768);
//添加事件回调
viewer.addEventHandler(new osgWidget::MouseHandler(wm.get()));
viewer.addEventHandler(new osgWidget::KeyboardHandler(wm.get()));
viewer.addEventHandler(new osgWidget::ResizeHandler(wm.get(), camera));
viewer.addEventHandler(new osgWidget::CameraSwitchHandler(wm.get(), camera));
return viewer.run();
}

osgWidget::Window* createSimpleTabs(float winX, float winY)
{
//osgWidget有三种基本类型的widget:box,canvas,table。box是线性排列子widget,table是grid状排列;canvas可以在任意坐标渲染子widget没有限制。
osg::ref_ptr<osgWidget::Canvas> contents = new osgWidget::Canvas("contents");
osg::ref_ptr<osgWidget::Box> tabs = new osgWidget::Box("tabs", osgWidget::Box::HORIZONTAL);//水平的box
for (unsigned int i = 0; i < 3; i++)
{
osg::Vec4 color(0.0f, (float)i/3.0f, 0.0f, 1.0f);//green
std::stringstream ss, ss2;
ss << "Tab-" << i;
ss2 << "Tab content:" << std::endl << "Hello Tab-" << i;

//创建内容标签widget,层设置为MIDDLE(层数值大的显示在上面),设置原点为(0,0)
//enum Layer { LAYER_TOP = 100, LAYER_HIGH = 75, LAYER_MIDDLE = 50, LAYER_LOW = 25, LAYER_BG = 0 };
osgWidget::Label *content = createLabel(ss.str(), ss2.str(), 10.0f, color);
content->setLayer(osgWidget::Widget::LAYER_MIDDLE, i);
contents->addWidget(content, 0.0f, 0.0f);
//创建tab,响应鼠标点击的时间,并设置回调函数 tabPressed
osgWidget::Label *tab = createLabel(ss.str(), ss.str(), 20.0f, color);
tab->setEventMask(osgWidget::EVENT_MOUSE_PUSH);
//回调函数、事件类型、数据
tab->addCallback(new osgWidget::Callback(
&tabPressed, osgWidget::EVENT_MOUSE_PUSH, content));
tabs->addWidget(tab);
}

//垂直的box,作为最外层的容器
osg::ref_ptr<osgWidget::Box> main = new osgWidget::Box("main", osgWidget::Box::VERTICAL);
main->setOrigin(winX, winY);//设置原点
main->attachMoveCallback();//增加鼠标拖动的callback
main->addWidget(contents->embed());
main->addWidget(tabs->embed());
main->addWidget(createLabel("title", "Tabs Demo!", 15.0f,
osg::Vec4(0.0f, 0.4f, 1.0f, 1.0f)));//这是个标题,可以注意到,这里添加的顺序是从下到上的
return main.release();
}

//创建标签widget
osgWidget::Label* createLabel(const std::string &name,
const std::string &text, float size, const osg::Vec4 &color)
{
osg::ref_ptr<osgWidget::Label> label = new osgWidget::Label(name);
label->setLabel(text);
label->setFont("fonts/arial.ttf");
label->setFontSize(size);
label->setFontColor(1.0f, 1.0f, 1.0f, 1.0f);
label->setColor(color);//标签背景颜色
label->addSize(10.0f, 10.0f);
label->setCanFill(true);
return label.release();
}
 
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
以下是一个简单的osgWidget代码示例,用于在OpenSceneGraph中创建一个包含按钮和文本标签的窗口: ```cpp #include <osgWidget/WindowManager> #include <osgWidget/Box> #include <osgWidget/Label> #include <osgWidget/Button> int main() { // 创建窗口管理器 osgWidget::WindowManager* wm = new osgWidget::WindowManager(800, 600, osgWidget::WindowManager::WM_PICK_DEBUG); // 创建一个包含按钮和文本标签的框 osgWidget::Box* box = new osgWidget::Box("My Box"); box->setOrigin(200, 200); box->setColor(0.5f, 0.5f, 0.5f, 1.0f); box->setPadding(10.0f); box->setHorizAlign(osgWidget::Box::HA_LEFT); box->setVertAlign(osgWidget::Box::VA_CENTER); // 创建文本标签 osgWidget::Label* label = new osgWidget::Label("Hello, World!"); label->setColor(1.0f, 1.0f, 1.0f, 1.0f); label->setFontSize(24.0f); box->addWidget(label); // 创建按钮 osgWidget::Button* button = new osgWidget::Button("Click Me!"); button->setPadding(5.0f); button->setHorizAlign(osgWidget::Box::HA_CENTER); button->setColor(0.75f, 0.75f, 0.75f, 1.0f); button->setActiveColor(1.0f, 1.0f, 1.0f, 1.0f); button->setHighlightColor(0.25f, 0.25f, 0.25f, 1.0f); box->addWidget(button); // 将框添加到窗口管理器中 wm->addChild(box); // 运行窗口管理器 while (!wm->done()) { wm->frame(); } return 0; } ``` 这个示例创建了一个名为"My Box"的框,它包含一个文本标签"Hello, World!"和一个按钮"Click Me!"。窗口管理器将这个框添加到其子节点中,并在一个循环中运行,直到窗口管理器被关闭。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值