3D开发平台哪个更好操作?
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;
}