第一人称在 3D 中的用法要参考第一人称在射击游戏中的使用,第一人称射击游戏(FPS)是以第一人称视角为中心围绕枪和其他武器为基础的视频游戏类型 ; 也就是说,玩家通过主角的眼睛来体验动作。自从流派开始以来,先进的 3D 和伪 3D 图形已经对硬件发展提出了挑战,而多人游戏已经不可或缺。

Doom 的截图,这个流派的突破游戏之一,展示了第一人称射击游戏的典型视角

现在博物馆或者公司也经常使用到 3D 动画做宣传片等等,3D 动画演绎最大的优势,便是在于内容与形式上给人的真实感受。它比平面作品更直观,比 2D 动画更真实,所以更能给观赏者以置身于广告环境当中的感受,大大增强广告的说服力。3D 技术的发展甚至挑战受众的分辨能力,使受众的判断游离于与虚拟和现实之间。
而且 3D 特效的应用为创意提供了更加广阔的思维空间,并成为创意执行的可靠保证,并丰富了创意的形式和风格手段。根据广告主题的表现诉求,可以营造出梦幻般的神奇氛围来刺激打动受众,从而起到与受众沟通的目的。
3D动画宣传片将 3D 动画、特效镜头、企业视频、照片、未来前景等内容通过后期合成、配音、解说形成一部直观、生动、喜闻乐见的高品位的企业广告宣传片,让社会不同层面的人士对企业产生正面的、积极的、良好的印象,从而建立对企业的好感与信任,并信赖该企业的产品或服务。

现在 3D 发展地如此迅速也要感谢人类对于“现实”的追求,所以学好用好 3D 是未来成功必不可少的一部分。

本文例子的思路是进入一个机房参观,打开门的动作是再生动不过了, 再加上适当地转弯,基本上完全模拟了人在机房中参观的效果。还有一个好处就是,如果要演示给领导看而又不用操作,这种炫酷的效果领导一定会很满意!

http://www.hightopo.com/demo/room-walkthrough/index.html

界面上的“reset”和“start”两个按钮是直接加在 body 体中的 button,并在这两个按钮上添加点击事件:

<div class="button" style="right: 50px;background-image: url(run.png);" οnclick="startAnim();"></div>
<div class="button" style="right: 100px;background-image: url(reset.png);" οnclick="reset();"></div>

整个场景由 HT 封装的 3D 组件搭建形成的,构造这么大的场景是需要一定量的代码的,为了简化,我把场景单独拿出来,并用 HT 封装的 ht.JSONSerializer 类将场景序列化为 json,代码中只引入了生成后的 json 文件,为了让大家更明确,我这边做个示例,假设已经搭建好 3D 场景了:

dm = new ht.DataModel();
g3d = new ht.graph3d.Graph3dView(dm);
//.......构建好场景
dm.serialize();//可以填入number参数,作为空格缩进值

既然我们已经搭建好环境,转成了 json 文件,代码中不好控制,这种情况下我们会将 DataModel 数据模型再反序列化,这个函数的功能就是将 json 格式转成对象,并将反序列化的对象传入到 DataModel 数据模型中,详情请参考 HT for Web 序列化手册:

 var g3d = window.g3d = new ht.graph3d.Graph3dView(),dataModel = g3d.dm(),view = g3d.getView(),path = null;
g3d.setMovableFunc(function(data) {return false;
});
g3d.setVisibleFunc(function(data) {if (data.getName() === "path") {return false;}return true;
});
g3d.setEye([523, 5600, 8165]);
g3d.setFar(60000);
dataModel.deserialize(json);

我们目前需要操作场景中的“门”、以及我们将要走的路线“path”,遍历 DataModel 数据模型,获取这两个数据:

for (var i = 0; i < dataModel.size(); i++) {var data = dataModel.getDatas().get(i);if (data.getName() === "门") {//json中设置的名称window.door = data;}if (data.getName() === "path") {path = data;}if (window.door && path) {//获取到door 和 path 的data之后就跳出循环break;}
}

这个例子中简单来说就只有四个动作,“重置”回到原点、“开始动作”、“向前移动”,“停止”。点击“开始”按钮,在“开始动作”中我们只做了一个动作,“开门”动作,动作结束之后调用“forward”函数向前移动:

function startAnim() {if (window.isAnimationRunning) {return;}reset();window.isAnimationRunning = true;//动画是否正在进行ht.Default.startAnim({frames: 30, // 动画帧数,默认采用`ht.Default.animFrames`。interval: 20, // 动画帧间隔,默认采用`ht.Default.animInterval`。   finishFunc: function() {// 动画结束后调用的函数。forward();}, action: function(t){ // action函数必须提供,实现动画过程中的属性变化。door.setRotationY(-120 * Math.PI / 180 * t);}});
}

这边的“reset”函数就是“重置”回到原点的功能,我们通过这个函数将所有变化过的都恢复初始的位置,包括“门”的位置:

function reset() {if (window.isAnimationRunning) {return;}g3d.setCenter([0,0,0]);g3d.setEye([523, 5600, 8165]);window.forwardIndex = 0;door.setRotationY(0);
}

要“移动”,肯定需要走路的“路径”,也就是我们刚刚获取到的“path”,通过 window.points = path.getPoints()._as; 获取“path”中的所有元素,初始化  window.forwardIndex = 0; 通过控制“path”中前后两点来设置 3D 场景中的 Eye 和 Center,这样就能营造一个我们是第一人的效果:

var point1 = points[forwardIndex],point2 = points[forwardIndex + 1];
var distanceX = (point2.x - point1.x),distanceY = (point2.y - point1.y),distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY)-200;//两点之间的距离通过三角形勾股定理计算 怕碰墙所以-200
g3d.setEye([point1.x, 1600, point1.y]);//眼睛
g3d.setCenter([point2.x, 1600, point2.y]);//我

HT 中 3D 组件有一个 walk(step, anim, firstPersonMode) 方法,该函数同时改变eye和center的位置,也就是eye和center在两点建立的矢量方向上同时移动相同的偏移量。step为偏移的矢量长度值。firstPersonMode参数为空时则默认采用Graph3dView#isFirstPersonMode()当前值, 如果为第一人称模式调用walk操作,该函数会考虑Graph3dView#getBoundaries()边界限制。

g3d.walk(distance, {frames: 50,interval: 30,easing: function(t) {return t; },finishFunc: function() {forwardIndex += 1;if (points.length - 2 > forwardIndex) {//points.length = 5g3d.setCenter([point2.x, 1600, point2.y]);//把结束点变成起始点g3d.rotate(Math.PI / 2, 0, {frames: 30,interval: 30,easing: function(t) {return t;},finishFunc:function() { forward();}});} else {var lastPoint = points[points.length  - 1];//json 中path的points 的最后一个点g3d.setCenter([lastPoint.x, 1400, lastPoint.y]);g3d.rotate(-Math.PI / 2, 0, {frames: 30,interval: 30,finishFunc: function() {window.isAnimationRunning = false;}});}}
});

不管“path”的点有多少个,这个判断语句还是能运作,只在最后一个点是跳出 finishFunc 动画结束后调用的函数,并将 window.isAnimationRunning 值设为 false 停止 startAnim 函数。如果不是最后一个点,用户“旋转”之后,回调 forward 函数。至此,全部代码解释完毕,很短的代码量,却做出了这么大的工程!

基于HTML5的WebGL经典3D虚拟机房漫游动画相关推荐

  1. 基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型

    2019独角兽企业重金招聘Python工程师标准>>> 前言 随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展 ...

  2. HTML二维试衣游戏,基于HTML5实现的在线3D虚拟试衣系统(试衣间)解决方案-Go语言中文社区...

    3D虚拟试衣系统的使用场景主要是在线电商或数字营销,为品牌服装.服饰.饰品添加高端3D虚拟购物动效,提升用户感官体验和交互体验. 要研发这样的在线系统,有2个方向,一个是使用Flash或Unity3D ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 现在,3D模型已经用于各种不同的领域.在医疗行业使用它们制作器官的精确模型:电影行业将它们用于活动的人物.物体以及现实电影:视 ...

  4. 三维数据可视化软件html5,基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型 | 3D组态|图扑软件|数据可视化|blog...

    前言 随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的同时,在监控系统中面临着严峻的现状问 ...

  5. html5做一个展示页面,基于HTML5的WebGL实现json和echarts图表展现在同一个界面

    突然有个想法,如果能把一些用到不同的知识点放到同一个界面上,并且放到一个盒子里,这样我如果要看什么东西就可以很直接显示出来,而且这个盒子一定要能打开.我用HT实现了我的想法,代码一百多行,这么少的代码 ...

  6. 基于html5的矢量图绘制方法研究,基于HTML5和WebGL的三维地形可视化方法研究

    摘要: 近年来地理信息的需求急速增长,越来越多的GIS应用走向网页化.移动化.WebGIS应用也在逐渐从二维层面向三维层面发展,三维地形可视化是三维GIS的基础,基于Web的三维地形可视化也成为新的研 ...

  7. java 电子围栏_基于H5与webGL的 3d 电子围栏展示

    前言 现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 ...

  8. 基于HTML5的WebGL电信网管3D机房监控应用

    先上段视频,不是在玩游戏哦,是规规矩矩的电信网管企业应用,嗯,全键盘的漫游3D机房:   随着PC端支持HTML5浏览器的普及,加上主流移动终端Android和iOS都已支持HTML5技术,新一代的电 ...

  9. 基于HTML5的电信网管3D机房监控应用

    先上段视频,不是在玩游戏哦,是规规矩矩的电信网管企业应用,嗯,全键盘的漫游3D机房: 随着PC端支持HTML5浏览器的普及,加上主流移动终端Android和iOS都已支持HTML5技术,新一代的电信网 ...

最新文章

  1. 前 Google 工程师总结的算法面试指南
  2. 【CSS练习】常用的CSS字段
  3. 这三个NLP项目写进简历,网申通过率提高50%
  4. 【Python CheckiO 题解】Army Battles
  5. 微信、企业微信、支付窗、微博SDK 四合一,JeeWx-api 1.2.2 版本发布!
  6. hfss和python_【技术分享】python和HFSS联合仿真微带天线的教程-射频/微波-与非网...
  7. 《只是为了好玩-Linux之父Linus自传》
  8. 关于线段树or 树状树状 在二维平面搞事情!Orz
  9. 用python批量下载modis数据的速度怎么样_MODIS数据下载与处理-pymodis的使用(持续更新...)...
  10. MTK 6589 native exif generation
  11. 传感器相关 MPU9250
  12. 【三十八】Python全栈之路--HTML
  13. 2018.8.18梦中的凶杀案
  14. Java编程规范-文件组织与排版
  15. IOS开发 生成app图标
  16. (6)关于整型short、int、long和long long
  17. 这36张图包含了高中英语所有生活用词,果断收藏!
  18. 选股,涨幅,收益率排行前面的好股票
  19. 计算机科学与技术和电子信息类哪个好,电子信息类七个专业哪个最好
  20. Unity学习-Materials材质球

热门文章

  1. android热门机型,Android手机在列 不足1K热门机型大搜索
  2. Python:zhdate模块农历日期处理
  3. 我的世界pe服务器插件制作,我的世界pe服务器连接方法 pe服务器插件大全
  4. android qq视频悬浮窗口,手机QQ浏览器浮窗视频实现边看视频边操作
  5. [新闻]华为高端集群路由器面世
  6. 基于java汽配管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  7. 安卓强制恢复出厂_恢复出厂设置都没用,安卓木马病毒xHelper究竟该如何清除?...
  8. 饭店菜单选择c语言,求C语言大神,帮忙做一下这个题,要源代码设计实现一个餐厅点餐系统? 爱问知识人...
  9. html5如何让输入框只能输字数,html input输入限制
  10. JavaScript奇技淫巧:加密JS代码反调试