1x=0
1y=0
1z=0
1type=1
1DLightAmR=1.0
1DLightAmG=1.0
1DLightAmB=1.0
1DLightColR=1.0
1DLightColG=1.0
1DLightColB=1.0
1DLightDx= 0.0
1DLightDy= 1.0
1DLightDz= 0.0
1DLightSn= 1.0
1DLightSg= 1.0
1BindLightType=1
1BindLightID=0
1HideMod=1
1SightRangeDraw=0
num = 1
DLightNum = 1
…
因为我们需要隐藏方向光代表的这个PT物体,因此位置没有意义,可以将x、y、z简单设置为0。type表示此PT物体类型,即此PT物体的基物体类型或序号,这里为1。DLightAmR、G和B表示此方向光的全局光分量,这里设置为1.0。DLightColR、G和B为此方向光的颜色,也可以看做是此方向光的强度。DLightDx、y、z表示此方向光的方向,应为一个归一化向量,本例中方向为垂直于地面指向天空。DLightSn和DLightSg为此方向光的光泽度和强度。BindLightType为此光源的类型,1表示方向光。BindLightID为此方向光的序号,那么此方向光的序号为0,即第0个方向光。HideMod设置是否隐藏此模型,这里设置为1即隐藏。SightRangeDraw设置此PT物体是否在视线范围内绘制,因为此方向光模拟的是太阳,那么表示此方向光的PT物体不应只在视线内绘制,因此设置为0。最后设置DLightNum为1,告诉引擎方向光数量为1(光源设置详见应用篇)。num为1表示场景中共有1个PT物体需要加载。图2.3显示了无光源存在的场景和只有一个方向光的场景。


图2.3 无光源场景和方向光点亮场景
在设置完PT物体后,需要告诉光核引擎哪些PT物体需要绘制。光核引擎使用组方式对PT物体进行统一绘制。组设置的基本格式如下所示,其中N表示选择的场景号。
[SceneNGroup]
Group1ID1=第1组的第1个PT物体的序号
…
Group1IDP=第1组的第P个PT物体的序号
Group1Num=第1组中需要绘制的PT物体的数量(最大为P个)
……
GroupMID1=第M组的第1个PT物体的序号
…
GroupMIDP=第M组的第P个PT物体的序号
GroupMNum=第M组中需要绘制的PT物体的数量(最大为P个)
Num = 需要绘制的组数(最大为M个)
基于上述组格式我们设置本关卡的组信息,如下所示。只绘制1个组,此组只包括一个PT物体即灯光PT物体(序号为1)。
…
[Scene1Group]
Group1ID1=1
Group1Num=1
num =1
…
2.3 动作可以被操控的玩家
2.3.1 静态与动态物理模型
在本游戏中,玩家需要接受物理影响(如随重力下降、碰撞其他物体等等),且可能会受到其他物理物体的碰撞、推动、挤压等等,那么此玩家模型应该被设置为一个物理模型且应该是动态物理模型。
在2.1.1中我们将地面模型定义为了静态物理物体,那么何时将一个物体定义为静态物理物体,何时将一个物体定义为动态物理物体?表2.1描述了静态与动态物理模型的区别。
表2.1 静态与动态物理模型的区别
|
|
静态物理物体 |
动态物理物体 |
|
受重力作用 |
否 |
是 |
|
对静态物理物体碰撞检测 |
否 |
是 |
|
对动态物理物体碰撞检测 |
是 |
是 |
|
接受静态物理物体的力作用 |
否 |
是 |
|
接受动态物理物体的力作用 |
否 |
是 |
|
定义方式 |
只能在场景物体中定义 |
只能在PT物体中定义 |
从表中我们可以看到,静态物理物体只对动态物理物体进行碰撞检测,确保不会发生穿模,因此静态物理物体适合做为不会受物理作用而发生位置和姿态改变的物体,如道路、房屋、树木、地面等等,且物理运算较快。相比之下,动态物理物体适合做经常受物理作用而发生位置和姿态改变的物体。相比静态物理物体,动态物理物体的运算需要一定的时间开销。需要注意的是,只可以将场景物体定义为静态物理物体,同时也只可以将PT物体定义为动态物理物体。
2.3.2 设置玩家物理模型
在光核引擎中,动态物理模型只能通过PT物体定义。由于PT物体由DT物体派生,因此我们需要添加一个DT物体,作为玩家PT物体的基模型。添加的定义如下所示:
…
[DTMod2]
texnum = 1
mtl=model\\LearnLC3D\\Chapter1\\DT\\player\\mod.mtl
mod=model\\LearnLC3D\\Chapter1\\DT\\player\\mod.obj
tex1=model\\LearnLC3D\\Chapter1\\DT\\player\\mod.bmp
[DTMod]
num = 2
…
此时mod.obj是这个玩家的包络模型,因为包络模型决定了碰撞检测的范围,且决定了哪些部分不可以穿过,因此玩家的包络模型应包括整个玩家模型。mod.bmp和mod.mtl是包络模型的贴图和材质,因为包络模型只用于进行碰撞检测,包络模型的表面颜色和材质并不关注,因此可以简单制作。
我们制作的玩家简单的包络模型见图2.4左图中的长方体(图中玩家模型被缩小以放置在包络内)。此模型仅仅简单的包裹住整个玩家模型,但并没有精准的包裹住玩家模型的边缘,这将导致玩家的碰撞检测范围比实际模型的范围大,但是这样做可以有效加快玩家的碰撞检测速度,因为包络的面越少,碰撞检测速度越快。图2.4右显示了更精准的玩家包络模型,这会使得玩家的碰撞检测更精准,但也带来了更大的计算开销。制作完玩家包络模型后,将坐标轴放在包络模型的底部中心点,并将模型放置在世界坐标系原点。


图2.4 玩家不同的包络模型
设置了包络模型的DT模型后,开始派生出此DT模型的一个PT物体。在配置此PT物体的配置项前,需要确定玩家的出生位置,即此包络在场景中的位置,设置的玩家包络初始位置如图2.5所示。

![]()
图2.5 玩家包络在场景中的初始位置
然后在[ScenePTMod1]字段中添加第2个PT物体信息如下:
…
2x=-114.234
2y=39.009
2z=127.017
2ShowTip=0
2type=2
2SelMode=0
2DyPhyMod=1
2ModCanColldSelfRot=0
num = 2
…
在此配置中,x,y,z表示需要将此包络放置在场景空间中的位置。这里需要注意的是,3dsmax位置系与引擎坐标系不完全一致,需要转换才能适应引擎坐标,具体方法为:引擎坐标x = 3dsmax的x坐标,引擎坐标y = 3dsmax的z坐标,引擎坐标z = 负3dsmax的y坐标。ShowTip设置此PT物体是否显示提示标,这里不需要显示。type为此PT物体对应的DT物体序号或类型,那么就是2号。SelMode设置此PT物体是否可以被点击拾取,这个不需要。DyPhyMod设置此PT物体是否是动态物理物体,这里需要设置。ModCanColldSelfRot设置此PT动态物理物体是否碰撞后发生自身旋转,因为是人物玩家,我们认为人物在移动过程中,身体始终是直立的,因此不能发生旋转。如果要控制的玩家是车辆等,那么可以允许旋转,从而确保此车辆贴合地面。
最后在组设置里添加这个新设置的PT物体,使得此PT物体可以被绘制,设置信息如下,添加的PT物体序号为2,即玩家的包络模型。
…
[Scene1Group]
Group1ID1=1
Group1ID2=2
Group1Num=2
num =1
…
2.3.3 玩家操控配置信息
在[SceneMod1]中继续添加如下配置信息。玩家操控配置信息分为三类:用户追踪设置、用户追踪视点设置和用户操控设置。
…
//用户追踪设置
UserViewTraceMode=1
UserViewTraceModID=2
UserViewTraceMaxYOffset=20.0
UserViewTraceMinYOffset=-10.0
UserViewTraceMaxYAngle=90.0
UserViewTraceMinYAngle=-90.0
//用户追踪视点设置
UserViewTraceFarPosX=-10
UserViewTraceFarPosY=24.342
UserViewTraceFarPosZ=6.647
UserViewTracePosX=-10
UserViewTracePosY=24.382
UserViewTracePosZ=-33.952


