多表情动画
实现方法
1.转换X文件为OPENGL容易读出的格式,是方便程序,我自定义格式MOR(MORPH的前三个字母)格式。
输出的mor文件结构
1 HEADER文件头 文件标志 = "morph01" 网格数量 ( unsigned ) 顶点数量 ( unsigned ) 材质数量 ( unsigned ) 2 信息列表 2.1 网格名称列表 网格名称1(32字节) 网格名称2 ... 网格名称meshNum 2.2 纹理名称列表 纹理名称1( 32 byte ) 纹理名称2 .. 纹理名称matNum 2.3 三角形集数量列表 三角形集1数量( unsigned ) 三角形集2数量 .. 三角形集matNum数量 3 顶点与三角形索引 3.1 顶点列表; 网格1的位置列表 (float*3*verNum) 网格1的法向列表 (float*3*verNum) ... 网格meshNum的位置列表 网格meshNum的法向列表 3.2 纹理坐标列表;(float*2*verNum) 3.3 三角形索引列表 材质1对应的三角形索引(unsigned * 3 *三角形集1的数量) 材质2对应的三角形索引 ... 材质matNum对应的三角形索引
2.我这里采用了5个拓扑结构相同的网格模型,其中一个为基底模型,将基底模型的的纹理,法向,位置,三角形索引数据列表以及其它四个网格模型的位置法向列表输入到顶点缓冲中。
3.顶点着色。这里GLSL 实现
混合渐变动画顶点着色代码:
attribute vec3 verpos1; attribute vec3 verpos2; attribute vec3 verpos3; attribute vec3 verpos4;
attribute vec3 vernor1; attribute vec3 vernor2; attribute vec3 vernor3; attribute vec3 vernor4;
uniform vec4 bf;
void main() { vec3 pos = (verpos1 - gl_Vertex.xyz) * bf.x; pos += (verpos2 - gl_Vertex.xyz) * bf.y; pos += (verpos3 - gl_Vertex.xyz) * bf.z; pos += (verpos4 - gl_Vertex.xyz) * bf.w; pos += gl_Vertex.xyz;
vec3 nor = (vernor1 - gl_Normal) *bf.x; nor += (vernor2 - gl_Normal) *bf.y; nor += (vernor3 - gl_Normal) *bf.z; nor += (vernor4 - gl_Normal) *bf.w; nor +=gl_Normal;
vec3 posView = (gl_ModelViewMatrix * vec4(pos,1.0)).xyz;
vec3 normal = gl_NormalMatrix * nor; normal = normalize(normal); vec3 lightDir = vec3(0.0,0.0,0.0) - posView; lightDir = normalize(lightDir); float lum = dot(normal, lightDir); gl_Position = gl_ModelViewProjectionMatrix * vec4(pos,1.0); gl_FrontColor = vec4(lum,lum,lum,1.0); gl_TexCoord[0] = gl_MultiTexCoord0; }
实现环境:VC6.0,OPENGL2.0,显卡X600,显寸128M