查看: 2874|回复: 0

从头开始创建一个最简单的OpenSceneGraph程序及环境(OSG2.0)(Release版)

[复制链接]

该用户从未签到

发表于 2008-11-28 14:01:52 | 显示全部楼层 |阅读模式
1、下载资源
v71版本,可以运行的安装包
http://www.openscenegraph.org/downloads/binaries/osg2.0.0_vs71_setup_2007-06-19.exe
OpenSceneGraph Quick Start Guide pdf资料,中文资料,这个用来进行中文参考
http://www.lulu.com/items/volume_51/767000/767629/3/print/OSGQSG.pdf
2、直接安装osg2.0.0_vs71_setup_2007-06-19.exe文件
我缺省安装在D:\Program Files\OpenSceneGraph下面
装好后,到D:\Program Files\OpenSceneGraph下,把osgsrc.zip文件就地解压
3、设置环境变量 系统变量
(我的电脑-->属性-->高级-->环境变量-->系统环境变量-->编辑(I))
   OSG_ROOT     D:\Program Files\OpenSceneGraph
   OSG_FILE_PATH    D:\Program Files\OpenSceneGraph\data
   Path在后面添加   ;D:\Program Files\OpenSceneGraph\bin;
新建(W)
   OSG_NOTIFY_LEVEL DEBUG_FP
4、修改屏幕属性(属性-->设置-->颜色(C)-->选择 真彩色(32位)-->确定)
   然后注销用户,重新登录系统就可以了.
5、测试安装的状态(在cmd,命令状态下执行)
osgversion 会显示:
OpenSceneGraph Library 2.0.0
osglogo 会显示 一个图片,如果无法显示,请用错误信息ii的解决办法解决.按下Esc键可以退出osglogo程序.
osgviewer cow.osg 会显示 一个图片,如果无法显示,请用错误信息ii的解决办法解决.按下Esc 键可以退出osgviewer程序.
在运行osgviewer 程序时,按下"H"键(小写h)可以显示按键及其对应功能的帮助列表.按键"1"到"5"可以切换不同的摄像机控制模式,即,鼠标运动对摄像机位置的操纵方式.当前的摄像机选择的是"1"键对应的轨迹球模式,这也是程序的缺省模式.

i、错误信息:
Error: [Screen #0] GraphicsWindowWin32::setPixelFormat() - No matching pixel for
mat found based on traits specified
  GraphicsWindow has not been created successfully.
Viewer::realize() - failed to set up any windows
解决办法:OSG_NOTIFY_LEVEL DEBUG_FP没有添加到系统环境变量中.
ii、错误信息:在运行osglogo出现的错误
GraphicsWindowWin32::setPixelFormat() - Display setting is not 32 bit colors, 16
bits per pixel on screen #0
解决办法:把你的显示器的颜色设置,设置到32位真彩色.(屏幕属性-->设置-->颜色-->选择 真彩色(32位))

6、建立和设置工程
启动Microsoft Visual Studio .NET 2002(VC7,Microsoft开发环境 2002版本,Version 7.0.9486),建立一个Win32控制台项目,在应用程序设置选项卡里,选择空项目,点击完成.为了在工程选项里出现C/C++的选项,先给工程添加一个空的C++源文件.
具体步骤:文件(F)-->新建(N)-->项目(P)-->Visual C++项目-->Win32项目-->名称(N):Test-->确定-->应用程序设置-->选中 控制台应用程序(O)-->选中 空项目(E) -->完成-->在右边 解决方案"Test"下 选择 源文件 右击-->添加(D)-->添加新项(W)-->C++文件(.cpp)-->名称(N): Test-->打开(O)
OpenSceneGraph运行需要多线程DLL的运行时库和RTTI,所以,在建立每个OpenSceneGraph工程后,第一件事就是更改工程设置.
(由于我们现在使用的是Release版本,所以只用填写Release信息)
具体步骤:项目(Test) 属性-->配置(C)-->Release
打开项目属性,在C/C++选项卡里,点击代码生成页,更改运行时库,对于Debug版,用多线程调试 DLL (/Mdd),对于Release版,用多线程 DLL (/MD).
具体步骤:C/C++-->代码生成-->运行时库-->Release版,用多线程 DLL(/MD)
//Debug版多线程调试 DLL (/Mdd)这里只提出来,不用设置
设置C/C++选项卡里的语言页的启用运行时类型信息为:是(/GR).(Release版下设置)
具体步骤:C/C++-->语言-->启用运行时类型信息-->是(/GR)-->确定
OpenSceneGraph程序需要链接对应的库文件,打开链接器选项卡里的输入页,设置附加依赖项,对于Debug版,是OpenThreadsd.lib,osgd.lib,osgDBd.lib,osgFXd.lib,osgGAd.lib,osgIntrospectiond.lib,osgManipulatord.lib,osgParticled.lib,osgShadowd.lib,osgSimd.lib,osgTerraind.lib,osgTextd.lib,osgUtild.lib,osgViewerd.lib,对于Release版,设置这些lib文件不带"d"的版本.
(由于我们现在使用的是Release版本,所以只用填写Release信息)
具体步骤:链接器-->输入-->附加依赖项 中填写
OpenThreads.lib
osg.lib
osgDB.lib
osgFX.lib
osgGA.lib
osgIntrospection.lib
osgManipulator.lib
osgParticle.lib
osgShadow.lib
osgSim.lib
osgTerrain.lib
osgText.lib
osgUtil.lib
osgViewer.lib
-->确定-->确定
设置编译时头文件路径
工具-->选项-->项目-->VC++ 目录-->显示以下内容的目录(S)-->包含文件-->在最后面创建一个新的目录-->最后行的地方双击,添上 D:\Program Files\OpenSceneGraph\include 一项,再建一项D:\Program Files\OpenSceneGraph\osgsrc\OpenSceneGraph\include
设置编译时库文件路径
工具-->选项-->项目-->VC++ 目录-->显示以下内容的目录(S)-->库文件-->在最后面创建一个新的目录-->最后行的地方双击,添上 D:\Program Files\OpenSceneGraph\lib

这样,工程属性就设置好了.
7、编辑程序
首先 在左尖三角 将 Debug 选择成 Release
然后在刚才建立的空文件里输入如下内容:
#include <osgUtil/Optimizer>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Material>
#include <osg/Geode>
#include <osg/BlendFunc>
#include <osg/Depth>
#include <osg/Projection>
#include <osg/AutoTransform>
#include <osg/Geometry>
#include <osgText/Text>
#include <iostream>
osg::Node* createLabel(const osg::Vec3& pos, float size, const std::string& label, osgText::Text::AxisAlignment axisAlignment)
{
    osg::Geode* geode = new osg::Geode();
   
    std::string timesFont("fonts/arial.ttf");
    {
        osgText::Text* text = new  osgText::Text;
        geode->addDrawable( text );
        text->setFont(timesFont);
        text->setPosition(pos);
        text->setCharacterSize(size);
        text->setAxisAlignment(axisAlignment);
        text->setAlignment(osgText::Text::CENTER_CENTER);
        text->setText(label);
        
    }
   
    return geode;   
}

osg::Node* createLabel3(const osg::Vec3& pos, float size, const std::string& label)
{
    osg::Geode* geode = new osg::Geode();
   
    std::string timesFont("fonts/arial.ttf");
    {
        osgText::Text* text = new  osgText::Text;
        geode->addDrawable( text );
        text->setFont(timesFont);
        text->setPosition(pos);
        text->setFontResolution(40,40);
        text->setCharacterSize(size);
        text->setAlignment(osgText::Text::CENTER_CENTER);
        text->setAutoRotateToScreen(true);
        text->setCharacterSizeMode(osgText::Text::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT);
        text->setText(label);
        
    }
   
    return geode;   
}
osg::Node* createAxis(const osg::Vec3& s, const osg::Vec3& e, int numReps, osg::AutoTransform::AutoRotateMode autoRotateMode, osgText::Text::AxisAlignment axisAlignment, const std::string& str)
{
    osg::Group* group = new osg::Group;
    osg::Vec3 dv = e-s;
    dv /= float(numReps-1);
    osg::Vec3 pos = s;
    bool useAuto = true;
    if (useAuto)
    {
        osg::Vec3Array* vertices = new osg::Vec3Array;
        for(int i=0;i<numReps;++i)
        {
            osg::AutoTransform* at = new osg::AutoTransform;
            at->setPosition(pos);
            at->setAutoRotateMode(autoRotateMode);
            at->addChild(createLabel(osg::Vec3(0.0f,0.0f,0.0f),dv.length()*0.2f,str, axisAlignment));
            vertices->push_back(pos);
            pos += dv;

            group->addChild(at);
        }
        osg::Vec4Array* colors = new osg::Vec4Array;
        colors->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
        osg::Geometry* geom = new osg::Geometry;
        geom->setVertexArray(vertices);
        geom->setColorArray(colors);
        geom->addPrimitiveSet(new osg:rawArrays(GL_LINE_STRIP,0,vertices->size()));
        osg::Geode* geode = new osg::Geode;
        geode->addDrawable(geom);
        group->addChild(geode);
    }
    else
    {
        osg::Vec3Array* vertices = new osg::Vec3Array;
        for(int i=0;i<numReps;++i)
        {
            group->addChild(createLabel3(osg::Vec3(pos),dv.length()*0.5f,str));
            vertices->push_back(pos);
            pos += dv;

        }
        osg::Vec4Array* colors = new osg::Vec4Array;
        colors->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
        osg::Geometry* geom = new osg::Geometry;
        geom->setVertexArray(vertices);
        geom->setColorArray(colors);
        geom->addPrimitiveSet(new osg::DrawArrays(GL_LINE_STRIP,0,vertices->size()));
        osg::Geode* geode = new osg::Geode;
        geode->addDrawable(geom);
        group->addChild(geode);
    }
   
    return group;
}
osg::Node* createScene()
{
    osg::Group* root = new osg::Group;
   
//    int numReps = 3333;
    int numReps = 10;
    root->addChild(createAxis(osg::Vec3(0.0,0.0,0.0),osg::Vec3(1000.0,0.0,0.0),numReps,osg::AutoTransform::ROTATE_TO_CAMERA,osgText::Text::XY_PLANE, "ROTATE_TO_CAMERA"));
    root->addChild(createAxis(osg::Vec3(0.0,0.0,0.0),osg::Vec3(0.0,1000.0,0.0),numReps,osg::AutoTransform::ROTATE_TO_SCREEN,osgText::Text::XY_PLANE, "ROTATE_TO_SCREEN"));
    root->addChild(createAxis(osg::Vec3(0.0,0.0,0.0),osg::Vec3(0.0,0.0,1000.0),numReps,osg::AutoTransform::NO_ROTATION,osgText::Text::XZ_PLANE, "NO_ROTATION"));   
   
    return root;
}
int main(int, char**)
{
    // construct the viewer.
    osgViewer::Viewer viewer;
    // set the scene to render
    viewer.setSceneData(createScene());
   
    // run the viewers frame loop
    return viewer.run();
}

保存文件(Ctrl+S)-->按F5-->是(Y) ,显示结果。
来源于网络,回归于网络.
我的Email:happy.every.day@126.com QQ:48399956
快乐!
2008年11月22日
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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