骨骼动画完全不懂,而且工作里暂时也用不上这么高大上的东西,所以这个例子只看除骨骼动画之外的东西
关于骨骼动画,这篇博客说的也许是对的:
相关样例examples有3个,example_osganimationhardware、example_osganimationskinning、example_osganimationviewer。其中:
- hardware——骨骼动画的驱动过程,通过骨骼的变化修改蒙皮;
- skinning——骨骼动画的构造原理,=骨骼+蒙皮+动画;
- viewer——骨骼动画的加载及播放控制;
好,开始说说“之外的东西”。
osg::clone
这个是osg里提供的拷贝函数,可以通过参数来进行深、浅拷贝操作。深拷贝就是另外搞出一个和原来一模一样的东西,但内存里是两个东西;浅拷贝就是只拷贝这个东西的指针,但在内存里他们指向的东西是一样的。
本例里从DEEP_COPY_ALL
里去掉了下面两个flag:
- osg::CopyOp::DEEP_COPY_PRIMITIVES
- osg::CopyOp::DEEP_COPY_ARRAYS
意思就是说这两个只拷贝指针就可以了(内存共享),其他的成员变量则需要进行深拷贝。
动态shader
看这个例子之前,一直都认为shader是事先写好的,一般不改(我的见识太短了。。。),看完这个例子后,才发现shader是可以动态修改的!
说是动态,其实也没那么神奇,看代码:
```c++
std::string str = _shader->getShaderSource();
std::string to_replace = "MAX_MATRIX";
std::size_t start = str.find(to_replace);
std::stringstream ss;
ss << getMatrixPaletteUniform()->getNumElements();
str.replace(start, to_replace.size(), ss.str());
_shader->setShaderSource(str);
说白了其实就是字符串替换,但也说明了osg的shader是可以运行时修改的。**注意:程序都开始run了,那是没法修改的。**
## 问题来了
`getRandomValueinRange`为什么要这样写:
```c++
return static_cast<unsigned int>((rand() * 1.0 * size)/(RAND_MAX-1));
我在测试的时候直接写成下面这样,结果也没啥区别:c++
return rand()%size;
哪位朋友如果知道为啥的话,麻烦告诉我一下。。。。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。