页面集成
大约 2 分钟
页面集成
三维应用程序和其它页面集成可以使用iframe页面集成和组件集成方式,三维应用和其它系统集成尽量隔离开,不管是iframe集成方式还是组件代码集成方式,三维应用相关文件夹应独立出来,方便后期更新维护,即使整个三维目录替换,也不会影响原有工程文件。
注意
三维应用程序相对其它前端工程来讲,占用的文件空间较大,如使用git仓库管理代码,请注意三维程序部分占用的磁盘空间大小。
iframe集成
三维程序如果是独立编写,三维程序编写好后通常是一个独立的静态文件资源包,跟其它前端工程没有本质区别,此文件包可以复制到任何WEB容器位置,通过http
访问,因此可以视之为独立的网页。
iframe作为被集成方,和集成方的通信使用iframe的父子通信方式,可查询iframe父子通信方式
提示
iframe页面和父页面必须同一域名下,否则产生跨域问题。
- 父级页面监听消息
// 监听传来的message
window.addEventListener("message", (e)=> {
let {type, fromSource} = e.data;
if(type === "3d") {
switch (fromSource) {
case "3d-viewer":
actionViewerHandle(); // 在收到这个message的时候要触发的函数
break;
}
}
});
- iframe页面发送消息
window.parent.postMessage({type: "3d", fromSource: "3d-viewer"}, "*");
组件方式集成
组件方式集成,视三维应用为一个组件,以Vue
为例:
- 引擎资源包放到public目录下,如public/thing;
- 场景资源离线包也放到public下,如public/scenes/1001;
- 在views下创建一个组件
Viewer.vue
实现页面逻辑
<template>
<div class="container" id="container3d"></div>
</template>
<script>
// 安装 npm i popoload
import PL from "popoload";
import axios from "axios";
export default {
name: "Viewer3D",
mounted() {
this.loadThing();
},
beforeUnmounted() {
// 注销Viewer对象
if(window.viewer3d) {
window.viewer3d.destroy();
window.viewer3d = null;
}
},
methods: {
loadThing() {
PL({
libs: [
'./vt/libs/three.min.js',
'./vt/vt.min.js'
],
styles: [
'./vt/style/vt.css'
],
loaded: () => {
// 加载完成,执行三维程序逻辑
this.initViewer();
}
});
},
initViewer() {
// 请求应用场景配置文件
axios({
method: 'get',
url: "./scenes/1001/scene.json",
dataType: "json",
crossDomain: true,
cache: false
}).then(res => {
res.container = "#container3d";
{/* 初始化一个Viewer对象 */}
var viewer = new VT.Viewer(res);
// 全局属性挂接
window.viewer3d = viewer;
// 上一级组件loaded方法
this.$emit("loaded", viewer);
}).catch(error => {
reject(error)
})
}
}
}
</script>
<style>
html, body,
.container {
height: 100%;
padding: 0;
margin: 0;
}
</style>