• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > 基于 HTML5 Canvas 的 3D 渲染引擎界面以及吸附等效果的运用

基于 HTML5 Canvas 的 3D 渲染引擎界面以及吸附等效果的运用

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含HTML5,Canvas,3D渲染,吸附效果等相关知识,匿名希望在学习及工作中可以帮助到您
本文给大家介绍基于 HTML5 Canvas 的 3D 渲染引擎界面以及吸附等效果的运用 ,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

效果图

代码实现

HT 提供了基于 WebGL 的 3D 技术的图形组件 ht.graph3d.Graph3dView,WebGL 基于 OpenGL ES 2.0 图形接口,因此 WebGL 属于底层的图形 API 接口,二次开发还是有很高的门槛,HT 的 Graph3dView 组件通过对 WebGL 底层技术的封装,与 HT 其他组件一样,基于 HT 统一的 DataModel 数据模型来驱动图形显示,极大降低了 3D 图形技术开发的门槛。同时 HT 提供了强大的完全基于 HTML5 技术 3D 图形建模设计器,用户无需编码即可快速可视化搭建各种 3D 场景,可以说 HT 的 3D 开发模式完全打破了传统 3D 开发模式,绝大部分应用不再需要依赖精通 3ds Max 或 Maya 的专业 3D 设计师来建模,也不需要整合 Unity3d 等引擎做图形渲染,HT 一站式的提供了从建模到渲染,包括和 2D 组件呈现和数据融合的一站式解决方案。

本次讲解的就是这个 3D 的界面,所以我们首先要创建 3D 渲染引擎组件,可视化呈现数据模型的三维环境场景。

dataModel = new ht.DataModel();
g3d = new ht.graph3d.Graph3dView(dataModel);
g3d.addToDOM();
window.addEventListener('resize', function (e) {
  g3d.invalidate();
}, false);

我们还要设置眼睛(或Camera)所在位置,默认值为 [0, 300, 1000] ,格式为 [x, y, z] 。

g3d.setEye([0, 300, 600]);

这里给大家说一下,可参考 3D 手册( http://www.hightopo.com/guide/guide/core/3d/ht-3d-guide.html )。

1.jpg

然后我们再给它加上一些选中效果。Graph3dView 中被选中的图元会显示为较暗的状态,变暗系数是由图元 style 的 brightness 和 select.brightness 属性决定,select.brightness 属性默认值为 0.7,最终返回值大于 1 变亮,小于 1 变暗,等于 1 或为空则不变化。Graph3dView#getBrightness 函数控制最终图元亮度,因此也可以通过重载覆盖该函数自定义选中图元亮度。

g3d.getBrightness = function (data) {
  if (data.s('isFocused')) {
     return 0.7;
   }
  return null;
};
lastFocusData = null;g3d.getView().addEventListener('mousemove', function (e) {
  // 传入逻辑坐标点或者交互 event 事件参数,返回当前点下的图元
   var data = g3d.getDataAt(e);   if (data !== lastFocusData) {
     if (lastFocusData) {
        astFocusData.s('isFocused', false);
      }      if (data) {
         data.s('isFocused', true);
      }
      astFocusData = data;
  }
});

接下来我们写个函数来方便绘制每个部分的模型:

function createNode (p3, s3, host) {
  // 拓扑图元类型  var node = new ht.Node();  // 获取或设置图元中心点的三维坐标 有三个参数时相当于 setPosition3d 没有相当于 get  node.p3(p3);  // 获取或设置图元的尺寸 有三个参数时相当于 setSize3d 没有相当于 get  node.s3(s3);  // 设置宿主图元,当图元吸附上宿主图元(host)时,宿主移动或旋转时会带动所有吸附者  node.setHost(host);
  dataModel.add(node);  return node;
}

讲到了这,我们来说说吸附,吸附功能对于设计有层次关系的模型非常方便,例如设备面板吸附上设备机框,设备端口吸附上设备面板,这样从机框 - 面板 - 端口的层次关系吸附,使得用户拖动整体机框时所有这个层次下的图元都会跟随移动。对于 3D 的场景下,吸附的概念更进一步延伸,当机框在三维空间进行任意位置偏移以及任意角度旋转时,所有吸附的相关图元都会正确的跟随平移,并做出相应位置对应的旋转,以达到整体设备各个图形部分保持物理相对位置一致。

下面我们来一起创建模型吧!分别是地板 floor,桌面 table,四个桌腿以及盒子:

// 地板
floor = createNode([0, 0, 0], [600, 5, 400]).s({
  'all.color': '#A0A0A0',// 六面颜色
  'label': '地板',// 图元文字内容
  'label.face': 'top',// 文字在3d下的朝向,可取值(left|right|top|bottom|front|back|center)
  'label.background': 'yellow',// 图元文字背景
  'label.position': 22,// 图元文字位置
  'label.t3': [10, 0, -10],// 文字在3d下的偏移,格式为 [x,y,z]
  'label.font': '28px arial, sans-serif'// 图元文字字体
});
// 桌面
table = createNode([0, 120, 0], [400, 10, 280], floor).s({
  'shape3d': 'cylinder',// 为空时显示为六面立方体,cylinder 圆柱
  'shape3d.side': 60,// 决定 3d 图形显示为几边型,为 0 时显示为平滑的曲面效果
  'shape3d.color': '#E5BB77',// 3d 图形整体颜色
  'label': '桌子',
  'label.face': 'top',
  'label.background': 'yellow',
  'label.position': 23,
  'label.t3': [0, 0, -10],
  'label.font': '20px arial, sans-serif'
});
// 四个桌腿
foot1 = createNode([100, 60, 80], [20, 110, 20], table).s({
  'shape3d': 'cylinder',
  'shape3d.color': '#E5BB77',
});
foot2 = createNode([-100, 60, 80], [20, 110, 20], table).s({
  'shape3d': 'cylinder',
  'shape3d.color': '#E5BB77',
});
foot3 = createNode([100, 60, -80], [20, 110, 20], table).s({
  'shape3d': 'cylinder',
  'shape3d.color': '#E5BB77',
});
foot4 = createNode([-100, 60, -80], [20, 110, 20], table).s({
  'shape3d': 'cylinder',
  'shape3d.color': '#E5BB77',
});
// 盒子
box = createNode([0, 150, 0], [100, 50, 60], table).s({
  'all.color': '#2e2f32',
  'front.color': '#BDC3C7',// 前面颜色
  'note': '盯着你看', // 图元冒泡标注
  'note.face': 'top',
  'note.position': 7,
  'note.t3': [0, 0, 10],
  'note.autorotate': true// 图标在 3D 下是否自动朝向眼睛的方向
});

代码中有一些属性,我已经帮大家写好了详细的注释。在此献上各种关于 'shape3d' 的图形的值,方便大家玩耍:

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问Html5视频教程!

相关推荐:

HTML5图文教程

HTML5在线手册

html5特效代码大全

以上就是基于 HTML5 Canvas 的 3D 渲染引擎界面以及吸附等效果的运用的详细内容,更多请关注微课江湖其它相关文章!

您可能想查找下面的文章:

  • HTML5知识点总结
  • HTML5的本地存储
  • HTML5本地存储之IndexedDB
  • Html5实现文件异步上传功能
  • Html5新标签datalist实现输入框与后台数据库数据的动态匹配
  • 详解HTML5 window.postMessage与跨域
  • HTML5拖放API实现拖放排序的实例代码
  • 解决html5中video标签无法播放mp4问题的办法
  • HTML5新特性 多线程(Worker SharedWorker)
  • Html5新增标签有哪些

相关文章

  • 2018-12-03html5中JavaScript removeChild 删除所有节点_html5教程技巧
  • 2018-12-03有没有类似开心推一样的H5游戏广告定制的平台?
  • 2018-12-03前端页面跳转并取值的实现
  • 2018-12-03html5新增标签有哪些?
  • 2018-12-03小强的HTML5移动开发之路(37)——jqMobi快速入门
  • 2018-12-03开发人员所需要知道的HTML5性能分析面面观_html5教程技巧
  • 2018-12-03深入剖析webstorage--html5的本地数据处理
  • 2018-12-03详细介绍HTML5使用Audio标签实现歌词同步的效果
  • 2018-12-03HTML5中新增的标签和属性的总结
  • 2018-12-03HTML5中如何使用rel属性的预加载功能?

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • HTML5优势到底有哪些?
    • HTML 5-交互
    • 响应式网站与自适应网站比较:做移动站该选择哪种?
    • 使用<header>,<footer>,<nav>等h5标签,和全部使用<div>有什么区别??
    • 使用html5的canvas和JavaScript创建一个绘图程序的示例代码
    • 如何自动获取HTML5的data-*属性示例代码详解
    • W3C公布最新的HTML5标准草案
    • 使用HTML5 Canvas绘制直线或折线等线条的方法讲解
    • 利用简洁的图片预加载组件提升html5移动页面的用户体验
    • IE9对HTML5中部分属性不支持的原因分析_html5教程技巧

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有