骨骼动画完全不懂,而且工作里暂时也用不上这么高大上的东西,所以这个例子只看除骨骼动画之外的东西

关于骨骼动画,这篇博客说的也许是对的:

相关样例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;

哪位朋友如果知道为啥的话,麻烦告诉我一下。。。。


chaoswong
48 声望2 粉丝

引用和评论

0 条评论