diff --git a/src/views/board/model/AirportModel.vue b/src/views/board/model/AirportModel.vue
index d591f99..85339e9 100644
--- a/src/views/board/model/AirportModel.vue
+++ b/src/views/board/model/AirportModel.vue
@@ -1,5 +1,8 @@
-
+
+
-->
-
-
-
-
+ }
+}
+
+-->
+ //.item1F, .item2F, .item3F, .item4F, .item5F {
+ // position: absolute;
+ // top: 45%;
+ // transform: translate(-50%, -50%);
+ // background-size: 100% 100%;
+ // background-repeat: no-repeat;
+ // width: 4.6vw;
+ // height: 1.32vw;
+ // line-height: 1.32vw;
+ // text-align: center;
+ // color: #fff;
+ //}
+ //
+ //.item1F {
+ // left: 39%;
+ // background-image: url("~@/assets/model/unselected.png");
+ //}
+ //
+ //.item2F {
+ // left: 44.5%;
+ // background-image: url("~@/assets/model/unselected.png");
+ //}
+ //
+ //.item3F {
+ // left: 50%;
+ // background-image: url("~@/assets/model/unselected.png");
+ //}
+ //
+ //.item4F {
+ // left: 55.5%;
+ // background-image: url("~@/assets/model/unselected.png");
+ //}
+ //
+ //.item5F {
+ // left: 61%;
+ // background-image: url("~@/assets/model/unselected.png");
+ //}
+}
+
+-->
diff --git a/src/views/board/参考/setThree.js b/src/views/board/参考/setThree.js
index 8afd123..3a45486 100644
--- a/src/views/board/参考/setThree.js
+++ b/src/views/board/参考/setThree.js
@@ -7,55 +7,75 @@ import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader'
import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader'
// 定义一些全局变量
-let isLoading = false
-let isAnimation = false
-let animationLine = []
-let keyidongModel
-let tuopanModel
-const scene = new THREE.Scene()
-const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000000000)
+let isLoading = false // 是否正在加载
+let isAnimation = false // 是否正在进行动画
+let animationLine = [] // 存储动画路径的数组
+let keyidongModel // 关键帧动画模型
+let tuopanModel // 拖盘模型
+const scene = new THREE.Scene() // 创建一个新的Three.js场景
+const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000000000) // 创建一个透视相机,参数为视角、宽高比、近裁剪面和远裁剪面
const renderer = new THREE.WebGLRenderer({
- antialias: true
-})
-const controls = new OrbitControls(camera, renderer.domElement)
-const pointLight = new THREE.PointLight(0xffffff, 1) //光源颜色 光照强度
-const ambient = new THREE.AmbientLight(0xffffff, 1)
-const light = new THREE.DirectionalLight(0xffffff, 1)
-const labelRenderer = new CSS2DRenderer()
-let raycaster = new THREE.Raycaster()
+ antialias: true // 开启抗锯齿
+}) // 创建一个WebGL渲染器
+const controls = new OrbitControls(camera, renderer.domElement) // 添加轨道控制器,允许用户通过鼠标操作旋转、缩放和平移场景
+const pointLight = new THREE.PointLight(0xffffff, 1) // 创建一个点光源,颜色为白色,强度为1
+const ambient = new THREE.AmbientLight(0xffffff, 1) // 创建一个环境光,颜色为白色,强度为1
+const light = new THREE.DirectionalLight(0xffffff, 1) // 创建一个平行光,颜色为白色,强度为1
+const labelRenderer = new CSS2DRenderer() // 创建一个CSS2D渲染器,用于在3D场景中渲染HTML标签
+let raycaster = new THREE.Raycaster() // 创建一个射线投射器,用于进行鼠标点击检测
// 创建一个二维空间的向量用于存储鼠标点击的屏幕位置
let mouse = new THREE.Vector2()
+// 设置场景背景颜色为黑色
scene.background = new THREE.Color(0x000000)
+// 设置相机位置
camera.position.set(-435, 940, -1377)
+// 更新相机投影矩阵
camera.updateProjectionMatrix()
+// 设置渲染器大小为窗口大小
renderer.setSize(window.innerWidth, window.innerHeight)
+// 设置控制器目标点
controls.target = new THREE.Vector3(-433, 300, -217)
+// 更新控制器
controls.update()
+// 设置点光源不随距离衰减
pointLight.decay = 0.0 //设置光源不随距离衰减 默认2.0
+// 设置点光源位置
pointLight.position.set(66, 66, 66) // 点光源位置
+// 设置点光源投射阴影
pointLight.castShadow = true
+// 将点光源添加到场景中
scene.add(pointLight)
+// 将环境光添加到场景中
scene.add(ambient)
+// 设置光源位置
light.position.set(66, 66, 66)
+// 设置光源目标点
light.target.position.set(0, 0, 0)
+// 将光源添加到场景中
scene.add(light)
+// 设置标签渲染器大小为窗口大小
labelRenderer.setSize(window.innerWidth, window.innerHeight)
+// 设置标签渲染器元素位置为绝对定位
labelRenderer.domElement.style.position = 'absolute'
+// 设置标签渲染器元素顶部位置为0
labelRenderer.domElement.style.top = '0'
+// 设置标签渲染器元素指针事件为无
labelRenderer.domElement.style.pointerEvents = 'none'
+// 将标签渲染器元素添加到文档中
document.body.appendChild(labelRenderer.domElement)
// 根据ID获取模型
function getModelById(id) {
- // 遍历场景中的所有对象
+ // 遍历场景中的所有对象,筛选出类型为'Group'或'Object3D'的对象
const objects = scene.children.filter(obj => obj.type === 'Group' || obj.type === 'Object3D')
for (const obj of objects) {
+ // 如果对象的ID与传入的ID匹配,则返回该对象
if (obj.id === id) {
- // 返回匹配ID的模型
return obj
}
}
+ // 如果没有找到匹配的对象,返回null
return null
}
@@ -74,53 +94,83 @@ document.addEventListener('dblclick', function(event) {
// 如果有交点
if (intersects.length > 0) {
let obj = intersects[0]
+ // 使用Tween.js库实现相机位置平滑过渡
new TWEEN.Tween(camera.position).to(new THREE.Vector3((intersects[0].point.x + 0), (intersects[0].point.y + 500), (intersects[0].point.z - 500)), 500).start()
+ // 设置相机位置
camera.position.set((intersects[0].point.x + 0), (intersects[0].point.y + 500), (intersects[0].point.z - 500))
+ // 更新相机投影矩阵
camera.updateProjectionMatrix()
+ // 设置相机朝向
camera.lookAt((intersects[0].point.x + 0), (intersects[0].point.y + 500), (intersects[0].point.z - 500));
+ // 设置控制器目标点
controls.target = new THREE.Vector3(intersects[0].point.x, intersects[0].point.y, intersects[0].point.z)
+ // 更新控制器
controls.update()
+ // 渲染场景
renderer.render(scene, camera)
}
}, false)
// 动画函数
+/!**
+ * 异步动画函数,用于依次执行动画队列中的动画。
+ * @returns {Promise} 返回一个Promise对象,表示动画执行的完成状态。
+ *!/
const animation = async() => {
try {
+ // 如果动画队列中有动画
if (animationLine.length > 0) {
+ // 等待并执行队列中的第一个动画
await animationLine[0]()
+ // 移除已执行的动画
animationLine.shift()
+ // 如果队列中还有剩余动画
if (animationLine.length > 0) {
+ // 递归调用自身继续执行下一个动画
animation(animationLine)
} else {
+ // 如果队列为空,设置动画状态为false
isAnimation = false
}
}
} catch (e) {
+ // 捕获并打印异常信息
console.log(e)
}
}
// 动画循环
+/!**
+ * 动画函数,用于更新和渲染场景。
+ *!/
function animate() {
+ // 如果动画队列不为空且当前没有进行动画
if (animationLine.length > 0 && isAnimation === false) {
+ // 设置动画状态为进行中
isAnimation = true
+ // 开始执行动画
animation(animationLine)
}
+ // 请求下一帧的动画
requestAnimationFrame(animate)
+ // 更新TWEEN库中的动画状态
TWEEN.update()
+ // 渲染场景和相机
renderer.render(scene, camera)
+ // 渲染标签
labelRenderer.render(scene, camera)
}
animate()
+// 初始化变量a为0
let a = 0
-// 加载管理器
+// 加载管理器,用于管理资源加载过程
const loadingManager = new THREE.LoadingManager()
loadingManager.onLoad = function() {
+ // 当所有资源加载完成时,将isLoading设置为true
isLoading = true
}
@@ -142,33 +192,45 @@ scene.add(otherModel)
// 加载楼层1的模型
const loadF1 = (e) => {
+ // 遍历传入的模型名称数组
e.forEach(v => {
+ // 创建MTLLoader实例,用于加载材质文件
let mtlLoader = new MTLLoader()
- mtlLoader.load(`/model/${v}/${v}.mtl`,
+ // 加载材质文件
+ mtlLoader.load(`/model//.mtl`,
materials => {
+ // 预加载材质
materials.preload()
+ // 创建OBJLoader实例,并设置加载管理器和材质
let loader = new OBJLoader(loadingManager)
loader.setMaterials(materials)
+ // 加载OBJ模型文件
loader.load(
- `/model/${v}/${v}.obj`,
+ `/model//.obj`,
object => {
+ // 设置模型的名称
object.name = v
+ // 将模型添加到场景中
scene.add(object)
+ // 将模型添加到floor1Model对象中
floor1Model.add(object)
+ // 如果模型名称为'tishengji_keyidongbufen',则将其赋值给keyidongModel变量
if (v === 'tishengji_keyidongbufen') {
keyidongModel = object
}
+ // 如果模型名称为'tishengji_tuopan',则将其赋值给tuopanModel变量
if (v === 'tishengji_tuopan') {
tuopanModel = object
}
- // 更新渲染器
+ // 更新渲染器以显示新添加的模型
renderer.render(scene, camera)
},
xhr => {
-
+ // 处理加载过程中的进度事件(此处未实现)
},
(err) => {
+ // 如果加载出错,重新尝试加载模型
loadF([e])
}
)