第二人生的源码分析(十四)人物角色的实现
在第二人生里,最重要的实现就是人物角色的实现,它不是基于第一视角实现的,而是第三视角的方式实现,因此每个居民在第二人生里是有一个虚拟人物角色代表的。这样构造出来的社会是多姿多彩,先来看看下面人物角色的图片:
<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="[email protected]@[email protected]@[email protected]@[email protected]@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 436.5pt; HEIGHT: 311.25pt" type="#_x0000_t75"><imagedata src="file:///C:/DOCUME~1/caijs/LOCALS~1/Temp/msohtml1/01/clip_image001.jpg" o:title="Snapshot_003"></imagedata></shape>
蔡军生 <chsdate isrocdate="False" islunardate="False" day="14" month="1" year="2008" w:st="on">2008/01/14</chsdate> QQ:9073204 深圳
<shape id="_x0000_i1026" style="WIDTH: 436.5pt; HEIGHT: 311.25pt" type="#_x0000_t75"><imagedata src="file:///C:/DOCUME~1/caijs/LOCALS~1/Temp/msohtml1/01/clip_image003.jpg" o:title="Snapshot_006"></imagedata></shape>
蔡军生 <chsdate isrocdate="False" islunardate="False" day="14" month="1" year="2008" w:st="on">2008/01/14</chsdate> QQ:9073204 深圳
从上面看到各种各样的人物角色,穿着不同的衣服,摆出不同的姿势,形态各异。要实现这样的人物角色显示,是需要比较多的代码来实现的。首先是它的网格就比较复杂,有很多三角形才构造这样复杂的人物,刚刚头部构造的三角形网格大小,就有<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1.6" unitname="m"><span lang="EN-US" style="mso-fareast-language: ZH-CN; mso-fareast-font-family: 宋体">1.6M</span></chmetcnv>大小。其次它的骨骼动画也比较复杂,这些都需要大量的变换矩阵组成。再次,就是实现很多人物同时显示时计算量比较大。人物角色的实现过程是这样的:先加载头发、眼睛、头部、上肢、下肢,然后再贴上相应的纹理图片。
在第二人生里,为了加快人物角色的显示,并没有把人物的网格数据放在服务器上,而是随着客户端一起下载的。现在就来分析一下怎么样从文件里加载网格数据。如下:
1、 LLVOAvatar::LLVOAvatar()构造函数
初始化人物角色。
2、 buildCharacter();
构造人物角色。
3、 loadAvatar();
加载人物角色。
4、 loadMeshNodes()
加载人物的网格节点。
5、 LLPolyMesh::getMesh(info->mMeshFileName);
按名称来加载角色的数据。
6、 mesh_data->loadMesh( full_path )
从文件路径名称里读取网格数据。