分享
查看: 3000|回复: 0

[发布] ThingJS3DMarker标记在可视化场景中的使用

[复制链接]

ThingJS3DMarker标记在可视化场景中的使用

发表于 2019-8-28 10:18:11 来自 发布 阅读模式 倒序浏览
zzv_icon3000 zzr_icon0 查看全部

总结一下ThingJS的常用Marker使用及不同类型之间的区别

Marker 是3D场景内的标记,往往用于顶牌,可以传入div, image或canvas写文字,可以拾取、跟随物体、和物体一并删除

1.UI界面

UI界面,直接采用dom元素做界面,主要职责是要更新位置,根本就没有新THREE的Object产生,完全是同步;

效果图

ThingJS3DMarker标记在可视化场景中的使用

实现代码如下:

HTML部分

  1. <!-- 3D场景容器 -->
  2. <div id="div3d">
  3. <!-- UI界面 -->
  4. <div id="buildMarker" class="loadview">
  5. <img src="img/normalLocation.png" alt="定位图标">
  6. <span class="buildName"></span>
  7. </div>
  8. </div
复制代码

注释:html代码部分,需要创建一个3D场景容器,UI类型的3D界面,是可以用html代码编写的。

JS部分

  1. //3D场景加载
  2. var app = new THING.App({
  3. container: 'div3d',
  4. url: 'https://www.thingjs.com/static/models/storehouse',
  5. skyBox: 'BlueSky'
  6. });
  7. // 创建elem元素
  8. function create_element(id) {
  9. var srcElem = document.getElementById(id);
  10. var newElem = srcElem.cloneNode(true);
  11. newElem.style.display = "block";
  12. app.domElement.insertBefore(newElem, srcElem);
  13. return newElem;
  14. }
  15. //场景加载
  16. app.on('load', function () {
  17. app.buildings.forEach(build => {
  18. //创建UI界面
  19. var marker = app.create({
  20. type: "UI",
  21. offset: [0, 5, 0],
  22. size: 4,
  23. parent: build,
  24. pivot: [0.5, 1],
  25. el: create_element('buildMarker')
  26. });
  27. $('#buildMarker .buildName').text(build.type);
  28. })
  29. });
复制代码

注释:首先要加载3D场景,然后创建UI界面

属性解析:pivot是UI界面的特殊属性,可以设置UI界面在场景中的重心,

el属性,绑定dom元素

type类型,设置成UI

注意:UI界面在3D场景中,不会跟随场景的缩放而改变自身的尺寸,所以不太适合做顶牌使用。

2.Marker标记,type类型设置成Marker

1>HTML的Marker

效果图

ThingJS3DMarker标记在可视化场景中的使用

html代码

  1. <!-- 3D场景容器 -->
  2. <div id="div3d"></div>
  3. <!-- 3D场景建筑顶marker -->
  4. <div id="buildMarker" class="loadview">
  5. <img src="img/normalLocation.png" alt="定位图标">
  6. <span class="buildName"></span>
  7. </div>
复制代码

JavaScript代码

  1. //3D场景加载
  2. app = new THING.App({
  3. container: 'div3d',
  4. url: 'https://www.thingjs.com/static/models/storehouse',
  5. skyBox: 'BlueSky'
  6. });
  7. //场景加载
  8. app.on('load', function (ev) {
  9. var buildings = app.buildings;
  10. buildings.forEach(function (building) {
  11. $('#buildMarker .buildName').text('建筑ID:' + building.id);
  12. // 创建Marker
  13. var buildingMarker = app.create({
  14. type: "Marker",
  15. offset: [0, 5, 0],
  16. size: 4,
  17. parent: building,
  18. element: document.getElementById('buildMarker'),
  19. });
  20. })
  21. });
复制代码

属性分析:element:挂架dom元素

parent:设定marker的父类

注意:可插入dom元素的marker,可以根据domElement属性,获取挂架的 DOM 元素,动态控制dom元素


2>image的marker

效果图

ThingJS3DMarker标记在可视化场景中的使用

JS代码

  1. //场景加载
  2. app.on('load', function () {
  3. app.buildings.forEach(build => {
  4. var marker2 = app.create({
  5. type: "Marker",
  6. offset: [0, 3, 0],
  7. size: 2,
  8. url: "https://thingjs.com/static/images/reminder.png",
  9. parent: build
  10. })
  11. })
  12. });
复制代码


3>canvas的Marker

ThingJS3DMarker标记在可视化场景中的使用

JS代码

  1. //创建marker
  2. app.buildings.forEach(build => {
  3. var marker2 = app.create({
  4. type: "Marker",
  5. offset: [0, 3, 0],
  6. size: 8,
  7. canvas: createTextCanvas('建筑:' + build.id),
  8. parent: build
  9. })
  10. })
  11. });
  12. // 绘制canvas
  13. function createTextCanvas(text) {
  14. let width = text.length * 48;
  15. let canvas = document.createElement("canvas");
  16. canvas.width = width;
  17. canvas.height = 120;
  18. const ctx = canvas.getContext("2d");
  19. ctx.fillStyle = "rgba(0,0,0,0.3)";
  20. ctx.fillRect(0,0,width,50);
  21. ctx.fill();
  22. ctx.font = "46px 微软雅黑";
  23. ctx.fillStyle = '#fff';
  24. ctx.textAlign = "center";
  25. ctx.textBaseline = "middle";
  26. ctx.fillText(text, width/2, 25);
  27. return canvas;
  28. }
复制代码

属性解析:canvas:传入绘制好的图形

注释:canvas类型的marker,目前不支持绘制时插入图片

UI界面与Marker的区别

相同点:都可以跟随场景的转动,内容朝向屏幕

不同点:UI界面,在场景缩放的时,不能同时改变自身的尺寸,Marker可以跟随场景缩放而改变自身的尺寸


avatar
游客~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

130700ppkpl8x3t7tt1b1t