osgWidget::Box 使用案例分享

osgWidget::Box 是 OpenSceneGraph 中的一个小部件,用于在场景图中显示 GUI 元素。其中,osgWidget::Box("only", osgWidget::Box::VERTICAL) 表示创建一个只包含垂直布局子控件的 osgWidget::Box 对象。

osg::MatrixTransform 是 OpenSceneGraph 中表示矩阵变换的节点类。下面的示例代码演示了如何将一个 osgWidget::Box 对象添加到 osg::MatrixTransform 节点中,并实现控件的平移和旋转效果。

#include <osg/Node>
#include <osgViewer/Viewer>
#include <osgWidget/WindowManager>
#include <osgWidget/Box>
#include <QPushButton>
#include <osg/MatrixTransform>

int main(int argc, char** argv)
{
    // 创建 OpenSceneGraph 视窗和场景图
    osgViewer::Viewer viewer;
    osg::ref_ptr<osg::Group> root = new osg::Group();
    viewer.setSceneData(root.get());

    // 创建 osgWidget 窗口管理器
    osg::ref_ptr<osgWidget::WindowManager> wm = new osgWidget::WindowManager(&viewer, 800, 600);

    // 创建一个只包含垂直布局子控件的 osgWidget::Box 容器
    osg::ref_ptr<osgWidget::Box> vbox = new osgWidget::Box("vertical", osgWidget::Box::VERTICAL);
    vbox->setAbsorbEvents(true);
    vbox->setColor(osg::Vec4(1.0, 1.0, 1.0, 0.8));
    vbox->setSize(200, 300);               // 设置容器大小
    vbox->setHorizAlign(osgWidget::Box::HA_LEFT);
    vbox->setVertAlign(osgWidget::Box::VA_BOTTOM);
    wm->addChild(vbox);

    // 创建两个 Qt 按钮,并将其添加到垂直布局容器中
    QPushButton* button1 = new QPushButton("Button 1", vbox.get());
    QPushButton* button2 = new QPushButton("Button 2", vbox.get());

    // 创建一个 osg::MatrixTransform 节点,并将 vbox 添加为其子节点
    osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform();
    mt->addChild(wm);
    root->addChild(mt);

    // 平移和旋转效果
    osg::Vec3d pos(0, 0, 500);             // 设置初始位置
    osg::Quat rot(osg::PI_2, osg::Vec3d(1, 0, 0));   // 设置旋转角度
    osg::Vec3d axis(0, 1, 0);              // 设置旋转轴

    while (!viewer.done())
    {
        double t = viewer.getFrameStamp()->getReferenceTime();

        // 计算平移和旋转变换矩阵
        osg::Vec3d p(pos.x(), pos.y() + 50 * sin(t), pos.z() + 50 * cos(t));
        osg::Quat r(rot * osg::Quat(t * 0.5, axis));

        osg::Matrixd matrix;
        matrix.makeTranslate(p) * matrix.makeRotate(r);

        mt->setMatrix(matrix);

        // 更新场景图并渲染
        viewer.frame();
    }

    return 0;
}

上述代码中,我们创建了一个名为 vbox 的只包含垂直布局子控件的 osgWidget::Box 容器,并向其中添加了两个 Qt 按钮。然后创建了一个名为 mt 的 osg::MatrixTransform 节点,并将 vbox 添加为其子节点。最后在 while 循环中计算平移和旋转变换矩阵,并通过 mt->setMatrix 函数实现控件的平移和旋转效果。

需要注意的是,osg::MatrixTransform 的 setMatrix 函数每次调用都会覆盖之前的变换矩阵。因此需要在循环中每次重新计算变换矩阵,并将其赋值给 mt 对象。

猜你喜欢

转载自blog.csdn.net/vcit102/article/details/130315458
Box