现在的位置: 首页 > 综合 > 正文

每日一练(七)自动变换节点

2018年01月29日 ⁄ 综合 ⁄ 共 2018字 ⁄ 字号 评论关闭

1. 创建变换函数:

    osg::ref_ptr<osg::Node> CreateAutoTransform(osg::Vec3& position,float nSize,std::string&lable,
        osg::AutoTransform::AutoRotateMode mode,osgText::Text::AxisAlignment alignment)
    {
        // 1.创建节点
        osg::ref_ptr<osg::Geode> geode = new osg::Geode();
        
        // 2.创建字体
        std::string fontName("fonts/cour.ttf");
        osg::ref_ptr<osgText::Text>text = new osgText::Text();
        geode->addDrawable(text.get());

        // 3.设置字体属性
        text->setFont(fontName);
        text->setFontResolution(128.0f,128.0f);
        text->setCharacterSize(nSize);
        text->setAxisAlignment(alignment);
        text->setAlignment(osgText::Text::CENTER_CENTER);
        text->setText(lable);
                
        // 4.关闭光照
        geode->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF);

        // 5.创建自动变换节点
        osg::ref_ptr<osg::AutoTransform> at = new osg::AutoTransform();
        at->addChild(geode.get());

        // 6.设置自动变换方式
        at->setAutoRotateMode(mode);
        at->setAutoScaleToScreen(false);

        // 7.设置缩放的最大最小比例
        at->setMinimumScale(0.0f);
        at->setMaximumScale(5.0f);

        // 8.设置位置
        at->setPosition(position);
        return at.get();
    }

2. 设置变换类型

int _tmain(int argc, _TCHAR* argv[])
{
    AutoTransform autotransform;
    osg::ref_ptr<osg::Group> root = new osg::Group();
    std::string text(" I want to fly");
    // 4 mode
    // ROTATE_TO_SCREEN
    // ROTATE_TO_CAMERA
    // ROTATE_TO_AXIS
    // NO_ROTATE


    root->addChild(autotransform.CreateAutoTransform(osg::Vec3(0.0f,0.0f,0.0f),60.0f,text,
        osg::AutoTransform::ROTATE_TO_SCREEN,osgText::Text::XY_PLANE));
   // root->addChild(autotransform.CreateAutoTransform(osg::Vec3(0.0f,0.0f,0.0f),60.0f,text,
      //  osg::AutoTransform::ROTATE_TO_CAMERA,osgText::Text::YZ_PLANE));
    root->addChild(autotransform.CreateAutoTransform(osg::Vec3(0.0f,0.0f,0.0f),60.0f,text,
        osg::AutoTransform::ROTATE_TO_AXIS,osgText::Text::XY_PLANE));
    root->addChild(autotransform.CreateAutoTransform(osg::Vec3(0.0f,0.0f,0.0f),60.0f,text,
        osg::AutoTransform::NO_ROTATION,osgText::Text::YZ_PLANE));

    // crate viewer 
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
    osgUtil::Optimizer optimizer;
    optimizer.optimize(root.get());
    viewer->setSceneData(root.get());
    viewer->run();
	return 0;
}

3.效果:

4. 未明白

ROTATE_TO_CAMERA

5.连接

http://blog.csdn.net/xuguangsoft/article/details/8092548

抱歉!评论已关闭.