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; } }