查看: 1301|回复: 4

为什么我的文字木有显示出来?求指教!

[复制链接]

该用户从未签到

发表于 2012-5-10 15:00:18 | 显示全部楼层 |阅读模式
osg::Group* root = new osg::Group();        // 初始化根节点

osg::Geode* HUDGeode = new osg::Geode();       // HUD 几何体的叶节点

osgText::Text* textOne = new osgText::Text();      // 用于作HUD 显示的Text 实例

// 下一步,设置场景显示HUD 文字。这里我们向场景中添加一个子树,其顶层节点使用投影和模型观察矩阵。
// 将投影矩阵添加到根节点。投影矩阵的水平和垂直范围与屏幕的尺寸相同。因此该节点子树中的位置坐标将等同于像素坐标
osg:rojection* HUDProjectionMatrix = new osg::Projection; // 投影节点用于定义HUD 的视景体
HUDProjectionMatrix->setMatrix(osg::Matrix:rtho2D(100, 1024, 0, 768));

// HUD 模型观察矩阵应使用单位矩阵
osg::MatrixTransform* HUDModelViewMatrix = new osg::MatrixTransform;
HUDModelViewMatrix->setMatrix(osg::Matrix::identity());
// 确保模型观察矩阵不会被场景图形的位置变换影响
HUDModelViewMatrix->setReferenceFrame(osg::Transform::ABSOLUTE_RF);

// 添加HUD 投影矩阵到根节点,添加HUD 模型观察矩阵到HUD投影矩阵。
// 模型观察矩阵节点的所有子节点都可以使用该投影矩阵进行视景
// 浏览,并使用模型观察矩阵来安置位置
root->addChild(HUDProjectionMatrix);
HUDProjectionMatrix->addChild(HUDModelViewMatrix);

// 现在我们设置几何体。我们创建一个与屏幕坐标对齐的四边形,并设置其颜色和纹理参数。
// 将包含 HUD 几何体的Geode 节点作为HUD 模型观察矩阵的子节点
HUDModelViewMatrix->addChild(HUDGeode);

// 设置HUD 的四边形背景,并添加到Geode 节点
osg::Geometry* HUDBackgroundGeometry = new osg::Geometry();
osg::Vec3Array* HUDBackgroundVertices = new osg::Vec3Array;
HUDBackgroundVertices->push_back(osg::Vec3(0,    0,   -1));
HUDBackgroundVertices->push_back(osg::Vec3(424, 0,   -1));
HUDBackgroundVertices->push_back(osg::Vec3(424, 200, -1));
HUDBackgroundVertices->push_back(osg::Vec3(0,    200, -1));
osg:rawElementsUInt* HUDBackgroundIndices = new osg::DrawElementsUInt(osg::PrimitiveSet::POLYGON, 0);
HUDBackgroundIndices->push_back(0);
HUDBackgroundIndices->push_back(1);
HUDBackgroundIndices->push_back(2);
HUDBackgroundIndices->push_back(3);
osg::Vec4Array* HUDcolors = new osg::Vec4Array;
HUDcolors->push_back(osg::Vec4(0.2f, 0.2f, 0.6f, 0.3f));
osg::Vec2Array* texcoords = new osg::Vec2Array(4);
(*texcoords)[0].set(0.0f, 0.0f);
(*texcoords)[1].set(1.0f, 0.0f);
(*texcoords)[2].set(1.0f, 1.0f);
(*texcoords)[3].set(0.0f, 1.0f);
HUDBackgroundGeometry->setTexCoordArray(0, texcoords);
osg::Texture2D* HUDTexture = new osg::Texture2D;
HUDTexture->setDataVariance(osg::Object::DYNAMIC);
//osg::Image* hudImage;
//hudImage = osgDB::readImageFile("hudbk.jpg");
//HUDTexture->setImage(hudImage);
osg::Vec3Array* HUDnormals = new osg::Vec3Array;
HUDnormals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
HUDBackgroundGeometry->setNormalArray(HUDnormals);
HUDBackgroundGeometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
HUDBackgroundGeometry->addPrimitiveSet(HUDBackgroundIndices);
HUDBackgroundGeometry->setVertexArray(HUDBackgroundVertices);
HUDBackgroundGeometry->setColorArray(HUDcolors);
HUDBackgroundGeometry->setColorBinding(osg::Geometry::BIND_OVERALL);
HUDGeode->addDrawable(HUDBackgroundGeometry);

// 我们需要创建一个osg::StateSet,并禁止深度测试(总是在屏幕上绘制),允许Alpha 混合
// (使HUD 背景透明),以保证HUD 的渲染正确。然后我们使用一个指定数字的渲染元来分配
// 几何体在拣选遍历中的渲染顺序。代码如下所示:
// 设置渲染状态,使用上面定义的纹理
osg::StateSet* HUDStateSet = new osg::StateSet();
HUDGeode->setStateSet(HUDStateSet);
HUDStateSet->setTextureAttributeAndModes(0,HUDTexture,osg::StateAttribute::ON);

//打开GL_BLEND 混合模式(以保证Alpha 纹理正确)
HUDStateSet->setMode(GL_BLEND, osg::StateAttribute::ON);

// 禁止深度测试,因此几何体将忽略已绘制物体的深度值,直接进行绘制
HUDStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
HUDStateSet->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
// 确认该几何题在最后进行绘制。渲染元(RenderBin)按照数字顺序执行渲染,因此我们设置一个较大的数字值
HUDStateSet->setRenderBinDetails(11, "RenderBin");

// 最后我们设置文字。由于osg::Text 继承自osg::Drawable,其实例可以作为osg::Geode实例的子节点添加到场景中。
// 添加文字到 Geode 叶节点中
HUDGeode->addDrawable(textOne);

// 设置HUD 文字的参数
//textOne->setCharacterSize(25);
textOne->setText(L"孤舟钓客:泛舟四海,笑傲江湖!");
textOne->setAxisAlignment(osgText::Text::SCREEN);
textOne->setPosition(osg::Vec3(360, 165, -1.5));
textOne->setColor(osg::Vec4(199, 77, 15, 1));


// 最后,设置视景类并进入仿真循环。
osg::ref_ptr<osgViewer::View> mViewer = new osgViewer::View;
mViewer->setUpViewInWindow(100, 100, 680,440);
        mViewer->setSceneData(root);
        osgViewer::CompositeViewer compositeViewer;
        compositeViewer.addView( mViewer.get() );
        compositeViewer.run();       

该用户从未签到

 楼主| 发表于 2012-5-10 15:08:51 | 显示全部楼层
是不是非要setFont?

该用户从未签到

发表于 2012-5-10 15:33:40 | 显示全部楼层

设置simhei.ttf中文字体

该用户从未签到

 楼主| 发表于 2012-5-10 16:52:19 | 显示全部楼层
FlySky 发表于 2012-5-10 15:33
设置simhei.ttf中文字体

它找不到这个字体,尝试了很多次,不知道怎么回事

该用户从未签到

发表于 2012-5-10 23:09:26 | 显示全部楼层

百度一搜一大堆~~~~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表