OpenSceneGraph - 模型每个面上的纹理

时间:2014-11-14 12:21:43

标签: visual-c++ openscenegraph

我还有另外一个问题。 这是我的代码:

#include <iostream>
#include <osg/Light>
#include <osg/LightSource>
#include <osg/PositionAttitudeTransform>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>

int main(int argc, char** argv)
{
    osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("cube.3ds"); //importing object
    osg::ref_ptr<osg::StateSet> ss = loadedModel->getOrCreateStateSet();
    osg::ref_ptr<osg::Image> image = osgDB::readImageFile("box_1.png"); //loading texture from file
    osg::ref_ptr<osg::Texture2D> tex(new osg::Texture2D());  /creating texture for model from image
    tex->setImage(image);
    ss->setTextureAttributeAndModes(0, tex);
    osg::ref_ptr<osg::TexGen> texGen(new osg::TexGen());
    texGen->setPlane(osg::TexGen::S, osg::Plane(0.075, 0.0, 0.0, 0.5));
    texGen->setPlane(osg::TexGen::T, osg::Plane(0.0, 0.035, 0.0, 0.3));
    ss->setTextureAttributeAndModes(0, texGen);
    osgViewer::Viewer viewer; //Creating viewer
    viewer.setSceneData(loadedModel);
    viewer.setUpViewOnSingleScreen(0);
    return viewer.run();
    }

所以这段代码正在做什么:它从文件中获取模型(即“cube.3s”)并添加纹理(文件“box_1.png”中的图像)。您可以通过将一个图像切换到另一个图像来更改对象上的纹理但是这里有一个问题:他在整个模型上展示图像。如何通过将所有图像放在模型的每个面上来实现它们(它们是柏拉图式的固体(如金字塔,立方体等))。

1 个答案:

答案 0 :(得分:2)

这一切都归结为构建时分配给模型顶点的纹理坐标。如果将cube.3ds转换为.OSG或.OSGT文本格式,则可以看到纹理贴图用于确定纹理贴图中每个面的每个角落的位置的UV坐标。这就是纹理被“固定”到面部的方式。

只需在3D建模工具中加载和编辑该立方体或金字塔,然后将UV坐标固定到您想要的位置。

或者,您可以编辑.osgt文件以更改分配给每个顶点的UV坐标。