|
|
原创:hdm2968。请勿转载。
这是关于3D中billboard的纹理帧动画,主要思想是来源自2D的动画思想。
在一张纹理上有x列和y行,分成x*y个单元,它们的大小是一样的,起初有第一个单元起,每次更新向左移动一个单元;当到结尾时就从下一行的第一个单元在开始,之后到右下角最后一个时又再从左上角第一个开始。于是形成动画。
首先是有一个billboard类,其实简单的就是四边形就行了,它的动画系统必须有纹理、纹理的纵行数、纹理的横行数和当前的单元号码。当然“纹理的纵行数、纹理的横行数”是视纹理而变的。而纹理是怎样的?可以参考附件,很多2D动画都是使用这类图片,但与3D不同的是,2D的背景色是(255,0,255),而3D的背景色应该是alpha通道,所以最后使用.tga文件。
下面看看简单的动画类:
class AnimBillBoard
{
公布版;
纹理;
纹理的纵行数;//row
纹理的横行数;//line
当前的单元号码;//pointer
初始化函数();
更新动画函数();
渲染函数();
...
};
初始化函数()作为载入纹理和得到纵行数和横行数。更新动画函数()不需要经常执行,因为人的视觉保留没法跟上每秒数百次的更新,这就需要时间协调了。渲染函数()就不用我说了。
现在要详细说一下“更新动画函数()”。首先是决定pointer,初始为0,每次加1,如果等于或大于row*line,则重置为0。至于纹理坐标的u、v的确定,u就是rowr除pointer的余再乘上每个单元的宽度,v就是row除pointer的商的整数部分再乘上每个单元的高度。知道uv但还不够,因为billboard是两个点描述的,左上角的纹理坐标就是uv,右下角自然是(u,v)+(每个单元宽度,每个单元高度)。
另外,纹理坐标的改变,我只知道lock和vertex shader,听说还有另一种方法Vertex Declaration,但这个的做法没有试过。
E-mail:hdm2968@163.com
对于Vertex Declaration,希望有人此教。
以上那免有错与不足,请大家指出。 |
|