大家使用View and Data API做三维模型开发,必然首先要理解View and Data API的坐标系统,即XYZ三个轴向分别是怎么定义的。Three.js里面提供了一个AxisHelper,但如果你直接运用的话,你会发现在viewer中并不显示,并且控制台中会有这样的错误信息:"Only THREE.Mesh can be rendered by the Firefly renderer. Use THREE.Mesh to draw lines."  原因是因为View and Data API采用的是Three.js上定制的render,有些three.js中可以使用的功能在viewer中并不能用。所以我重写了一个这样的AxisHelper,希望对你有帮助。

 

使用非常简单,只需要加载这个扩展即可。建议在GEOMETRY_LOADED_EVENT事件中加载:

  1. // It is recommended to load the extension when geometry is loaded
  2. viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT,
  3. function(){
  4.  
  5. viewer.loadExtension('Autodesk.ADN.Viewing.Extension.AxisHelper');
  6.  
  7. });

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

下面是截图,你可以看到红线是X轴,绿线是Y轴,蓝线是Z轴。请注意和右上角的view cube的对应关系。

下面是这个扩展的源代码,不过最好到 github 上下载,因为我可能会时不时的做更新,github上的才是最新的。

  1. ///////////////////////////////////////////////////////////////////////////////
  2. AutodeskNamespace("Autodesk.ADN.Viewing.Extension");
  3.  
  4. Autodesk.ADN.Viewing.Extension.AxisHelper = function (viewer, options) {
  5.  
  6. Autodesk.Viewing.Extension.call(this, viewer, options);
  7.  
  8. var _self = this;
  9.  
  10. var _axisLines = [];
  11.  
  12. _self.load = function () {
  13.  
  14. console.log('Autodesk.ADN.Viewing.Extension.AxisHelper loaded');
  15.  
  16. addAixsHelper();
  17.  
  18. //workaround
  19. //have to call this to show up the axis
  20. viewer.restoreState(viewer.getState());
  21.  
  22. return true;
  23. };
  24.  
  25. _self.unload = function () {
  26.  
  27. removeAixsHelper();
  28.  
  29. console.log('Autodesk.ADN.Viewing.Extension.AxisHelper unloaded');
  30. return true;
  31. };
  32.  
  33. var addAixsHelper = function() {
  34.  
  35. _axisLines = [];
  36.  
  37. //get bounding box of the model
  38. var boundingBox = viewer.model.getBoundingBox();
  39. var maxpt = boundingBox.max;
  40. var minpt = boundingBox.min;
  41.  
  42. var xdiff = maxpt.x - minpt.x;
  43. var ydiff = maxpt.y - minpt.y;
  44. var zdiff = maxpt.z - minpt.z;
  45.  
  46. //make the size is bigger than the max bounding box
  47. //so that it is visible
  48. var size = Math.max(xdiff,ydiff,zdiff) * 1.2;
  49. //console.log('axix size :' + size);
  50.  
  51. // x-axis is red
  52. var material_X_Axis = new THREE.LineBasicMaterial({
  53. color: 0xff0000, //red
  54. linewidth: 2
  55. });
  56. viewer.impl.matman().addMaterial('material_X_Axis',material_X_Axis,true);
  57. //draw the x-axix line
  58. var xLine = drawLine(
  59. {x : 0, y : 0, z : 0} ,
  60. {x : size, y : 0, z : 0} ,
  61. material_X_Axis);
  62.  
  63. _axisLines.push(xLine);
  64.  
  65. // y-axis is green
  66. var material_Y_Axis = new THREE.LineBasicMaterial({
  67. color: 0x00ff00, //green
  68. linewidth: 2
  69. });
  70. viewer.impl.matman().addMaterial('material_Y_Axis',material_Y_Axis,true);
  71. //draw the y-axix line
  72. var yLine = drawLine(
  73. {x : 0, y : 0, z : 0} ,
  74. {x : 0, y : size, z : 0} ,
  75. material_Y_Axis);
  76.  
  77. _axisLines.push(yLine);
  78.  
  79. // z-axis is blue
  80. var material_Z_Axis = new THREE.LineBasicMaterial({
  81. color: 0x0000ff, //blue
  82. linewidth: 2
  83. });
  84. viewer.impl.matman().addMaterial('material_Z_Axis',material_Z_Axis,true);
  85. //draw the z-axix line
  86. var zLine = drawLine(
  87. {x : 0, y : 0, z : 0} ,
  88. {x : 0, y : 0, z : size} ,
  89. material_Z_Axis);
  90.  
  91. _axisLines.push(zLine);
  92.  
  93. }
  94.  
  95. var drawLine = function(start, end, material) {
  96.  
  97. var geometry = new THREE.Geometry();
  98.  
  99. geometry.vertices.push(new THREE.Vector3(
  100. start.x, start.y, start.z));
  101.  
  102. geometry.vertices.push(new THREE.Vector3(
  103. end.x, end.y, end.z));
  104.  
  105. var line = new THREE.Line(geometry, material);
  106.  
  107. viewer.impl.scene.add(line);
  108. //refresh viewer
  109. viewer.impl.invalidate(true);
  110.  
  111. return line;
  112. }
  113.  
  114. var removeAixsHelper = function() {
  115.  
  116. _axisLines = [];
  117.  
  118. _axisLines.forEach(function(line){
  119.  
  120. viewer.impl.scene.remove(line);
  121. });
  122.  
  123. //remove materials
  124. delete viewer.impl.matman().materials.material_X_Axis;
  125. delete viewer.impl.matman().materials.material_Y_Axis;
  126. delete viewer.impl.matman().materials.material_Z_Axis;
  127.  
  128. }
  129.  
  130. };
  131.  
  132. Autodesk.ADN.Viewing.Extension.AxisHelper.prototype =
  133. Object.create(Autodesk.Viewing.Extension.prototype);
  134.  
  135. Autodesk.ADN.Viewing.Extension.AxisHelper.prototype.constructor =
  136. Autodesk.ADN.Viewing.Extension.AxisHelper;
  137.  
  138. Autodesk.Viewing.theExtensionManager.registerExtension(
  139. 'Autodesk.ADN.Viewing.Extension.AxisHelper',
  140. Autodesk.ADN.Viewing.Extension.AxisHelper);

Hope it helps.

使用AxisHelper帮助理解View and Data API中的坐标系统的更多相关文章

  1. 在View and Data API中更改指定元素的颜色

    大家在使用View and Data API开发过程中,经常会用到的就是改变某些元素的颜色已区别显示.比如根据某些属性做不同颜色的专题显示,或者用不同颜色表示施工进度,或者只是简单的以颜色变化来提醒用 ...

  2. Autodesk View and Data API二次开发学习指南

    什么是View and Data API? 使用View and Data API,你可以轻松的在网页上显示大型三维模型或者二维图纸而不需要安装任何插件.通过View and Data API,你可以 ...

  3. Using View and Data API with Meteor

    By Daniel Du I have been studying Meteor these days, and find that Meteor is really a mind-blowing f ...

  4. View and Data API Tips: Constrain Viewer Within a div Container

    By Daniel Du When working with View and Data API, you probably want to contain viewer into a <div ...

  5. View and Data API Tips: Hide elements in viewer completely

    By Daniel Du With View and Data API, you can hide some elements in viewer by calling "viewer.hi ...

  6. 特大喜讯,View and Data API 现在支持中文界面了

    大家经常会问到,使用View and Data API怎么做界面的本地化,来显示中文,现在好消息来了,从v1.2.19起,View and Data API开始支持多国语言界面了.你需要制定版本号为v ...

  7. View and Data API 现在支持IE11了

    By Daniel Du After a long time waiting, IE11 finally supports WebGL, which enables us viewing our 3D ...

  8. View and Data API tips: 缓存Access Token

    对于云API服务,常见的方式就是按照API调用次数收费,某些API调用也就有某些限制,比如在特定时间内只允许调用指定的次数以免造成滥用.虽然Autodesk的view and Data API目前还没 ...

  9. View and Data API Tips: how to make viewer full screen

    By Daniel Du If you have not heard of View and Data API, here is the idea, the View & Data API e ...

随机推荐

  1. Alwayson的IP冲突

    Alwayson的IP冲突 https://social.technet.microsoft.com/Forums/office/en-US/4d50cb1c-eef7-4dcc-b937-3c8eb ...

  2. ASP.NET 5 Beta 8 发布

    ASP.NET 5 的路线图(详见 ASP.NET 5 Schedule and Roadmap : https://github.com/aspnet/home/wiki/roadmap ):Bet ...

  3. CanvasWebgl项目介绍

    CanvasWebgl 介绍 CanvasWebgl 是一个基于webgl 开发的2d绘图框架,使用TypeScript开发   CanvasWebgl的功能,是在屏幕空间 或者 3D空间产生一个画布 ...

  4. YY一下十年后的自己

    ps:其实这篇文章的评论比文章本身更有意思,欢迎关注. 每到年底总是我最焦虑的时候,年龄越大情况越明显. 可能越长大越是对 时光的流逝 更有感触,有感触之后就会胡思乱想.所以随手开始写下这篇文章. 人 ...

  5. ABP框架 - 日志

    文档目录 本节内容: 服务端 获取Logger(记录器) Logger的基类 配置 Abp.Castle.Log4Net 包 客户端 服务端 ABP使用Castle Windsor的日志记录工具,它可 ...

  6. SQL Server 存储中间结果集

    在SQL Server中执行查询时,有一些操作会产生中间结果集,例如:排序操作,Hash Join和Hash Aggregate操作产生的Hash Table,游标等,SQL Server查询优化器使 ...

  7. web标准之道——笔记

    字体设置 sans和sans-serif为通用字体,具体哪个字体被最终应用由浏览器决定,通用字体只有在其他字体都无效时才会被当作代替方案.通用字体应该放在最后面 sans衬线字体 容易阅读,一般使用在 ...

  8. Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'(2)

    center os服务器上搭建discuz论坛初始化程序的时候出现的.我把localhost改成127.0.0.1解决了这个问题.

  9. .net erp(办公oa)开发平台架构之流程服务概要介绍

    背景 搭建一个适合公司erp业务的开发平台. 架构概要图:    流程引擎开发平台:  包含流程引擎设计器,流程管理平台,流程引擎服务.目前只使用单个数据库进行管理.  流程引擎设计器 采用silve ...

  10. 初步认识Node 之Web框架

    上一篇我们认识了Node是什么之后,这一篇我们主要了解的就是它的框架了.而它的框架又分为两大类,Web框架和全栈框架,接下来我们一个一个的来了解.    Web框架 Web框架可以细分为Web应用程序 ...