在上一篇《基于HT for Web矢量实现2D叶轮旋转》中讲述了叶轮旋转在2D拓扑上的应用,今天我们就来讲讲叶轮旋转在3D上的应用。

在3D拓扑上可以创建各种各样的图元,在HT for Web系统中提供了一些常规的3D模型,但是对于那些比较复杂的模型,比如汽车、人物等模型就无能为力了,那再项目中需要用到这样的模型该肿么办呢?这时候就需要借助专业的3ds Max工具来建模了,然后通过3ds Max工具将模型导出成obj文件,然后再项目中引用导出的obj文件,这样就能成功的使用上复杂的图元了。

在《HT图形组件设计之道(四)》一文中有提及HT for Web引入obj文件的介绍,在这里我就不做重复介绍了,我们先来看看今天作为演示的Demo模型长什么样:

http://www.hightopo.com/guide/guide/plugin/obj/ht-obj-guide.html

嘿嘿,是不是感觉今天的模型有些大材小用了,没办法,怪只怪自己不懂3ds Max工具,只能先用这个大家熟悉的模型来做Demo演示了。

首先我们需要有3ds Max工具将模型导出成obj及mtl文件,然后调用HT for Web的ht.Default.loadObj()方法读取并解析模型文件,在解析完成后,通过调用ht.Default.setShape3dModel()方法将模型注册到系统中,如此在后续的代码中就能够应用到该模型了,模型文件的读取及注册具体代码如下:

ht.Default.loadObj('plane.obj', 'plane.mtl', {                    center: true,r3: [0, -Math.PI/2, 0], // make plane face rights3: [0.15, 0.15, 0.15], // make plane smallerfinishFunc: function(modelMap, array, rawS3){if(modelMap){  ht.Default.setShape3dModel('plane', array);var plane = new ht.Node();plane.s3(rawS3);plane.s({'shape3d': 'plane','shape3d.scaleable': false,'wf.visible': true,'wf.color': 'white','wf.short': true});dataModel.add(plane);}}
});

注册完3D模型后,我们马上创建了一个3D图元,并将其添加到了dataModel容器中,这时我们需要一个3D拓扑来显示这个3D图元,具体的创建代码如下:

var dataModel = new ht.DataModel();
var g3d = new ht.graph3d.Graph3dView(dataModel);
g3d.setEye(200, 50, 300);
g3d.setDashDisabled(false);
g3d.getView().style.background = '#4C7BBB';
g3d.addToDOM();

在3D拓扑上做了些简单的属性设置,让拓扑看起来舒服些,如此我们就可以看到我们创建出来的飞机模型到底长什么样了

怎么样,创建一个复杂模型好像并没有想象中的复杂(复杂的东西都让美工做完了)。

我们仔细观察飞机会发现,飞机前面的螺旋桨颜色和机身一样,一眼看去不太容易注意到它的存在,那能否将其颜色改掉呢?我们可以查看下mtl文件,看飞机的螺旋桨是否分离机身独立成一个材质,mtl文件的内容如下:

newmtl bodyNs 10.0000Ni 1.5000d 1.0000Tr 0.0000Tf 1.0000 1.0000 1.0000 illum 2Ka 0.3608 0.4353 0.2549Kd 0.3608 0.4353 0.2549Ks 0.0000 0.0000 0.0000Ke 0.0000 0.0000 0.0000newmtl propellerNs 10.0000Ni 1.5000d 1.0000Tr 0.0000Tf 1.0000 1.0000 1.0000 illum 2Ka 0.3608 0.4353 0.2549Kd 0.3608 0.4353 0.2549Ks 0.0000 0.0000 0.0000Ke 0.0000 0.0000 0.0000

正如我们所想,飞机模型的机身和螺旋桨是分开了两个独立的材质,并将螺旋桨的材质名字定义为propeller,因此我们可以独立控制机身及螺旋桨,那么我们就来修改下螺旋桨的颜色吧,在loadObj()方法中的finishFunc回调函数中添加上如下代码即可:

modelMap.propeller.s3 = [1, 1.2, 1.2];
modelMap.propeller.color = ‘yellow';

在代码中,我们不仅改变了螺旋桨的颜色,我们还对螺旋桨做了缩放处理,令螺旋桨的宽度和长度变大一点。

到这里,模型就算完成了,接下来要做的就是让螺旋桨动起来,和2D叶轮旋转类似,在3D模型上也可以做数据绑定,要想让螺旋桨旋转起来,我们就需要设置螺旋桨的rotation属性,和3D上的图元不同的是,设置3D图元的rotation属性需要设置一个数组,定义3D上三个方向的旋转值。

我们先来尝试下让螺旋桨沿着x轴旋转45度试下:

modelMap.propeller.r3 = [Math.PI / 4, 0, 0];

果然可以,那么接下来我们就可以为螺旋桨的rotation属性做数据绑定的处理了:

modelMap.propeller.r3 = {func: function(data){return [data.a('angle'), 0, 0];}
};

我们将螺旋桨的x轴上的旋转角度绑定到图元的angle自定义属性上,我们可以通过改变angle属性值令螺旋桨沿着x轴转动起来,那么接下来我们就通过定时器来动态改变angle属性吧,看看螺旋桨是不是真的可以动起来:

window.setInterval(function() {var rotation = plane.a('angle') + Math.PI / 10;if (rotation > Math.PI * 2) {rotation -= Math.PI * 2;}plane.a('angle', rotation);
}, 40);

螺旋桨果然动起来了,这个定时器让螺旋桨做匀速运动,但是飞机的螺旋桨在起飞和降落的时候其旋转速度都不是匀速,我们要模拟飞机起飞和降落时螺旋桨的旋转速度该如何处理呢?这个时候我们可以考虑用HT for Web中的动画来解决这个问题,关于动画的内容由于比较复杂,在这里就不深入探讨,等以后有机会再和大家分享动画的相关内容,今天就先讲诉下动画的基本用法,简单实现螺旋桨模拟起飞和降落的效果,具体的代码如下:

var params = {delay: 1500,duration: 20000,easing: function(t){return (t *= 2) < 1 ? 0.5 * t * t : 0.5 * (1 - (--t) * (t - 2));},action: function(v, t){plane.a('angle', v*Math.PI*120);},finishFunc: function(){ht.Default.startAnim(params);}
};ht.Default.startAnim(params);

我们来分析下代码:

1. delay属性:定义动画播放前的停顿时间;

2. duration属性:定义动画持续时间;

3. easing函数:定义动画缓动函数;

4. action函数:action函数必须提供,实现动画过程中的属性变化,在这里设置angle属性;

5. finishFunc函数:动画结束后调用的函数,在这里又启动了动画,让螺旋桨不断的旋转。

运行代码,你会发现螺旋桨在1.5秒后进入旋转状态,并且旋转速度由慢变快,再变慢直至停止,然后再过1.5秒后继续旋转,如此周而复始。

好了,今天的内容到这里就结束了,整个Demo的运行效果可以通过下面的视频查看,最后再附上本次Demo的所有代码。

http://v.youku.com/v_show/id_XMTI5NDI5MzYyOA==.html

<!DOCTYPE html>
<html><head><title>HT for Web - Plane</title><meta charset="UTF-8" name="viewport" content="user-scalable=yes, width=600"><script src="../../../build/ht-debug.js"></script><script src="../../../build/ht-obj-debug.js"></script><script>function init(){var dataModel = new ht.DataModel();var g3d = new ht.graph3d.Graph3dView(dataModel);g3d.setEye(200, 50, 300);g3d.setDashDisabled(false);g3d.getView().style.background = '#4C7BBB';g3d.addToDOM();ht.Default.loadObj('plane.obj', 'plane.mtl', {center: true,r3: [0, -Math.PI/2, 0], // make plane face rights3: [0.15, 0.15, 0.15], // make plane smallerfinishFunc: function(modelMap, array, rawS3){if(modelMap){modelMap.propeller.r3 = {func: function(data){return [data.a('angle'), 0, 0];}};// make propeller a litter biggermodelMap.propeller.s3 = [1, 1.2, 1.2];modelMap.propeller.color = 'yellow';ht.Default.setShape3dModel('plane', array);var plane = new ht.Node();plane.s3(rawS3);plane.s({'shape3d': 'plane','shape3d.scaleable': false,'wf.visible': true,'wf.color': 'white','wf.short': true});dataModel.add(plane);var params = {delay: 1500,duration: 20000,easing: function(t){return (t *= 2) < 1 ? 0.5 * t * t : 0.5 * (1 - (--t) * (t - 2));},action: function(v, t){plane.a('angle', v*Math.PI*120);},finishFunc: function(){ht.Default.startAnim(params);}};ht.Default.startAnim(params);/*window.setInterval(function() {var rotation = plane.a('angle') + Math.PI / 10;if (rotation > Math.PI * 2) {rotation -= Math.PI * 2;}plane.a('angle', rotation);}, 40);*/}}});}</script></head><body οnlοad="init();">                         </body>
</html>

基于HTML5 WebGL实现3D飞机叶轮旋转相关推荐

  1. c#web页面显示弹窗_基于 HTML5 WebGL 的 3D 风机 Web 组态工业互联网应用

    前言 在目前大数据时代背景之下,数据可视化的需求也变得越来越庞大,在数据可视化的背景之下,通过智能机器间的链接并最终将人机链接,结合软件和大数据分析的工业互联网也将变得越来越容易实现! 国家也敏锐意识 ...

  2. html5 光影效果,基于 HTML5 WebGL 的 3D 场景中的灯光效果

    原标题:基于 HTML5 WebGL 的 3D 场景中的灯光效果 构建 3D 的场景除了创建模型,对模型设置颜色和贴图外,还需要有灯光的效果才能更逼真的反映真实世界的场景.这个例子我觉得既美观又代表性 ...

  3. 基于 HTML5 WebGL 的 3D 服务器与客户端的通信

    这个例子的初衷是模拟服务器与客户端的通信,我把整个需求简化变成了今天的这个例子.3D 机房方面的模拟一般都是需要鹰眼来辅助的,这样找产品以及整个空间的概括会比较明确,在这个例子中我也加了,这篇文章就算 ...

  4. 基于 HTML5 WebGL 的 3D 智慧隧道漫游巡检

    前言 这次为大家展示的是通过 HT for Web 灵活的图型化编辑工具打造的智慧隧道监控系统.通过 HTML5 技术实现了桌面和移动端的跨平台性,同时现实了可视化运维. 这次主要跟大家分享里面的漫游 ...

  5. 基于 HTML5 WebGL 的 3D 工控裙房系统

    前言 工业物联网在中国的发展如火如荼,网络基础设施建设,以及工业升级的迫切需要都为工业物联网发展提供了很大的机遇.中国工业物联网企业目前呈现两种发展形式并存状况:一方面是大型通讯.IT企业的布局:一方 ...

  6. 基于 HTML5 WebGL 的 3D 场景中的灯光效果

    2019独角兽企业重金招聘Python工程师标准>>> 构建 3D 的场景除了创建模型,对模型设置颜色和贴图外,还需要有灯光的效果才能更逼真的反映真实世界的场景.这个例子我觉得既美观 ...

  7. 基于 HTML5 WebGL 的 3D 机房

    前言 用 WebGL 渲染的 3D 机房现在也不是什么新鲜事儿了,这篇文章的主要目的是说明一下,3D 机房中的 eye 和 center 的问题,刚好在项目中用上了,好生思考了一番,最终觉得这个例子最 ...

  8. 基于 HTML5 WebGL 的 3D 网络拓扑结构图

    现在,3D 模型已经用于各种不同的领域.在医疗行业使用它们制作器官的精确模型:电影行业将它们用于活动的人物.物体以及现实电影:视频游戏产业将它们作为计算机与视频游戏中的资源:在科学领域将它们作为化合物 ...

  9. html 灯光效果,基于 HTML5 WebGL 的 3D 场景中的灯光效果

    场景搭建 整个场景中包括 2D 场景(也就是鹰眼部分)以及 3D 场景: dm = new ht.DataModel(); g3d = new ht.graph3d.Graph3dView(dm); ...

最新文章

  1. 以太网帧,ARP报文
  2. MySQL用户管理、常用SQL语句、MySQL数据库备份恢复
  3. cos66度20分怎么用计算机算,物化2期末考试计算复习题
  4. oracle数据库全数据库名,Oracle数据库中的 数据库域名、数据库名、全局数据库名、SID、数据库实例名、服务名 解释...
  5. linux的bash脚本
  6. 1054. 求平均值
  7. Docker Consul Fabio ASP.NET Core 2.0 微服务跨平台实践
  8. Node.js 11.14.0 发布,服务器端的 JavaScript 运行环境
  9. 苹果cms内核H5网页漫画小说系统源码支持三级分销与对接公众号
  10. python 编辑excel需要什么包,python操作excel的包(openpyxl、xlsxwriter)
  11. 河南自考本科英语可用计算机代替,河南自考选考2至3门专业课可代替英语课程...
  12. PowerApps 中的 Filter、Search 和 LookUp 函数
  13. android客户端跟服务器交换数据,Android客户端和服务器端数据交互的第一种方法...
  14. 3个快速将Word转换成PDF的方法
  15. 2022年对于李一男是关键的一年,这也将决定他的社会地位
  16. 输入今天日期输出明天日期
  17. Halcon XLD 算子集合
  18. 机器视觉怎么和plc通讯
  19. LeetCode 2389. 和有限的最长子序列
  20. python飞机大战(只需要两个python文件)附带pycharm的导包方法

热门文章

  1. 光E电投资理财小白应该如何开始
  2. 讲台计算机风扇的英语怎么说,讲台的英文单词
  3. ios 构建工具栏UIToolBar
  4. [附源码]Java计算机毕业设计SSM儿童成长记录与分享系统
  5. 局域网内部政务视频会议系统搭建有什么要求?
  6. 华里士公式的推导及其推广
  7. 程序员、工程师使用mac电脑过程中遇到的各种坑汇总
  8. Python-IO多路复用
  9. 《Effective C++》读书笔记 条款51:编写new和delete时需要固守常规
  10. 人体测温 melexis迈来芯 linux 平台mlx90614/mlx90621/mlx90641驱动调试