3D开发平台哪个更好操作?

178 阅读3分钟

3D开发搞技术的朋友一定不陌生,做一个3D可视化应用那是相当有面子的,这不仅考验工程师的技术,还能丰富自己的3D开发经验。我们都知道3D开发平台有那么几个平台是最常用的,thingjs、threejs、cesium等等,到底哪个3D开发平台更好使用,更好操作呢?一起来了解一下吧!

在线调试

ThingJS 在线开发环境中可以通过在代码里加入 “debugger” 关键字进行调试,调试步骤如下:

在代码中加入 “debugger” 关键字

F12 打开浏览器控制台

点击按钮运行代码

在浏览器控制台中查看断点位置

F12 调试

和普通页面调试方法一样,直接打开 F12 在 Sources 里 找到 debug.js文件,在里面打断点即可调试,调试步骤如下:

F12键调出浏览器控制台可以查看在线开发环境相关信息

点击选择“Sources - Page”

选择Top目录下的ifId(about:blank) - (no - domain -debug.js)

在浏览器控制台的debug.js文件点击断点行数

点击在线开发工具栏“执行项目”图标

/**

* 说明:通过请求数据 动态创建柜子中的书

*/

var app = new THING.App({

url: 'https://www.thingjs.com/static/models/storehouse' // 场景地址

});

// 请求书籍数据的url

var url = 'https://www.thingjs.com/static/data/books.json';

// 书籍的物体面板

var panel;

app.on('load', function (ev) {

// 开启层级切换

app.level.change(ev.campus);

// 获取目标书柜

var cabinetSelector = app.query('cabinetB4')[0];

// 点击按钮到目标书柜

new THING.widget.Button('目标书柜', function () {

app.level.change(cabinetSelector);

});

// 进入物体层级效果

cabinetSelector.on(THING.EventType.EnterLevel, function (ev) {

// 当前进入层级的物体(书柜)

var object = ev.object;

// 上一层级的物体

var preObject = ev.previous;

// 如果当前层级物体的父亲是上一层级(即正向进入)

if (object.parent === preObject) {

console.log("从楼层进入了书柜");

object.playAnimation('OpenDoor');

// 如果书柜没有创建书籍 则请求数据 创建书籍

if (!object._isAlreadyCreateBooks) {

getBooksData(object);

}

}

}, 'customEnter');

// 设置退出层级效果

cabinetSelector.on(THING.EventType.LeaveLevel, function (ev) {

// 退出层级的物体(书柜)

var object = ev.object;

// 退出后的层级物体

var curObject = ev.current;

// 如果所退出层级物体的父亲是 退出后的层级(即正向退出)

if (object.parent === curObject) {

console.log("退出书柜进入楼层");

object.playAnimation('CloseDoor');

destroyBooks();

object._isAlreadyCreateBooks = false;

}

}, 'customLeave');

});

// 获取JSON数据

function getBooksData(obj) {

$.ajax({

type: "get",

url: url,

dataType: "json",

success: function (data) {

createBooks(data, obj);

}

});

}

function createBooks(data, parent) {

var books = data.books;

var cabinetInfo = data.cabinetInfo;

var cabinetInfoOffsetX = cabinetInfo.offsetX;

var cabinetInfoOffsetY = cabinetInfo.offsetY;

// 按书架每一层 整理数据

// 结果形如

/*

{

"1":[{"name":"C++","row":1,"column":1,"width":10},{"name":"Java","row":1,"column":2,"width":14},......],

"2":[{"name":"js","row":2,"column":1,"width":5},......],

"3":[{"name":"js","row":3,"column":1,"width":5},......]

}

*/

var booksMap = processData(books);

for (var row in booksMap) {

var arr = booksMap[row];

var offsetX = 0;

var sum = 0;

for (var i = 0; i < arr.length; i++) {

var book = arr[i];

var name = book.name;

// 行

var row = book.row;

var width = book.width / 100;

sum += width;

offsetX = sum - width / 2;

// 创建Box 模拟书籍 (书籍的父亲是书柜 并根据相对坐标创建)

var objBook = app.create({

type: 'Box',

width: width, // 宽度 (书籍厚度)

height: 0.2, // 高度

depth: 0.15, // 深度

center: 'Bottom', // 中心点

parent: parent,

localPosition: [offsetX - cabinetInfoOffsetX[row - 1], cabinetInfoOffsetY[row - 1], 0]

});

objBook.userData['书名'] = name;

objBook.userData['物体类型'] = '书';

objBook.style.color = THING.Math.randomColor();

objBook.on(THING.EventType.SingleClick, function (ev) {

// 如果单击获取的物体不在当前选择集中

if (!app.selection.has(ev.object)) {

app.selection.clear();

app.selection.select(ev.object);

}

})

objBook.on(THING.EventType.Select, function (ev) {

var book = ev.object;

// 创建物体面板

createPanel(book);

});

objBook.on(THING.EventType.Deselect, function (ev) {

// 删除物体面板

destroyPanel();

});

}

}

parent._isAlreadyCreateBooks = true;

}

function destroyBooks() {

var books = app.query('["userData/物体类型"="书"]');

books.destroy();

destroyPanel();

}

app.on(THING.EventType.SingleClick, function (ev) {

if (!ev.picked || !app.selection.has(ev.object)) {

app.selection.clear();

}

}, '单击其他清空选择集');

function createPanel(obj) {

if (panel) return;

panel = new THING.widget.Panel({

titleText: '基本信息',

hasTitle: true,

position: [5, 50]

});

panel.addString(obj.userData, "书名").caption("书名");

}

// 删除面板

function destroyPanel() {

if (panel) {

panel.destroy();

panel = null;

}

}

// 数据处理

function processData(books) {

var booksMap = {};

for (var i = 0; i < books.length; i++) {

var book = books[i];

// 按每一行 整理数据

var row = book.row;

if (!booksMap[row]) {

booksMap[row] = [];

}

booksMap[row].push(book);

}

return booksMap;

}