📜  如何更改角度 6 globBBLT 的背景 (1)

📅  最后修改于: 2023-12-03 15:38:48.748000             🧑  作者: Mango

如何更改角度 6 globBBLT 的背景

对于globBBLT这个程序,我们可以通过代码来更改其背景颜色。首先,我们需要了解globBBLT的界面是由OSG(OpenSceneGraph)创建的。因此,我们需要使用OSG的API来进行背景颜色的更改。

步骤一:创建场景

首先,我们需要创建一个场景,代码如下:

osg::ref_ptr<osg::Group> root = new osg::Group;

这个场景可以用来添加我们的模型和节点。

步骤二:创建相机

然后,我们需要创建一个相机,代码如下:

osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setClearColor(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));

这个相机用来控制我们的视角和背景颜色。其中,setClearColor()函数可以设置相机的背景颜色,上面的代码设置了背景颜色为蓝色。

步骤三:将相机添加到场景中

将相机添加到场景中,代码如下:

root->addChild(camera.get());

这个操作可以将相机添加到我们的场景中。

步骤四:设置相机的视角

使用相机的setViewMatrixAsLookAt()函数可以设置相机的视角。代码如下:

camera->setViewMatrixAsLookAt(osg::Vec3(0.0f, 0.0f, 6.0f),
osg::Vec3(0.0f, 0.0f, 0.0f), osg::Vec3(0.0f, 1.0f, 0.0f));

其中,第一个参数是相机的位置,第二个参数是相机所看的点的位置,第三个参数是相机的朝向。

步骤五:设置相机的投影矩阵

使用相机的setProjectionMatrix()函数可以设置相机的投影矩阵。代码如下:

camera->setProjectionMatrix(osg::Matrix::perspective(30.0f, aspectRatio, 1.0f, 100.0f));

其中,第一个参数是视角,第二个参数是宽高比,第三个参数是近平面相对于相机的距离, 第四个参数是远平面相对于相机的距离。

步骤六:创建背景节点

使用OSG的API创建一个背景节点,代码如下:

osg::ref_ptr<osg::Geode> backgroundGeode = new osg::Geode;
root->addChild(backgroundGeode.get());
osg::ref_ptr<osg::Drawable> backgroundDrawable = osg::createGeodeBox(osg::Vec3(), 100000.0f, 100000.0, 100000.0f);
backgroundGeode->addDrawable(backgroundDrawable.get());

这个背景节点是一个巨型盒子,可以覆盖整个场景,从而实现背景颜色的设置。

步骤七:设置背景颜色

使用背景节点的setDrawable()函数可以设置背景颜色,代码如下:

osg::StateSet* stateSet = backgroundGeode->getOrCreateStateSet();
osg::ref_ptr<osg::Material> material = new osg::Material;
material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
stateSet->setAttributeAndModes(material.get(), osg::StateAttribute::ON);

其中,Ambient表示环境光颜色,Diffuse表示漫反射颜色。

步骤八:设置相机的视图和背景节点的状态集

使用相机的setViewport()函数可以设置相机的视口,代码如下:

camera->setViewport(0, 0, windowWidth, windowHeight);

其中,第一个参数是左下角的x坐标,第二个参数是左下角的y坐标,第三个参数是视口的宽度,第四个参数是视口的高度。

最后,使用相机的setSceneData()函数可以将场景设置为相机的场景,代码如下:

viewer->setSceneData(root.get());

其中,viewer是OSG的窗口对象。

现在,我们就可以通过上面的步骤来更改globBBLT的背景颜色了。