HTML5技术

结合WebSocket编写WebGL综合场景示例 - ljzc002(2)

字号+ 作者:H5之家 来源:H5之家 2016-11-07 12:00 我要评论( )

BABYLON.SceneLoader.ImportMesh("", "../MODEL/him/", "him.babylon", scene, function (newMeshes, particleSystems, skeletons) Tom= new Player; obj_p.mesh=newMeshes[0];obj_p.scaling=obj_p.position=obj_p.

BABYLON.SceneLoader.ImportMesh("", "../MODEL/him/", "him.babylon", scene, function (newMeshes, particleSystems, skeletons) Tom=new Player; obj_p.mesh=newMeshes[0];obj_p.scaling=obj_p.position=obj_p.rotation=obj_p.checkCollisions=obj_p.ellipsoid=obj_p.ellipsoidOffset=obj_p.skeletonsPlayer=skeletons; 14 obj_p.methodofmove="controlwitha"; 15 obj_p.name=username; 16 obj_p.id=id; 17 obj_p.p1=""; 18 obj_p.p2="../MODEL/him/"; 19 obj_p.p3="him.babylon"; arr=[]; 22 for(var i=1;i<len;i++) 23 { 24 arr.push(newMeshes[i]); 25 } 26 obj_p.submeshs=arr; 27 28 Tom.init( 29 obj_p 30 ); 31 arr_myplayers[username]=Tom; (state=="online") 34 { 35 var arr=[]; 36 arr.push("addnewplayer"); 37 arr.push(Tom.mesh.scaling.x); 38 arr.push(Tom.mesh.scaling.y); 39 arr.push(Tom.mesh.scaling.z); 40 arr.push(Tom.mesh.position.x); 41 arr.push(Tom.mesh.position.y); 42 arr.push(Tom.mesh.position.z); 43 arr.push(Tom.mesh.rotation.x); 44 arr.push(Tom.mesh.rotation.y); 45 arr.push(Tom.mesh.rotation.z); 46 arr.push(Tom.p1); 47 arr.push(Tom.p2); 48 arr.push(Tom.p3); 49 arr.push(Tom.meshname); 50 var dt=new Date(); 51 console.log(dt.getTime()+"send addnewplayer"+id); 52 doSend(arr.join("@")); 53 } });

   其中BABYLON.SceneLoader.ImportMesh是一个异步的把服务器端场景文件导入本地内存的方法,第一个参数表示导入场景文件中的哪一个Mesh,为空表示都导入(一个场景文件里可能包含多个模型,但该示例中的场景文件里只有一个模型,所以也叫做模型文件),第二个参数是文件所在的相对路径,第三个参数是文件名,第四个参数是文件加入的场景,第五个参数是导入完成后的回调函数。

  回调函数的newMeshes参数是所有导入的Mesh组成的数组,skeletons参数是所有导入的骨骼动画数组。事实上一个模型可能由多个mesh组合而成,比如示例中的him模型的newMeshes[0]只是一个空壳,newMeshes[1]到newMeshes[5]才是模型各个部分的实际Mesh,后五个Mesh是newMeshes[0]的“submesh”,newMeshes[0]是后五个Mesh的parent,在理想情况下这些Mesh之间的关系和Mesh与骨骼动画(skeleton)之间的关系由Babylon引擎自动管理。

  在回调函数中,定义Tom为一个Player“类”对象,第五行定义的obj_p对象是Player对象的初始化参数对象,Player.init()方法定义在player.js文件中:

Player=function() 3 { 4 sdyq.object.call(this); 5 } 6 Player.prototype=new sdyq.object(); 7 Player.prototype.init=function(param) 8 { 9 param = param || {}; .flag_standonground=0;.keys={w:0,s:0,a:0,d:0,space:0,ctrl:0,shift:0};.flag_runfast=1;.name=param.name; 15 this.id=param.id; 16 this.p1=param.p1; 17 this.p2=param.p2; 18 this.p3=param.p3; 19 。。。

  可以看到Player对象继承自sdyq.object对象,Player对象的原型是sdyq.object对象,在Player对象的init方法中,先初始化属于原型的属性,再初始化自己这个“类”新添加的属性。

  sdyq.object对象的定义在Sdyq.js文件中:

sdyq={};sdyq.object=function() } 7 sdyq.object.prototype.init = function(param) 8 { .witha0={forward:0,left:0,up:-9.82};.witha={forward:0,left:0,up:-9.82};.witha2={forward:0,left:0,up:0};.v0={forward:0,left:0,up:0};.vt={forward:0,left:0,up:0};.vm={forward:15,backwards:5,left:5,right:5,up:100,down:100};//.flag_runfast=1;.ry0=0;.ryt=0;.rychange=0;.mchange={forward:0,left:0,up:0};.vmove=.py0=0;param = param || {}; 26 this.mesh=param.mesh; 27 this.mesh.scaling=param.scaling; 28 this.mesh.position=param.position; 29 this.mesh.rotation=param.rotation; 30 this.mesh.checkCollisions=param.checkCollisions; 31 this.mesh.ellipsoid=param.ellipsoid; 32 this.mesh.ellipsoidOffset=param.ellipsoidOffset; 33 this.meshname=this.mesh.name; 34 this.skeletonsPlayer=param.skeletonsPlayer||[]; 35 this.submeshs=param.submeshs; 36 this.ry0=param.mesh.rotation.y; 37 this.py0=param.mesh.position.y; .PlayAnnimation = false; .methodofmove=param.methodofmove||""; 43 switch(this.methodofmove) 44 { 45 case "controlwitha": 46 { window.addEventListener("keyup", onKeyUp, ; 50 } 51 default : 52 { 53 break; 54 } 55 } 56 }

  sdyq.object对象的初始化方法中包含了对mesh姿态的详细设定、对键盘操作的监听设定和适用于加速度运动的各项参数设定,各种加速度运动的物体都可以用sdyq.object对象来扩展产生。

  在Player对象的初始化方法中还为每个玩家添加了id显示(头上的那个数字):

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • HTML5 WebSocket - Roberter

    HTML5 WebSocket - Roberter

    2016-10-25 16:00

  • websocket初探 - 2778085001

    websocket初探 - 2778085001

    2016-07-16 15:11

  • DIV+CSS:如何编写代码才能更有效率 - 2778085001

    DIV+CSS:如何编写代码才能更有效率 - 2778085001

    2016-06-29 15:00

  • 用node实现websocket协议 - 2778085001

    用node实现websocket协议 - 2778085001

    2016-06-25 14:00

网友点评