123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- import { QingXiCheAndQvThreeWorldEvent } from './QingXiCheAndQvThreeWorldEvent.js';
- /**
- * 操作3d世界的,单例模式的类对象
- */
- export class QingXiCheAndQvThreeWorldEventMain {
-
- // 每次 new 出对象则会调用这个构造函数
- constructor() {
- // 已经封装好的,编辑器的类对象,内置可以直接调用的代码
- this.objIframeEdit = null;
- // iframe对象
- this.objIframe = null;
- // 3d世界的场景,后续要操作3d世界常用的对象
- this.objScene = null;
- // babylon 对象,懂babylon,就可以使用babylon的api去操作
- this.BABYLON = null;
- // 渲染引擎babylon
- this.objEngine = null;
- // 处理3d世界的各种事件
- this.objThreeWorldEvent = null;
- }
- // 实现单例模式
- static find() {
- if (!QingXiCheAndQvThreeWorldEventMain.instance) {
- QingXiCheAndQvThreeWorldEventMain.instance = new QingXiCheAndQvThreeWorldEventMain();
- }
- return QingXiCheAndQvThreeWorldEventMain.instance;
- }
- /**
- * 初始化方法
- * objIframeEdit 已经封装好的,编辑器的类对象,内置可以直接调用的代码
- * objIframe iframe对象
- * objScene 场景对象
- * BABYLON babylon.js对象,用于后续调用babylon的代码去创建更新等操作
- */
- initObj = function (objIframeEdit, objIframe, objScene, BABYLON) {
-
- if (this.objIframe != null && this.objIframe != undefined) {
- return this;
- }
-
- this.objIframeEdit = objIframeEdit;
- this.objIframe = objIframe;
- this.objScene = objScene;
- this.BABYLON = BABYLON;
- let ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
- this.objEngine = ChengGuangYuanJing.CommonVal.find().objEngine;
-
- this.initClass();
-
- return this;
- }
- /**
- * 初始化其他会用到的类对象
- */
- initClass = function() {
- this.objThreeWorldEvent = new QingXiCheAndQvThreeWorldEvent();
- this.objThreeWorldEvent.initObj(
- this.objIframeEdit,
- this.objIframe,
- this.objScene,
- this.BABYLON
- );
-
- return this;
- }
- /**
- * 切换到飞行模式,切换到指定的视角
- */
- toFlyModel = function() {
- this.objIframeEdit.modelPeopleLook(3);
- return this;
- }
- /**
- * 切换到第三人称
- */
- toRoleEvent = function() {
-
- var thisClass = this;
- this.objIframeEdit.modelPeopleLook(1);
- setTimeout(function() {
- thisClass.coordinateMoveSphereFollowUpdate();
- }, 1500);
- return this;
- }
- /**
- * 将当前移动的视角,切换成角色所在视角
- * 记录当前的视角,解决人物,切换到新的视角的时候,会出现一个很长的过度问题
- */
- coordinateMoveSphereFollowUpdate = function() {
-
- var objIframeEdit = this.objIframeEdit;
- var objIframe = this.objIframe;
- var scene = this.objScene;
- var BABYLON = this.BABYLON;
- var ChengGuangYuanJing = objIframe.ChengGuangYuanJing;
- // 解决后续切换相机是同名字的时候,视角变成直接跳转的问题
- ChengGuangYuanJing.CommonVal.find().cameraConfigUpdateOrRecord('record');
- // // 将当前移动的视角,切换成角色所在视角
- // ChengGuangYuanJing.EventMoveRole.find().coordinateMoveSphereFollow.position
- // = new BABYLON.Vector3(
- // ChengGuangYuanJing.Role.find().objRole.position.x,
- // ChengGuangYuanJing.Role.find().objRole.position.y,
- // ChengGuangYuanJing.Role.find().objRole.position.z
- // );
-
- return this;
- }
-
- /**
- * 将所有设置为地面的,改为不设置为地面
- */
- groundNoRemove = function() {
-
- var ChengGuangYuanJing = this.objIframe.ChengGuangYuanJing;
- for (const key in ChengGuangYuanJing.ModelObjEdit.find().meshListIdToJson) {
-
- if (
- ChengGuangYuanJing.ModelObjEdit.find().meshListIdToJson[key]['isGround'] == true
- ) {
- // 通过更新材质的参数,来更新
- ChengGuangYuanJing.ModelObjEdit.find().objOneMeshListIdToJsonUpdate(
- key,
- {
-
- "isGround" : false,
- }
- );
- }
-
- }
-
- for (let i = 0; i < ChengGuangYuanJing.CommonVal.find().objScene.meshes.length; i++) {
-
- let objMesh = ChengGuangYuanJing.CommonVal.find().objScene.meshes[i];
- // console.log(
- // "myIsGround",
- // objMesh["myIsGround"]
- // );
- // if (objMesh["myIsGround"] == true) {
- // delete objMesh["myIsGround"];
- // }
- delete objMesh["myIsGround"];
- }
-
- ChengGuangYuanJing.Role.find().isGroundList = {};
- ChengGuangYuanJing.ModelObjEdit.find().myIsGroundConfigNum = 0;
- return this;
- }
- /**
- * 切换指定名字的视角
- * name 3d编辑器里,定义好的视角名字
- */
- eyeNameLook = function(name) {
- var objIframeEdit = this.objIframeEdit;
- var objIframe = this.objIframe;
- var scene = this.objScene;
- var BABYLON = this.BABYLON;
-
- // 切换到指定名字视角
- objIframeEdit.cameraVisualAngleGetListNameGpsTo(name);
- // 不显示角色
- objIframeEdit.roleShow(false);
-
- }
- /**
- * 因为进入更换视角后
- * 然后又要回到人物视角,之前会根据出生地来回去
- *
- * 所以
- * 将人物的出生地更新到,最后一次人物的坐标
- *
- * birthplaceBool 是否是重置到自定义的坐标
- *
- */
- commonBirthplaceUpdate = function(birthplaceBool) {
- var objIframeEdit = this.objIframeEdit;
- var objIframe = this.objIframe;
- var scene = this.objScene;
- var BABYLON = this.BABYLON;
- var ChengGuangYuanJing = this.objIframe.ChengGuangYuanJing;
- var absolutePosition = ChengGuangYuanJing.Role.find().objRole._absolutePosition;
- var absolutePositionNew = JSON.parse(JSON.stringify({
- "x" : absolutePosition.x,
- "y" : absolutePosition.y,
- "z" : absolutePosition.z,
- }));
- // for (var i = 0; i < ChengGuangYuanJing.CommonBirthplace.find().list.length; i++) {
- // var thisList = ChengGuangYuanJing.CommonBirthplace.find().list[i];
- // // console.log(
- // // "thisList", thisList, absolutePositionNew
- // // );
- // thisList.position.x = absolutePositionNew.x;
- // thisList.position.y = absolutePositionNew.y;
- // thisList.position.z = absolutePositionNew.z;
- // thisList.positionTarget.x = absolutePositionNew.x;
- // thisList.positionTarget.y = absolutePositionNew.y;
- // thisList.positionTarget.z = absolutePositionNew.z;
- // }
- // 如果是出生,则设置指定的参数
- if (birthplaceBool == true) {
- let birthplaceInit = {
- "code": "1757044395413",
- "name": "出生地",
- "position": {
- "x": 0.36538233957617505,
- "y": 2.108317829319077,
- "z": 2.889462045867414
- },
- "alpha": -4.893234984275375,
- "beta": 1.651446745038209,
- "radius": 9.455934731777727,
- "positionTarget": {
- "x": 3.813143253326416,
- "y": 1.2875758409500122,
- "z": 8.668329238891602
- }
- }
- absolutePositionNew.x = birthplaceInit.position.x;
- absolutePositionNew.y = birthplaceInit.position.y;
- absolutePositionNew.z = birthplaceInit.position.z;
- console.log("更新了出生地的位置", absolutePositionNew);
- }
-
- // ChengGuangYuanJing.CommonVal.find().roleConfig.position.x = absolutePositionNew.x;
- // ChengGuangYuanJing.CommonVal.find().roleConfig.position.y = absolutePositionNew.y;
- // ChengGuangYuanJing.CommonVal.find().roleConfig.position.z = absolutePositionNew.z;
- ChengGuangYuanJing.CommonVal.find().roleConfig.positionTarget.x = absolutePositionNew.x;
- ChengGuangYuanJing.CommonVal.find().roleConfig.positionTarget.y = absolutePositionNew.y;
- ChengGuangYuanJing.CommonVal.find().roleConfig.positionTarget.z = absolutePositionNew.z;
-
- }
- /**
- * 判断当前的人物和目标坐标点的距离是否在范围内
- * 范围内返回 true 否则返回 false
- */
- roleAndPositionTargetBool = () => {
- var objIframeEdit = this.objIframeEdit;
- var objIframe = this.objIframe;
- var scene = this.objScene;
- var BABYLON = this.BABYLON;
- var ChengGuangYuanJing = this.objIframe.ChengGuangYuanJing;
- var absolutePosition = ChengGuangYuanJing.Role.find().objRole._absolutePosition;
- // var positionTarget = {
- // 'x' : 7.16298,
- // 'y' : 1.01,
- // 'z' : -12.90319,
- // }
- var positionTarget = {
- 'x' : 8.27173,
- 'y' : 1.01,
- 'z' : -17.70557,
- }
- // 得到两点之间的距离
- let thisVector3distanceTo = BABYLON.Vector3.Distance(
- new BABYLON.Vector3(parseFloat(absolutePosition.x), parseFloat(absolutePosition.y), parseFloat(absolutePosition.z)),
- new BABYLON.Vector3(parseFloat(positionTarget.x), parseFloat(positionTarget.y), parseFloat(positionTarget.z))
- );
- // console.log('roleAndPositionTargetBool ---', thisVector3distanceTo);
-
- if (thisVector3distanceTo <= 9) {
- return true;
- }
-
- return false;
- }
-
- }
|