@@ -10,7 +10,11 @@ import {
import { saveState , resetState } from "./viewBack" ;
import { saveState , resetState } from "./viewBack" ;
import addFunction from "./addEvent" ;
import addFunction from "./addEvent" ;
import { editTunnelInit } from "./editTunnelInit" ;
import { editTunnelInit } from "./editTunnelInit" ;
import { addEquipment , removeEquipment , clearTunnelEquipments } from "./editEquipment" ;
import {
addEquipment ,
removeEquipment ,
clearTunnelEquipments ,
} from "./editEquipment" ;
import previewtunnelModeInit from "./previewTunnelInit" ;
import previewtunnelModeInit from "./previewTunnelInit" ;
import { StreetSignTag } from "./utils/StreetSignTag/StreetSignTag.js" ;
import { StreetSignTag } from "./utils/StreetSignTag/StreetSignTag.js" ;
import { realTimeRenderData } from "./realTimeRerender" ;
import { realTimeRenderData } from "./realTimeRerender" ;
@@ -23,6 +27,8 @@ export default class Demo {
//设备模型数组
//设备模型数组
deviceModels = [ ] ;
deviceModels = [ ] ;
constructor ( three , mountedElement ) {
constructor ( three , mountedElement ) {
// 初始化 Three.js 场景、相机、渲染器
// 绑定各种功能模块
this . _StreetSignTag = StreetSignTag ;
this . _StreetSignTag = StreetSignTag ;
this . _handleLClick = handleLClick ;
this . _handleLClick = handleLClick ;
this . _handleLHover = handleLHover ;
this . _handleLHover = handleLHover ;
@@ -50,7 +56,7 @@ export default class Demo {
75 ,
75 ,
window . innerWidth / window . innerHeight ,
window . innerWidth / window . innerHeight ,
1 ,
1 ,
1000
1000 ,
) ;
) ;
this . camera . position . z = 1.24 ;
this . camera . position . z = 1.24 ;
@@ -142,37 +148,46 @@ export default class Demo {
// 模型加载
// 模型加载
/**
/**
* @param {Object} GLTFLoader 模型加载器
* 加载 GLTF 格式的 3D 模型
* @param {String} path 模型资源路径
* @param {Object} GLTFLoader Three.js 的 GLTF 模型加载器类
* @param {String} path 模型文件的相对路径
* @param {Boolean} isedit 是否为编辑模式,影响加载后的交互行为
* @returns {Promise} 返回 Promise 对象,支持 async/await 调用
*/
*/
loadModel ( GLTFLoader , path , isedit ) {
loadModel ( GLTFLoader , path , isedit ) {
// 返回一个Promise对象, 支持异步调用
return new Promise ( ( resolve , reject ) => {
return new Promise ( ( resolve , reject ) => {
// 创建GLTF加载器实例
this . gltfloader = new GLTFLoader ( ) ;
this . gltfloader = new GLTFLoader ( ) ;
// 调用加载器加载模型
this . gltfloader . load (
this . gltfloader . load (
//下面是模型加载的 路径
path , // 模型文件 路径
path ,
( gltf ) => { // 加载成功的回调函数
( gltf ) => {
// 遍历模型场景中的所有子对象
// console.log(isedit);
gltf . scene . traverse ( ( child ) => {
gltf . scene . traverse ( ( child ) => {
// 对每个子模型执行处理操作
this . _forModels ( child ) ;
this . _forModels ( child ) ;
} ) ;
} ) ;
// 初始化 模型缩放倍率
// 设置 模型缩放比例为0.75 倍
gltf . scene . scale . set ( 0.75 , 0.75 , 0.75 ) ;
gltf . scene . scale . set ( 0.75 , 0.75 , 0.75 ) ;
// 初始化场景位置
// 设置模型位置坐标
gltf . scene . position . set ( - 5 , 0 , 10 ) ;
gltf . scene . position . set ( - 5 , 0 , 10 ) ;
// 将模型添加到场景中
this . scene . add ( gltf . scene ) ;
this . scene . add ( gltf . scene ) ;
// 加载完后可执行函数
// 执行模型加载后的初始化操作
// console.log(isedit);
this . _afterLoaded ( gltf . scene , isedit ) ;
this . _afterLoaded ( gltf . scene , isedit ) ;
// 将加载的模型对象传递给Promise的resolve
resolve ( gltf ) ;
resolve ( gltf ) ;
} ,
} ,
( xhr ) => {
( xhr ) => { // 加载进度的回调函数
// console.log((xhr.loaded / xhr.total) * 100 + "% loaded");
// console.log((xhr.loaded / xhr.total) * 100 + "% loaded"); // 可选:打印加载进度百分比
} ,
} ,
( error ) => {
( error ) => { // 加载失败的回调函数
// 在控制台输出错误信息
console . log ( error ) ;
console . log ( error ) ;
// 将错误传递给Promise的reject
reject ( error ) ;
reject ( error ) ;
}
} ,
) ;
) ;
} ) ;
} ) ;
}
}
@@ -219,7 +234,7 @@ export default class Demo {
addOrbitControls ( OrbitControls , isedit ) {
addOrbitControls ( OrbitControls , isedit ) {
this . orbitControls = new OrbitControls (
this . orbitControls = new OrbitControls (
this . camera ,
this . camera ,
this . renderer . domElement
this . renderer . domElement ,
) ;
) ;
//初始化轨道控制器
//初始化轨道控制器
this . orbitControls . object . position . set ( - 29 , 18 , - 50 ) ;
this . orbitControls . object . position . set ( - 29 , 18 , - 50 ) ;
@@ -261,7 +276,12 @@ export default class Demo {
const intersects = raycaster . intersectObjects ( hoverModels ) ;
const intersects = raycaster . intersectObjects ( hoverModels ) ;
if ( intersects . length > 0 ) {
if ( intersects . length > 0 ) {
if (Object . keys ( intersects [ 0 ] . object ) . includes ( 'enableHover' ) && ! intersects [ 0 ] . object . enableHover && ! isedit ) return ;
if (
Object . keys ( intersects [ 0 ] . object ) . includes ( "enableHover" ) &&
! intersects [ 0 ] . object . enableHover &&
! isedit
)
return ;
if ( ! this . preHover ) {
if ( ! this . preHover ) {
this . preHover = intersects [ 0 ] . object ;
this . preHover = intersects [ 0 ] . object ;
} else {
} else {
@@ -277,7 +297,7 @@ export default class Demo {
intersects [ 0 ] . object . material . color . set ( "red" ) ;
intersects [ 0 ] . object . material . color . set ( "red" ) ;
const tagP = intersects [ 0 ] . object . getWorldPosition (
const tagP = intersects [ 0 ] . object . getWorldPosition (
new this . THREE . Vector3 ( )
new this . THREE . Vector3 ( ) ,
) ;
) ;
// if (isedit != false) {
// if (isedit != false) {
this . _checkAnimation ( tagP ) ;
this . _checkAnimation ( tagP ) ;
@@ -303,12 +323,12 @@ export default class Demo {
// 点击两次处理事件
// 点击两次处理事件
this . renderer . domElement . addEventListener (
this . renderer . domElement . addEventListener (
"dblclick" ,
"dblclick" ,
this . _ _handleListenerDBLClickEvent . bind ( this , isClickModels ) //注意这里重新指向this, 第一个是修改this指向, 第二个是传入函数的参数
this . _ _handleListenerDBLClickEvent . bind ( this , isClickModels ) , //注意这里重新指向this, 第一个是修改this指向, 第二个是传入函数的参数
) ;
) ;
// 点击一次时处理时间
// 点击一次时处理时间
this . renderer . domElement . addEventListener (
this . renderer . domElement . addEventListener (
"mousedown" ,
"mousedown" ,
this . _ _handleListenerClickRLEvent . bind ( this , isClickModels ) //注意这里重新指向this, 第一个是修改this指向, 第二个是传入函数的参数
this . _ _handleListenerClickRLEvent . bind ( this , isClickModels ) , //注意这里重新指向this, 第一个是修改this指向, 第二个是传入函数的参数
) ;
) ;
}
}
// 处理点击2次触发事件事件
// 处理点击2次触发事件事件
@@ -471,7 +491,7 @@ export default class Demo {
// 初始标签面板
// 初始标签面板
const tag = new this . THREE . Mesh (
const tag = new this . THREE . Mesh (
new this . THREE . PlaneGeometry ( 7 , 5 ) ,
new this . THREE . PlaneGeometry ( 7 , 5 ) ,
new this . THREE . MeshBasicMaterial ( { color : "white" } )
new this . THREE . MeshBasicMaterial ( { color : "white" } ) ,
) ;
) ;
this . equMap . get ( "equ_sensors" ) . rotation . x += Math . PI / 2 ;
this . equMap . get ( "equ_sensors" ) . rotation . x += Math . PI / 2 ;
this . equMap . get ( "equ_sensors" ) . add ( tag ) ;
this . equMap . get ( "equ_sensors" ) . add ( tag ) ;
@@ -501,7 +521,7 @@ export default class Demo {
"/images/background/background.png" ,
"/images/background/background.png" ,
function ( texture ) {
function ( texture ) {
texture . encoding = backColorSet ;
texture . encoding = backColorSet ;
}
} ,
) ;
) ;
}
}
/**
/**
@@ -530,7 +550,7 @@ export default class Demo {
lookY : 0 ,
lookY : 0 ,
lookZ : 0 ,
lookZ : 0 ,
} ,
} ,
500
500 ,
) ;
) ;
this . opacityTween . start ( ) ;
this . opacityTween . start ( ) ;
this . opacityTween . onUpdate ( ( obj ) => {
this . opacityTween . onUpdate ( ( obj ) => {
@@ -568,7 +588,7 @@ export default class Demo {
// console.log(Signs);
// console.log(Signs);
const tag = new this . THREE . Mesh (
const tag = new this . THREE . Mesh (
new this . THREE . PlaneGeometry ( 100 , 76 ) ,
new this . THREE . PlaneGeometry ( 100 , 76 ) ,
new this . THREE . MeshBasicMaterial ( { color : "white" } )
new this . THREE . MeshBasicMaterial ( { color : "white" } ) ,
) ;
) ;
Signs . add ( tag ) ;
Signs . add ( tag ) ;
tag . name = "tag" ;
tag . name = "tag" ;