在第二人生里,人物的显示是比较复杂的,因为同一个网格模型可以显示为不同的人物出来,也就是人物每个部位的纹理不一样,比如不同的女孩子就有可能选择不同的头发,还可以穿着不同的衣服,不同的裤子等等。要实现这些功能,也就是说要把头、上身、下身、脚分开来显示。如下图所示:
蔡军生 2008/01/22 QQ:9073204 深圳
现在就来仔细地分析一下第二人生里是怎么样分别显示不同身体部份的,它的代码如下:
#001 U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
#002 {
#003
U32 num_indices = 0;
#004
#005
if (!mIsBuilt)
#006
{
#007
return num_indices;
#008
}
#009
……
……
#077
//--------------------------------------------------------------------
#078
// render all geomety attached to the skeleton
#079
//--------------------------------------------------------------------
#080
static LLStat render_stat;
#081
#082
LLViewerJointMesh::sRenderPass = pass;
#083
这里开始显示人物的各部位网格和纹理。
#084
if (pass == AVATAR_RENDER_PASS_SINGLE)
#085
{
#086
BOOL first_pass = TRUE;
#087
if (!mIsSelf || gAgent.needsRenderHead())
#088
{
#089
num_indices += mHeadLOD.render(mAdjustedPixelArea);
#090
first_pass = FALSE;
#091
}
上面显示头部。
#092
num_indices += mUpperBodyLOD.render(mAdjustedPixelArea, first_pass);
上面显示上身。
#093
num_indices += mLowerBodyLOD.render(mAdjustedPixelArea, FALSE);
上面显示下半身。
#094
#095
{
#096
LLGLEnable blend(GL_BLEND);
#097
LLGLEnable test(GL_ALPHA_TEST);
#098
num_indices += renderTransparent();
上面调用函数renderTransparent显示头发、裙子。
#099
}
#100
}
这样分开显示的好处,就是可以显示各种各样的人物出来,多姿多彩,节省人物实现的数据下载,当然也是骨骼动画实现的需要。