查看: 7975|回复: 17

osgAL编译过程!

[复制链接]

该用户从未签到

发表于 2011-7-7 13:57:00 | 显示全部楼层 |阅读模式
本帖最后由 xairwolfcn 于 2011-7-7 14:45 编辑

新手编译OSGAL,请赐教!看那里有问题!讨论讨论!

编译环境:OSG3.0 环境   VS2008SP1

1.上官网http://www.vrlab.umu.se/research/osgAL/

1)下载OSGAL开发包一定要用SVN下载的,我从SourceForge下载的包无法用Cmake编译


QQ截图未命名.jpg

OSGAL-SVN:https://osgal.svn.sourceforge.net/svnroot/osgal

2)下载第三方支持,在官网上有列表

QQ截图未命名1.jpg

总共有这三个

FreeAlut

OpenAL

oggvorbis

说明:freeALut和OpenAL在同一个网站(OpenAL:http://connect.creativelabs.com/openal/default.aspx)下载

FreeAlut和OpenAL下载:

进入OpenAL的官网中的download页面下载如下文件:

OpenAL直接下载OpenAL11CoreSDK(安装到你指定的位置)

QQ截图未命名11.jpg

freeAlut下载Windows Binary版本(解压缩到指定位置)

QQ截图未命名2.jpg

oggvorbis下载:

进入OggVorbis官网下载页面:http://xiph.org/downloads/

下载以下两个开发包:

libogg

libvorbis(需要libogg支持)

QQ截图未命名我.jpg

下载对应的zip文件

2、编译

首先建立如下文件夹(位置自己定):

E:\Bin;

E:\Include;

E:\Lib;

将FreeALut和OpenAL中的include、lib;中的内容拷贝到对应的E:\Include E:\Bin中

并将E:\Include  E:\Lib 加入到你的VS2008中

编译libogg:

libogg的开发包里有对应VS2008的编译项目(Dynamic和Static两个文件),直接全部编译并生成Release和DeBug版;

将Debug版本的*.lib和*.dll名称更改为:*d.lib和*d.dll;

将libogg中的inlcude文件夹的内容拷贝到E:\Include中,将生成的*.dll和*.exe文件拷贝到E:\Bin;将生成的*.lib文件拷贝到E:\Lib;

编译libvorbis:

和编译libogg方法一样;

3、编译OSGAL

用CMake进行编译,不多说;

QQ截图未命名www.jpg

注意:编译过程中会出现找不到alut.h,把E:\Include\AL\alut.h拷贝到E:\Include\下就OK了;

编译完成后将生成:(OSGAL的例子没有拷贝到这里!!)

QQ截图未命名123.jpg

E:\Bin;E:\Include;E:\Lib;的文件全部拷贝到OSGAL中的对应文件夹中;


现在可以开始制作你的OSGAL程序了;

该用户从未签到

 楼主| 发表于 2011-7-7 14:49:18 | 显示全部楼层
回复 1# xairwolfcn


    我这里有个例子,用以上方法编译后的OSGAL,能编译通过。
  1. #include <osgViewer/Viewer>
  2. #include <osgDB/ReadFile>
  3. #include <osg/Group>
  4. #include <osgGA/TrackballManipulator>
  5. #include <osgUtil/Optimizer>
  6. #include <osgAL/SoundNode>
  7. #include <osgAL/SoundRoot>
  8. #include <osgAL/SoundManager>
  9. #include <osgAL/SoundState>
  10. #include <osg/PositionAttitudeTransform>
  11. #include <osg/DeleteHandler>
  12. #include <osg/MatrixTransform>
  13. int main()
  14. {
  15. osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
  16. osg::ref_ptr<osgGA::TrackballManipulator> tbm = new osgGA::TrackballManipulator;
  17. osg::ref_ptr<osg::MatrixTransform> rootnode = new osg::MatrixTransform;

  18. osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile("cow.osgt");

  19. int num_hw_soundsources = 10;
  20. osgAL::SoundManager::instance()->init(num_hw_soundsources);
  21. osgAL::SoundManager::instance()->getEnvironment()->setDistanceModel(openalpp::InverseDistance);
  22. osgAL::SoundManager::instance()->getEnvironment()->setDopplerFactor(1);

  23. rootnode->addChild(cow.get());
  24. rootnode->setMatrix(osg::Matrix::rotate(osg::inDegrees(30.0f),1.0f,0.0f,0.0f));

  25. std::vector<std::string> wave_vector;
  26. wave_vector.push_back("d:/button.wav");//随便更换下你自己的声音文件就可以了
  27. wave_vector.push_back("d:/backgruandss.wav");
  28. wave_vector.push_back("d:/backgruand.wav");


  29. osg::ref_ptr<osgAL::SoundRoot> sound_root = new osgAL::SoundRoot;

  30. rootnode->addChild(sound_root.get());
  31. osg::ref_ptr<osg::PositionAttitudeTransform> sound_transform = new osg::PositionAttitudeTransform;
  32. rootnode->addChild(sound_transform.get());
  33. sound_transform->setPosition(osg::Vec3(0, -100, 50));

  34. osg::ref_ptr<osgAL::SoundNode> sound_node = new osgAL::SoundNode;
  35. sound_transform->addChild(sound_node);

  36. osg::Timer_t curr, start = osg::Timer::instance()->tick();
  37. double interval = 2;
  38. unsigned int n = 0;

  39. osgUtil::Optimizer op;
  40. op.optimize(rootnode.get());
  41. viewer->setCameraManipulator(tbm);
  42. viewer->setSceneData(rootnode.get());
  43. viewer->realize();

  44. while(!viewer->done())
  45. {
  46. curr = osg::Timer::instance()->tick();
  47. if (osg::Timer::instance()->delta_s(start, curr) > 10)
  48. {
  49. start = curr;
  50. std::string file = wave_vector[n%wave_vector.size()];
  51. osgAL::SoundManager::instance()->removeSoundState(file);

  52. n++;

  53. file = wave_vector[n%wave_vector.size()];

  54. bool add_to_cache = true;
  55. osg::ref_ptr<openalpp::Sample> sample = osgAL::SoundManager::instance()->getSample(file.c_str(), add_to_cache);
  56. osg::notify(osg::WARN)<<"load sample::"<<file<<std::endl;

  57. osg::ref_ptr<osgAL::SoundState> sound_state = new osgAL::SoundState(file);
  58. sound_state->setSample(sample.get());
  59. sound_state->setGain(1.0f);
  60. sound_state->setReferenceDistance(60);
  61. sound_state->setRolloffFactor(3);
  62. sound_state->setPlay(true);
  63. sound_state->setLooping(true);
  64. sound_state->allocateSource(10, false);
  65. osgAL::SoundManager::instance()->addSoundState(sound_state.get());
  66. sound_state->apply();
  67. sound_node->setSoundState(sound_state.get());
  68. }

  69. viewer->frame();
  70. }

  71. if (osg::Referenced::getDeleteHandler()) {
  72. osg::Referenced::getDeleteHandler()->setNumFramesToRetainObjects(0);
  73. osg::Referenced::getDeleteHandler()->flushAll();
  74. }

  75. osgAL::SoundManager::instance()->shutdown();
  76. return 0;
  77. }
复制代码

该用户从未签到

发表于 2011-7-8 08:11:16 | 显示全部楼层
谢谢楼主分享,目前我们已经可以用osgAudio库来取代osgAL库,后者已经比较古老了

该用户从未签到

 楼主| 发表于 2011-7-8 10:13:25 | 显示全部楼层
OSGAudio,我编译老出错!

该用户从未签到

发表于 2011-8-8 14:05:26 | 显示全部楼层
很好,解决了燃眉之急,从肖鹏的书上看到的网站下载的osgal的源代码无法编译,痛苦了好几天,这次找对了。
多谢楼主分享!

该用户从未签到

 楼主| 发表于 2011-8-8 16:37:33 | 显示全部楼层
回复 5# James


    array 说好像osgAudio代替了osgAL,是不是要考虑用OSGAudio?在编译和使用上两个很相似!

该用户从未签到

发表于 2011-8-8 17:04:22 | 显示全部楼层
回复 6# xairwolfcn


   hello,在不?我编译osgAL时出了错误,不知道为啥,能否帮我看看?qq号285376122

该用户从未签到

 楼主| 发表于 2011-8-9 23:05:53 | 显示全部楼层
回复 7# James

我的osgAL是用SVN下的:https://osgal.svn.sourceforge.net/svnroot/osgal
Cmake版本:2.8.5
cmake没有出错!

该用户从未签到

发表于 2011-8-10 10:48:12 | 显示全部楼层
回复 8# xairwolfcn


    openAL编译好了,我先试试,原来第三方的那些库都要在CMake里面设置,费了半天劲才找全了。
    openAudio还没弄好,这个东西真郁闷。

该用户从未签到

 楼主| 发表于 2011-8-10 23:51:12 | 显示全部楼层
回复 9# James
两个很相似!编译过程也类似(需要的支持3dparty都是那些)!用法上,就我看到书上的例子和osgAudio带的例子也很类似!

该用户从未签到

发表于 2011-9-26 18:41:31 | 显示全部楼层
我在用vs2005编译osgal的时候出现了好多warning都是提示转unicode编码的,没有error而且编译通过了。
在使用的时候提示fatal error C1083: 无法打开包括文件:“osgAL/SoundNode”: No such file or directory(已经配置到vs中去了)。是不是osgAL编译有问题?另外,编译libogg、libvorbis时,我把静态和动态(Dynamic和Static两个文件)工程都编译了一下,是这样的吗?

该用户从未签到

发表于 2012-12-8 16:49:56 | 显示全部楼层
chyzh 发表于 2011-9-26 18:41
我在用vs2005编译osgal的时候出现了好多warning都是提示转unicode编码的,没有error而且编译通过了。
在使 ...

您的问题解决了吗,我也遇到了相同的问题,但是还是没有找到很好的办法

该用户从未签到

发表于 2013-1-22 23:59:47 | 显示全部楼层
您好,vs2008编译libogg、libvorbis时,我把静态和动态(Dynamic和Static两个文件)工程都编译了一下,是这样的吗?但是编译出来竟然没有.EXE怎么回事呢

在使用的时候提示fatal error C1083: 无法打开包括文件:“osgAL/SoundNode”: No such file or directory(已经配置到vs中去了)。是不是osgAL编译有问题?另外,编译libogg、libvorbis时,我把静态和动态(Dynamic和Static两个文件)工程都编译了一下,是这样的吗?

该用户从未签到

发表于 2013-4-19 21:55:40 | 显示全部楼层
我也遇到相同的问题

该用户从未签到

 楼主| 发表于 2013-4-22 19:35:42 | 显示全部楼层
本帖最后由 xairwolfcn 于 2013-4-22 19:36 编辑
cm89570816 发表于 2013-4-19 21:55
我也遇到相同的问题


最近,我更换编译器到vs2010 ,重新编了。建议用Fmod。
osgAudio或osgAL,他需要声音库支持是二选一,Fmod或者,openal+alut+libogg+libvorbis;cmake里有选项。
O_ENABLE_SUBSYSTEM_FMOD
O_ENABLE_SUBSYSTEM_OPENAL
选一个就是了。(不要来回切换这两个选项,默认使用FMOD;来回点会编译会出错,找不到头文件)
FMOD网上下一个包,fmodapi44412win-installer.exe,配置好就直接编译没有问题。

昨天,我用vs2010+openal+osgAudio(sVN)编译没有问题,最后执行例子的时候,发现关闭时报错。
用FMOD编译后,没有任何问题。

用FMOD编译,先入门,再有更高的或特殊要求了,再尝试用OpenAL编译。
不要纠结在编译这个环节。。

该用户从未签到

发表于 2013-5-6 16:58:56 | 显示全部楼层
xairwolfcn 发表于 2013-4-22 19:35
最近,我更换编译器到vs2010 ,重新编了。建议用Fmod。
osgAudio或osgAL,他需要声音库支持是二选一, ...

无法解析的外部符号 "__declspec(dllimport) public: virtual void __thiscall osgAL::SoundState::setName(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (__imp_?setName@SoundState@osgAL@@UAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>F:\别院书斋\osg教程\OpenSceneGraph三维渲染引擎编程指南\10\osgAL声音播放示例\Release\osgVR.exe : fatal error LNK1120: 1 个无法解析的外部命令

该用户从未签到

 楼主| 发表于 2013-5-8 17:53:55 | 显示全部楼层
本帖最后由 xairwolfcn 于 2013-5-8 17:56 编辑
cm89570816 发表于 2013-5-6 16:58
无法解析的外部符号 "__declspec(dllimport) public: virtual void __thiscall osgAL::SoundState::setNa ...


1、是不是文件路径的问题,英文路径尝试下!
2、把你的编译环境描述下!!
看 是你自己的工程。。加LIB没。。。:“?
是不是没有找到osgAudio的DLL。啊。。
OA的DLL加到PATH里试一试。。

该用户从未签到

发表于 2013-7-16 10:42:03 | 显示全部楼层
cm89570816 发表于 2013-5-6 16:58
无法解析的外部符号 "__declspec(dllimport) public: virtual void __thiscall osgAL::SoundState::setNa ...

我的也是这种错误啊,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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