之前在新浪博客上写过几篇图形学方面的博客,但是可能不是专门为技术博客设计,很多代码的显示,在新浪博客上不是那么尽如人意,所以,决定在这个博客上试验一下~
本人是非计算机专业研究生小菜鸟,因有做虚拟现实的需求,看过FreeSouth的几个录像,很感兴趣,就接触了一下OSG,不过刚接触OSG一周不到,希望有感兴趣的人一同学习,共同进步。
这里给出在MFC窗口中调用OSG的步骤和展示:
大家一般展示都用cow.osg啊,确实很经典,不过这里面我稍稍小改动了一下, 放上了一个我自己做的场景。
现在说操作步骤:
一、首先,要有配置时候用Cmake生成的例子,对于配置的教程网上就太多了,不过最近我可能会转载一篇,怕以后我自己忘记了。。。我提几点配置时候的注意事项:
1、英文路径,我自己也不是很确定是否有关系,不过之前我用了中文路径,没有生成成功。
2、要选择生成例子。
3、最好生成chm的帮助文档,很有用,html的帮助文档也不错,不过用着很乱。
二、在例子"examples"中选择项目"osgviewerMFC",导出我们接下来可能需要的MFC_OSG.h与MFC_OSG.cpp这里你可以在自己创建的项目中直接添加现有项目,或者把这两个文件拷到自己的项目目录中,若是直接添加现有项目,别忘记在"c/c++"的附加包含目录中把MFC_OSG.h的目录路径添加进来。
三、如果只是想直接用Viewer显示如"cow.osg"的示例文件,
1、将编译好的OSG库装载到项目里:
如果用的是Debug库就将下面的项加入到"链接器"的"输入"中的"附加依赖项"里(如果是Release则是没有"d"的lib):
OpenThreadsd.lib
osgd.lib
osgDBd.lib
osgUtild.lib
osgGAd.lib
osgViewerd.lib
osgTextd.lib
2、现在view头文件中添加:
#include "MFC_OSG.h"
public:
cOSG* myOSG;
HANDLE myThreadHandle;
3、在你所创建工程的View中添加:
int CosgmfcView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
myOSG=new cOSG(m_hWnd);
return 0;
}
void CosgmfcView::OnInitialUpdate()
{
CView::OnInitialUpdate();
myOSG->InitOSG("cow.osg");
myThreadHandle=(HANDLE)_beginthread(&cOSG::Render,0,myOSG);
}
注:这里生成的时候可能会报错,说AfxMessageBox参数不配套?我感觉是以前Vc++的类和现在的类中参数设定改变了,只要注销掉就好了。
这样生成项目会出现经典的"牛":
四、如过想展示自己制作的图像,就在MFC_OSG.cpp中添加并修改代码,我改的局部代码如下:
osg::ref_ptr<osg::Node> cOSG::MatrixOperation()
{
osg::ref_ptr<osg::Group>group=new osg::Group;
return group;
}
然后找到下面函数:
void cOSG::InitCameraConfig(void)
修改代码:
mViewer->setSceneData(MatrixOperation().get());
这时候就能显示出自己的图了:
注:
错误原因1:我在网上看到一个类似的博客,里面写到在stdafx.h里添加
#include <process.h>
不过我在做的时候没记得添加过这个,好像也能运行,若是有运行失败的添加一下此头文件试试。
错误原因2:平台换为X64。
错误原因3:若是找不到如"cow.osg"请看是否在配置的时候环境路径没加或者加错了。