热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于WEBGL架构的3D可视化平台—家居城3D展现

本文将模仿一个“欧派”,让人人深居简出在家里就能够越发直观平面的遴选家具。第一步,应用CampusBuilder搭建模仿场景。CampusBuilder的模子库有林林总总的模子,使

本文将模仿一个“欧派”,让人人深居简出在家里就能够越发直观平面的遴选家具。

第一步,应用CampusBuilder搭建模仿场景。CampusBuilder的模子库有林林总总的模子,使我们搭建出的场景更传神。运用CampusBuilde建立层级,以后再给层级加外立面就涌现了当前的结果。此次我们实在只是须要一个楼层,所以我们就把上次运用的过的场景拿来革新一下。概况移步:CampusBuilder3D场景制造东西

演示地点:EXAMPLE

《基于WEBGL架构的3D可视化平台—家居城3D展现》

/加载场景代码
var app = new THING.App({
// 场景地点
"url": "http://www.thingjs.com/./uploads/wechat/oLX7p05lsWJZUIxnIWsNXAzJ40X8/scene/家具城",
//背景设置
"skyBox": "BlueSky"
});

第二步,开启层级切换。由于我们模仿的“宜家”是某修建中的一层,所以这里要开启层级切换以便进入家具城。

app.on('load', function (ev) {
//开启层级切换
app.level.change(ev.campus);
});

同时给家具城建立一个广告牌,防备我们在第一人称下行走会“迷路”。贴图能够自行上传。

//建立广告牌
var advertisingSign = app.create({
type: 'Box',
width: 15.0, // 宽度
height: 5.0, // 高度
depth: 0.5, // 深度
widthSegments: 1.0, //宽度上的节数
heightSegments: 1.0, // 高度上的节数
depthSegments: 1.0, // 深度上的节数
center: 'Bottom', // 中心点
style: {
color: '#ffffff',
opacity: 2,
image: '/uploads/wechat/oLX7p05lsWJZUIxnIWsNXAzJ40X8/file/家具展销/欧派.jpg'
},
parent: app.query('building_01')[0],
});
advertisingSign.position = [50.957, 15.883, -16];

这里给我们给悉数场景用笼统物体围起来了,以避免第一人称控件开启时会构成无碰撞系统坠落出场景。记得要给他们组兼并命名为‘碰撞盒’,在场景加载完成后将他们“隐蔽”起来。

《基于WEBGL架构的3D可视化平台—家居城3D展现》

app.on('load', function (ev) {
//开启层级切换
app.level.change(ev.campus);
//将碰撞盒的透明度设置为0,而且将他们的pickable属性设置为false,不可被选中。
var crashBox = app.query('碰撞盒')[0];
crashBox.style.opacity = 0;
crashBox.pickable = false;
});

第三步,增加第一人称控件。

先建立两个按钮来掌握第一人称控件。

new THING.widget.Button('第一人称', add_control);
new THING.widget.Button('自在视角', remove_control);

增加第一人称控件

//第一人称组件
var ctrl = null;
function add_control() {
if (app.level.current.name == 'Campus') {
app.camera.position = [75.28812158204005, 1.8016147124541857, 29.699063489018236];
app.camera.target = [53.32909358623788, 4.541642332131091, -9.470748625431646];
}
if (app.level.current.name != 'Campus') {
app.level.change(app.query('新楼层')[0]);
app.camera.flyTo({
'position': [41.05650213795261, 1.3469938677565356, -18.6143831867287],
'target': [38.982251559488404, 0.7081383467333933, -23.867802267306008],
'time': 2000,
'complete': function () {
}
});
}
if (ctrl) return;
ctrl = app.addControl(
new THING.WalkControl({
walkSpeed: 0.02,
turnSpeed: 0.25,
gravity: 30,
eyeHeight: 1.7,
jumpSpeed: 0,
enableKeyRotate: false,
useCollision: true,//app.scene
useGravity: true,
groundObjects: [app.scene] //把悉数场景都增加,可把楼层或其他须要检测的增加进入碰撞系统里 | 默许值 园区地板
})
);
}

移除第一人称控件

function remove_control() {
if (!ctrl)
return;
app.removeControl(ctrl);
ctrl = null;
}

第四步,建立界面panel用于显现家居的详细信息。

增加界面

var panel = null;
function add_panel(title, total, goodsInfo) {
panel = new THING.widget.Panel({
titleText: '商品名称:' + title,
closeIcon: true, // 是不是有封闭按钮
dragable: false, // 是不是能够拖拽
retractable: true,
opacity: 0.9, // 透明度
hasTitle: true
});
panel.position = [1000, 0];
var dataObj = {
total: total,
goodsInfo: goodsInfo
};
var total = panel.addString(dataObj, 'total').caption('总价');
var goodsInfo = panel.addString(dataObj, 'goodsInfo').caption('商品引见');
}

移除界面

function remove_panel() {
if (panel) {
panel.destroy();
panel = null;
}
}

末了一步,为商品和大楼增加点击事宜。这里我们也要卸载双击事宜,由于鼠标双击时会聚焦当前物体,与我们的营业逻辑有争执所以这里给他卸载掉。首先是一般的点击事宜,鼠标左键点击时会涌现商品的信息。右键点击时,会移除第一人称控件。

//鼠标点击事宜
app.on('click', function (ev) {
if (ev.button == 2) {
remove_control();
return;
}
remove_panel();
switch (ev.object.name) {
case "桌椅组合1": add_panel('天然作风餐桌系列', "2598.00", "  简约的圆桌设想,微冷的当代居室围成一桌大天然的觉得。天然本性,简介的设想,彰显朴素、有用、少等于多的线代生涯哲学。");
break;
case "桌椅组合2": add_panel('线代都会餐桌系列', "2198.00", "  爽利线条,描写多少形底座。天然致简的浅木色橡木拼花,带有淡淡的手工白蜡处置惩罚,搭配内敛的深灰色线条,构成玄妙均衡,线代感呼之欲出。");
break;
case "桌椅组合3": add_panel('紧凑家庭餐桌系列', "1998.00", "  紧凑家庭餐厅,享四人围坐的宽适与舒服。精致的尺寸,圆融包涵的圆桌设想,即便是紧凑的客餐厅一体空间,也能欢乐小谈。");
break;
case "沙发组合1": add_panel('本性笔记组合沙发', "2598.00", "  简约的圆桌设想,微冷的当代居室围成一桌大天然的觉得。天然本性,简介的设想,彰显朴素、有用、少等于多的线代生涯哲学。");
break;
case "沙发组合2": add_panel('云海衰退组合沙发', "8888.00", "  百口人围坐的澹泊时刻,更多一份温馨。借一抹海天的蓝,再偷来云朵的舒软,只为百口围坐的时刻,尽享温馨怡然。");
break;
case "沙发组合3": add_panel('商务温馨组合沙发', "8598.00", "  简约的圆桌设想,微冷的当代居室围成一桌大天然的觉得。天然本性,简介的设想,彰显朴素、有用、少等于多的线代生涯哲学。");
break;
case "沙发组合4": add_panel('天然作风餐桌系列', "5508.00", "  简约的圆桌设想,微冷的当代居室围成一桌大天然的觉得。天然本性,简介的设想,彰显朴素、有用、少等于多的线代生涯哲学。");
break;
case "沙发组合5": add_panel('天然作风餐桌系列', "2578.00", "  简约的圆桌设想,微冷的当代居室围成一桌大天然的觉得。天然本性,简介的设想,彰显朴素、有用、少等于多的线代生涯哲学。");
break;
}
});
app.off('dblclick');

代码块 => 层级 => 触发 => 修正进入层级操纵

《基于WEBGL架构的3D可视化平台—家居城3D展现》

这里我们将进入层级的操纵改成直接进入我们的家具城这一层“新楼层”。

//修正singleClick点击以后进入级的操纵
app.on(THING.EventType.SingleClick, function (ev) {
var object = ev.object;
if (object.name == "building_01") {
app.level.change(app.query('新楼层')[0]);
app.camera.flyTo({
'position': [41.05650213795261, 1.3469938677565356, -18.6143831867287],
'target': [38.982251559488404, 0.7081383467333933, -23.867802267306008],
'time': 2000,
complete: function () {
console.log("我已进来了" + app.level.current.name);
}
});
}
return;
}, 'customLevelEnterMethod');

小结:

第一人称控件的题目,Campus => 新楼层 ,假如不设置摄像机飞到一合理位置,摄像机将离开楼层,由于进入楼层的时刻摄像机的默许位置不在楼层上,所以每次在楼层内增加第一人称控件时我们必需要将摄像机放到一个合理的位置。

悉数代码

//加载场景代码
var app = new THING.App({
// 场景地点
"url": "http://www.thingjs.com/./uploads/wechat/oLX7p05lsWJZUIxnIWsNXAzJ40X8/scene/家具城",
//背景设置
"skyBox": "BlueSky"
});
app.on('load', function (ev) {
app.level.change(ev.campus);
var crashBox = app.query('碰撞盒')[0];
crashBox.style.opacity = 0;
crashBox.pickable = false;
new THING.widget.Button('第一人称', add_control);
new THING.widget.Button('自在视角', remove_control);
});
//修正singleClick点击以后进入级的操纵
app.on(THING.EventType.SingleClick, function (ev) {
var object = ev.object;
if (object.name == "building_01") {
app.level.change(app.query('新楼层')[0]);
app.camera.flyTo({
'position': [41.05650213795261, 1.3469938677565356, -18.6143831867287],
'target': [38.982251559488404, 0.7081383467333933, -23.867802267306008],
'time': 2000,
complete: function () {
console.log("我已进来了" + app.level.current.name);
}
});
}
return;
}, 'customLevelEnterMethod');
//鼠标点击事宜
app.on('click', function (ev) {
if (ev.button == 2) {
remove_control();
}
if (typeof (ev.object) == undefined)
return;
remove_panel();
switch (ev.object.name) {
case "桌椅组合1": add_panel('天然作风餐桌系列', "2598.00", "  简约的圆桌设想,微冷的当代居室围成一桌大天然的觉得。天然本性,简介的设想,彰显朴素、有用、少等于多的线代生涯哲学。");
break;
case "桌椅组合2": add_panel('线代都会餐桌系列', "2198.00", "  爽利线条,描写多少形底座。天然致简的浅木色橡木拼花,带有淡淡的手工白蜡处置惩罚,搭配内敛的深灰色线条,构成玄妙均衡,线代感呼之欲出。");
break;
case "桌椅组合3": add_panel('紧凑家庭餐桌系列', "1998.00", "  紧凑家庭餐厅,享四人围坐的宽适与舒服。精致的尺寸,圆融包涵的圆桌设想,即便是紧凑的客餐厅一体空间,也能欢乐小谈。");
break;
case "沙发组合1": add_panel('本性笔记组合沙发', "2598.00", "  简约的圆桌设想,微冷的当代居室围成一桌大天然的觉得。天然本性,简介的设想,彰显朴素、有用、少等于多的线代生涯哲学。");
break;
case "沙发组合2": add_panel('云海衰退组合沙发', "8888.00", "  百口人围坐的澹泊时刻,更多一份温馨。借一抹海天的蓝,再偷来云朵的舒软,只为百口围坐的时刻,尽享温馨怡然。");
break;
case "沙发组合3": add_panel('商务温馨组合沙发', "8598.00", "  简约的圆桌设想,微冷的当代居室围成一桌大天然的觉得。天然本性,简介的设想,彰显朴素、有用、少等于多的线代生涯哲学。");
break;
case "沙发组合4": add_panel('天然作风餐桌系列', "5508.00", "  简约的圆桌设想,微冷的当代居室围成一桌大天然的觉得。天然本性,简介的设想,彰显朴素、有用、少等于多的线代生涯哲学。");
break;
case "沙发组合5": add_panel('天然作风餐桌系列', "2578.00", "  简约的圆桌设想,微冷的当代居室围成一桌大天然的觉得。天然本性,简介的设想,彰显朴素、有用、少等于多的线代生涯哲学。");
break;
}
});
//卸载双击事宜
app.off('dblclick');
// 界面组件
var panel = null;
function add_panel(title, total, goodsInfo) {
panel = new THING.widget.Panel({
titleText: '商品名称:' + title,
closeIcon: true, // 是不是有封闭按钮
dragable: false, // 是不是能够拖拽
retractable: true,
opacity: 0.9, // 透明度
hasTitle: true
});
panel.position = [1000, 0];
var dataObj = {
total: total,
goodsInfo: goodsInfo
};
var total = panel.addString(dataObj, 'total').caption('总价');
var goodsInfo = panel.addString(dataObj, 'goodsInfo').caption('商品引见');
}
function remove_panel() {
if (panel) {
panel.destroy();
panel = null;
}
}
//建立广告牌
var advertisingSign = app.create({
type: 'Box',
width: 15.0, // 宽度
height: 5.0, // 高度
depth: 0.5, // 深度
widthSegments: 1.0, //宽度上的节数
heightSegments: 1.0, // 高度上的节数
depthSegments: 1.0, // 深度上的节数
center: 'Bottom', // 中心点
style: {
color: '#ffffff',
opacity: 2,
image: '/uploads/wechat/oLX7p05lsWJZUIxnIWsNXAzJ40X8/file/家具展销/欧派.jpg'
},
parent: app.query('building_01')[0],
});
advertisingSign.position = [50.957, 15.883, -16];
//第一人称组件
var ctrl = null;
function add_control() {
if (app.level.current.name == 'Campus') {
app.camera.position = [75.28812158204005, 1.8016147124541857, 29.699063489018236];
app.camera.target = [53.32909358623788, 4.541642332131091, -9.470748625431646];
}
if (app.level.current.name != 'Campus') {
app.level.change(app.query('新楼层')[0]);
app.camera.flyTo({
'position': [41.05650213795261, 1.3469938677565356, -18.6143831867287],
'target': [38.982251559488404, 0.7081383467333933, -23.867802267306008],
'time': 2000,
'complete': function () {
}
});
}
if (ctrl) return;
ctrl = app.addControl(
new THING.WalkControl({
walkSpeed: 0.02,
turnSpeed: 0.25,
gravity: 30,
eyeHeight: 1.7,
jumpSpeed: 0,
enableKeyRotate: false,
useCollision: true,//app.scene
useGravity: true,
groundObjects: [app.scene] //把悉数场景都增加,可把楼层或其他须要检测的增加进入碰撞系统里 | 默许值 园区地板
})
);
}
function remove_control() {
if (!ctrl)
return;
app.removeControl(ctrl);
ctrl = null;
}

推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
author-avatar
minimiai_559
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有