MMSDT.clickMove()
在场景中以第一人称的视角控制虚拟化身人物的漫游,鼠标点击地面移动,可控制包括站立、行走、跑步等动作,支持手机触控。
Tips: 虚拟化身人物模型需绑定动画。
构造函数
MMSDT.clickMove( parameters: object, callback: array )
parameters - 数组,包含json格式的对象参数。
ground - 数组字符串,供鼠标点击的地面网格名称
focusPic - 字符串,焦点图路径
scale - 数字,焦点图大小
height - 数字,焦点图相对被点击地面的高度
stature - 数字,人的高度
speed - 数字,移动速度
avatar - 模型对象,虚拟人物模型
actions - 数组,动画序列下标,顺序分别为[站立、行走、跑步]
running - 数字,人物跑步阈值,行走速度达到这个值就调用跑步动画
rotation - 浮点数,人物旋转弧度
distance - 数字,视线距离虚拟人物的距离
collision - 构造函数,碰撞检测器
light - 数组,添加光线跟踪,人物在地面产生阴影,光源相对人物的坐标方向
lightIntensity - 数字, 跟踪光线的强度,为0则关闭
callback - 数组,目标位置坐标。
属性
.moveSpeed( value )
改变漫游速度
value - 数字,漫游速度
.light( value )
光线跟踪的光线强度
value - 字符串,参数里的数组下标
.location( avatarPosition, cameraPosition )
位置切换
avatarPosition - 数组,虚拟化身的新坐标
cameraPosition - 数组,相机的新坐标
代码示例
var MMS3D_exceptionMesh = []; //需要材质拆分的网格
var MMS3D_instancingMesh = []; //合并实例化网格
//初始化场景
MMSDT.initScene( false, MMS3D_exceptionMesh, MMS3D_instancingMesh );
//设置第3人称鼠标控制器
controls3.maxPolarAngle = Math.PI*0.51; //向下,最大角度限制
controls3.enablePan = false; //是否开启鼠标右键屏幕空间平移
controls3.enableDamping = true; //是否开启惯性阻尼
controls3.dampingFactor = 0.1; //惯性阻尼系数
//使用json文件让场景还原
MMSDT.onloadScene( "models/mms3D_exhibition2.json", function(progress){
if( progress == 'done' ){
//加载完成
onloadDone();
}else if( progress == 'ok' ){
}else{
//显示进度条数字
document.getElementById("loadNum").innerHTML = Math.round( progress )+'%';
}
});
var avatar; //虚拟化身人物
var collision;
var collision2;
//场景加载完成
function onloadDone(){
var options ={
x: [ 490,-462 ], //x轴的最大边界,x轴的最小边界
z: [ 434,-417 ], //z轴的最大边界,z轴的最小边界
y: 1, //镜面高度
mesh: ["01"], //需要反射的地面
opacity: 0.9 //反射度(0~1)
}
var Reflector = new MMSDT.groundMirror( options ); //初始化地面反射
//把碰撞物模型归集
var collisions = [];
var childs=["01","_27","_08","_258","_06"]; //墙,地
//模型再次设置
models[0].traverse( function ( child ) {
if ( child.isMesh ) {
for( var i=0; i<childs.length; i++ ){
if( child.name == childs[i]){
collisions.push( child ); //归集需要碰撞检测的模型
}
}
}
});
var parameter = {
ground: collisions, //碰撞检测物
distance: 18, //前后左右检测的距离
height: 20, //碰撞点高度(前后左右的监测点),需小于人的高度,过高很容易跨越障碍
stature: 40, //人的高度
gravity: 0.2, //重力
enabled: false, //默认碰撞检测关闭
}
collision = new MMSDT.collision( parameter ); //碰撞检测(人物)
var parameter2 = {
ground: collisions, //碰撞检测物
distance: 35, //前后左右检测的距离
height: 2, //碰撞点高度(前后左右的监测点),需小于人的高度,过高很容易跨越障碍
stature: 4, //人的高度
gravity: 0.001, //重力
enabled: true, //默认碰撞检测关闭
}
collision2= new MMSDT.collision( parameter2 ); //碰撞检测(相机)
//设置虚拟化身人物///////////////////////////////////////////////////////////////////////////
//绑定虚拟化身控制系统
var options = {
ground: ["01","_27"], //供鼠标点击的地面网格名称
focusPic: "textures/sequence/focus/", //焦点图路径
scale: 20, //焦点图大小
height: 0.1, //焦点图相对被点击地面的高度
stature: 35, //人的高度
speed: 1.5, //移动速度
avatar: models[1], //虚拟人物模型
actions: [3,1,0], //动画序列下标,顺序分别为[站立、行走、跑步]
running: 5, //人物跑步阈值,行走速度达到这个值就调用跑步动画
rotation: 0, //人物旋转弧度
distance: 130, //视线距离虚拟人物的距离
collision: collision, //碰撞检测器
light: [-50,50,50], //添加光线跟踪,人物在地面产生阴影,光源相对人物的坐标方向
lightIntensity: 0.8, //跟踪光线的强度,为0则关闭
}
avatar = new MMSDT.clickMove( options ); //初始化鼠标点击地面行走
}
//自定义对外函数接口------------------------------------------------------------------------
//行走速度
MMAPI.moveSpeed = function(value){
avatar.moveSpeed( value) ;
}
//光线强度
MMAPI.changeLight = function(value){
avatar.light( value) ;
}
//位置切换
MMAPI.toTocation = function(num){
collision2.enabled = false; //关闭相机碰撞检测
switch(num) {
case 0: //门口
avatar.location( [0,50,350],[0,50,480] ); //新的位置([人物x坐标,人物y坐标,人物z坐标],[相机x,相机y,相机z])
break;
case 1: //A区
avatar.location( [-244,50,-162],[-182,50,-208] ); //新的位置([人物x坐标,人物y坐标,人物z坐标],[相机x,相机y,相机z])
break;
case 2: //B区
avatar.location( [251,50,-120],[250,50,-205] );
break;
case 3: //C区
avatar.location( [182,50,-163],[210,50,-221] );
break;
}
setTimeout(function(){
collision2.enabled = true; //开启相机碰撞检测
},500)
}