总结一下ThingJS的常用Marker使用及不同类型之间的区别 Marker 是3D场景内的标记,往往用于顶牌,可以传入div, image或canvas写文字,可以拾取、跟随物体、和物体一并删除 1.UI界面 UI界面,直接采用dom元素做界面,主要职责是要更新位置,根本就没有新THREE的Object产生,完全是同步; 效果图 实现代码如下: HTML部分 - <!-- 3D场景容器 -->
- <div id="div3d">
- <!-- UI界面 -->
- <div id="buildMarker" class="loadview">
- <img src="img/normalLocation.png" alt="定位图标">
- <span class="buildName"></span>
- </div>
- </div
复制代码注释:html代码部分,需要创建一个3D场景容器,UI类型的3D界面,是可以用html代码编写的。 JS部分 - //3D场景加载
- var app = new THING.App({
- container: 'div3d',
- url: 'https://www.thingjs.com/static/models/storehouse',
- skyBox: 'BlueSky'
- });
- // 创建elem元素
- function create_element(id) {
- var srcElem = document.getElementById(id);
- var newElem = srcElem.cloneNode(true);
- newElem.style.display = "block";
- app.domElement.insertBefore(newElem, srcElem);
- return newElem;
- }
- //场景加载
- app.on('load', function () {
- app.buildings.forEach(build => {
- //创建UI界面
- var marker = app.create({
- type: "UI",
- offset: [0, 5, 0],
- size: 4,
- parent: build,
- pivot: [0.5, 1],
- el: create_element('buildMarker')
- });
- $('#buildMarker .buildName').text(build.type);
- })
- });
复制代码注释:首先要加载3D场景,然后创建UI界面 属性解析:pivot是UI界面的特殊属性,可以设置UI界面在场景中的重心, el属性,绑定dom元素 type类型,设置成UI 注意:UI界面在3D场景中,不会跟随场景的缩放而改变自身的尺寸,所以不太适合做顶牌使用。 2.Marker标记,type类型设置成Marker 1>HTML的Marker 效果图 html代码 - <!-- 3D场景容器 -->
- <div id="div3d"></div>
- <!-- 3D场景建筑顶marker -->
- <div id="buildMarker" class="loadview">
- <img src="img/normalLocation.png" alt="定位图标">
- <span class="buildName"></span>
- </div>
复制代码JavaScript代码 - //3D场景加载
- app = new THING.App({
- container: 'div3d',
- url: 'https://www.thingjs.com/static/models/storehouse',
- skyBox: 'BlueSky'
- });
- //场景加载
- app.on('load', function (ev) {
- var buildings = app.buildings;
- buildings.forEach(function (building) {
- $('#buildMarker .buildName').text('建筑ID:' + building.id);
- // 创建Marker
- var buildingMarker = app.create({
- type: "Marker",
- offset: [0, 5, 0],
- size: 4,
- parent: building,
- element: document.getElementById('buildMarker'),
- });
- })
- });
复制代码属性分析:element:挂架dom元素 parent:设定marker的父类 注意:可插入dom元素的marker,可以根据domElement属性,获取挂架的 DOM 元素,动态控制dom元素
2>image的marker 效果图 JS代码 - //场景加载
- app.on('load', function () {
- app.buildings.forEach(build => {
- var marker2 = app.create({
- type: "Marker",
- offset: [0, 3, 0],
- size: 2,
- url: "https://thingjs.com/static/images/reminder.png",
- parent: build
- })
- })
- });
复制代码
3>canvas的Marker
JS代码 - //创建marker
- app.buildings.forEach(build => {
- var marker2 = app.create({
- type: "Marker",
- offset: [0, 3, 0],
- size: 8,
- canvas: createTextCanvas('建筑:' + build.id),
- parent: build
- })
- })
- });
- // 绘制canvas
- function createTextCanvas(text) {
- let width = text.length * 48;
- let canvas = document.createElement("canvas");
- canvas.width = width;
- canvas.height = 120;
- const ctx = canvas.getContext("2d");
- ctx.fillStyle = "rgba(0,0,0,0.3)";
- ctx.fillRect(0,0,width,50);
- ctx.fill();
- ctx.font = "46px 微软雅黑";
- ctx.fillStyle = '#fff';
- ctx.textAlign = "center";
- ctx.textBaseline = "middle";
- ctx.fillText(text, width/2, 25);
- return canvas;
- }
复制代码属性解析:canvas:传入绘制好的图形 注释:canvas类型的marker,目前不支持绘制时插入图片 UI界面与Marker的区别 相同点:都可以跟随场景的转动,内容朝向屏幕 不同点:UI界面,在场景缩放的时,不能同时改变自身的尺寸,Marker可以跟随场景缩放而改变自身的尺寸
|