QingXiCheAndQvThreeWorldEventMain.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. import { QingXiCheAndQvThreeWorldEvent } from './QingXiCheAndQvThreeWorldEvent.js';
  2. /**
  3. * 操作3d世界的,单例模式的类对象
  4. */
  5. export class QingXiCheAndQvThreeWorldEventMain {
  6. // 每次 new 出对象则会调用这个构造函数
  7. constructor() {
  8. // 已经封装好的,编辑器的类对象,内置可以直接调用的代码
  9. this.objIframeEdit = null;
  10. // iframe对象
  11. this.objIframe = null;
  12. // 3d世界的场景,后续要操作3d世界常用的对象
  13. this.objScene = null;
  14. // babylon 对象,懂babylon,就可以使用babylon的api去操作
  15. this.BABYLON = null;
  16. // 渲染引擎babylon
  17. this.objEngine = null;
  18. // 处理3d世界的各种事件
  19. this.objThreeWorldEvent = null;
  20. }
  21. // 实现单例模式
  22. static find() {
  23. if (!QingXiCheAndQvThreeWorldEventMain.instance) {
  24. QingXiCheAndQvThreeWorldEventMain.instance = new QingXiCheAndQvThreeWorldEventMain();
  25. }
  26. return QingXiCheAndQvThreeWorldEventMain.instance;
  27. }
  28. /**
  29. * 初始化方法
  30. * objIframeEdit 已经封装好的,编辑器的类对象,内置可以直接调用的代码
  31. * objIframe iframe对象
  32. * objScene 场景对象
  33. * BABYLON babylon.js对象,用于后续调用babylon的代码去创建更新等操作
  34. */
  35. initObj = function (objIframeEdit, objIframe, objScene, BABYLON) {
  36. if (this.objIframe != null && this.objIframe != undefined) {
  37. return this;
  38. }
  39. this.objIframeEdit = objIframeEdit;
  40. this.objIframe = objIframe;
  41. this.objScene = objScene;
  42. this.BABYLON = BABYLON;
  43. let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
  44. this.objEngine = ChengGuangYuanJing.CommonVal.find().objEngine;
  45. this.initClass();
  46. return this;
  47. }
  48. /**
  49. * 初始化其他会用到的类对象
  50. */
  51. initClass = function() {
  52. this.objThreeWorldEvent = new QingXiCheAndQvThreeWorldEvent();
  53. this.objThreeWorldEvent.initObj(
  54. this.objIframeEdit,
  55. this.objIframe,
  56. this.objScene,
  57. this.BABYLON
  58. );
  59. return this;
  60. }
  61. /**
  62. * 切换到飞行模式,切换到指定的视角
  63. */
  64. toFlyModel = function() {
  65. this.objIframeEdit.modelPeopleLook(3);
  66. return this;
  67. }
  68. /**
  69. * 切换到第三人称
  70. */
  71. toRoleEvent = function() {
  72. var thisClass = this;
  73. this.objIframeEdit.modelPeopleLook(1);
  74. setTimeout(function() {
  75. thisClass.coordinateMoveSphereFollowUpdate();
  76. }, 1500);
  77. return this;
  78. }
  79. /**
  80. * 将当前移动的视角,切换成角色所在视角
  81. * 记录当前的视角,解决人物,切换到新的视角的时候,会出现一个很长的过度问题
  82. */
  83. coordinateMoveSphereFollowUpdate = function() {
  84. var objIframeEdit = this.objIframeEdit;
  85. var objIframe = this.objIframe;
  86. var scene = this.objScene;
  87. var BABYLON = this.BABYLON;
  88. var ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
  89. // 解决后续切换相机是同名字的时候,视角变成直接跳转的问题
  90. ChengGuangYuanJing.CommonVal.find().cameraConfigUpdateOrRecord('record');
  91. // // 将当前移动的视角,切换成角色所在视角
  92. // ChengGuangYuanJing.EventMoveRole.find().coordinateMoveSphereFollow.position
  93. // = new BABYLON.Vector3(
  94. // ChengGuangYuanJing.Role.find().objRole.position.x,
  95. // ChengGuangYuanJing.Role.find().objRole.position.y,
  96. // ChengGuangYuanJing.Role.find().objRole.position.z
  97. // );
  98. return this;
  99. }
  100. /**
  101. * 将所有设置为地面的,改为不设置为地面
  102. */
  103. groundNoRemove = function() {
  104. var ChengGuangYuanJing = this.objIframe.ChengGuangYuanJing;
  105. for (const key in ChengGuangYuanJing.ModelObjEdit.find().meshListIdToJson) {
  106. if (
  107. ChengGuangYuanJing.ModelObjEdit.find().meshListIdToJson[key]['isGround'] == true
  108. ) {
  109. // 通过更新材质的参数,来更新
  110. ChengGuangYuanJing.ModelObjEdit.find().objOneMeshListIdToJsonUpdate(
  111. key,
  112. {
  113. "isGround" : false,
  114. }
  115. );
  116. }
  117. }
  118. for (let i = 0; i < ChengGuangYuanJing.CommonVal.find().objScene.meshes.length; i++) {
  119. let objMesh = ChengGuangYuanJing.CommonVal.find().objScene.meshes[i];
  120. // console.log(
  121. // "myIsGround",
  122. // objMesh["myIsGround"]
  123. // );
  124. // if (objMesh["myIsGround"] == true) {
  125. // delete objMesh["myIsGround"];
  126. // }
  127. delete objMesh["myIsGround"];
  128. }
  129. ChengGuangYuanJing.Role.find().isGroundList = {};
  130. ChengGuangYuanJing.ModelObjEdit.find().myIsGroundConfigNum = 0;
  131. return this;
  132. }
  133. /**
  134. * 切换指定名字的视角
  135. * name 3d编辑器里,定义好的视角名字
  136. */
  137. eyeNameLook = function(name) {
  138. var objIframeEdit = this.objIframeEdit;
  139. var objIframe = this.objIframe;
  140. var scene = this.objScene;
  141. var BABYLON = this.BABYLON;
  142. // 切换到指定名字视角
  143. objIframeEdit.cameraVisualAngleGetListNameGpsTo(name);
  144. // 不显示角色
  145. objIframeEdit.roleShow(false);
  146. }
  147. /**
  148. * 因为进入更换视角后
  149. * 然后又要回到人物视角,之前会根据出生地来回去
  150. *
  151. * 所以
  152. * 将人物的出生地更新到,最后一次人物的坐标
  153. *
  154. * birthplaceBool 是否是重置到自定义的坐标
  155. *
  156. */
  157. commonBirthplaceUpdate = function(birthplaceBool) {
  158. var objIframeEdit = this.objIframeEdit;
  159. var objIframe = this.objIframe;
  160. var scene = this.objScene;
  161. var BABYLON = this.BABYLON;
  162. var ChengGuangYuanJing = this.objIframe.ChengGuangYuanJing;
  163. var absolutePosition = ChengGuangYuanJing.Role.find().objRole._absolutePosition;
  164. var absolutePositionNew = JSON.parse(JSON.stringify({
  165. "x" : absolutePosition.x,
  166. "y" : absolutePosition.y,
  167. "z" : absolutePosition.z,
  168. }));
  169. // for (var i = 0; i < ChengGuangYuanJing.CommonBirthplace.find().list.length; i++) {
  170. // var thisList = ChengGuangYuanJing.CommonBirthplace.find().list[i];
  171. // // console.log(
  172. // // "thisList", thisList, absolutePositionNew
  173. // // );
  174. // thisList.position.x = absolutePositionNew.x;
  175. // thisList.position.y = absolutePositionNew.y;
  176. // thisList.position.z = absolutePositionNew.z;
  177. // thisList.positionTarget.x = absolutePositionNew.x;
  178. // thisList.positionTarget.y = absolutePositionNew.y;
  179. // thisList.positionTarget.z = absolutePositionNew.z;
  180. // }
  181. // 如果是出生,则设置指定的参数
  182. if (birthplaceBool == true) {
  183. let birthplaceInit = {
  184. "code": "1757044395413",
  185. "name": "出生地",
  186. "position": {
  187. "x": 0.36538233957617505,
  188. "y": 2.108317829319077,
  189. "z": 2.889462045867414
  190. },
  191. "alpha": -4.893234984275375,
  192. "beta": 1.651446745038209,
  193. "radius": 9.455934731777727,
  194. "positionTarget": {
  195. "x": 3.813143253326416,
  196. "y": 1.2875758409500122,
  197. "z": 8.668329238891602
  198. }
  199. }
  200. absolutePositionNew.x = birthplaceInit.position.x;
  201. absolutePositionNew.y = birthplaceInit.position.y;
  202. absolutePositionNew.z = birthplaceInit.position.z;
  203. console.log("更新了出生地的位置", absolutePositionNew);
  204. }
  205. // ChengGuangYuanJing.CommonVal.find().roleConfig.position.x = absolutePositionNew.x;
  206. // ChengGuangYuanJing.CommonVal.find().roleConfig.position.y = absolutePositionNew.y;
  207. // ChengGuangYuanJing.CommonVal.find().roleConfig.position.z = absolutePositionNew.z;
  208. ChengGuangYuanJing.CommonVal.find().roleConfig.positionTarget.x = absolutePositionNew.x;
  209. ChengGuangYuanJing.CommonVal.find().roleConfig.positionTarget.y = absolutePositionNew.y;
  210. ChengGuangYuanJing.CommonVal.find().roleConfig.positionTarget.z = absolutePositionNew.z;
  211. }
  212. /**
  213. * 判断当前的人物和目标坐标点的距离是否在范围内
  214. * 范围内返回 true 否则返回 false
  215. */
  216. roleAndPositionTargetBool = () => {
  217. var objIframeEdit = this.objIframeEdit;
  218. var objIframe = this.objIframe;
  219. var scene = this.objScene;
  220. var BABYLON = this.BABYLON;
  221. var ChengGuangYuanJing = this.objIframe.ChengGuangYuanJing;
  222. var absolutePosition = ChengGuangYuanJing.Role.find().objRole._absolutePosition;
  223. // var positionTarget = {
  224. // 'x' : 7.16298,
  225. // 'y' : 1.01,
  226. // 'z' : -12.90319,
  227. // }
  228. var positionTarget = {
  229. 'x' : 8.27173,
  230. 'y' : 1.01,
  231. 'z' : -17.70557,
  232. }
  233. // 得到两点之间的距离
  234. let thisVector3distanceTo = BABYLON.Vector3.Distance(
  235. new BABYLON.Vector3(parseFloat(absolutePosition.x), parseFloat(absolutePosition.y), parseFloat(absolutePosition.z)),
  236. new BABYLON.Vector3(parseFloat(positionTarget.x), parseFloat(positionTarget.y), parseFloat(positionTarget.z))
  237. );
  238. // console.log('roleAndPositionTargetBool ---', thisVector3distanceTo);
  239. if (thisVector3distanceTo <= 9) {
  240. return true;
  241. }
  242. return false;
  243. }
  244. }