覆盖切割平面中的切口

Posted

技术标签:

【中文标题】覆盖切割平面中的切口【英文标题】:Cover cuts in cut planes 【发布时间】:2017-10-05 09:15:39 【问题描述】:

当我使用函数viewer.setCutPlanes()时,被切割的平面没有被覆盖:

但是使用查看器的截面分析工具平面切割,它们确实会被覆盖(每个覆盖物都是其自己节点的一部分,这很好):

使用viewer.setCutPlanes()时如何将这些封面添加到模型中?

PS:我在查看器中找到了部分工具扩展,但它的所有相关功能似乎都是私有的。我应该尝试复制这个扩展并在那里公开必要的功能吗?有 ES6 版本的 repo 吗?

【问题讨论】:

【参考方案1】:

很遗憾,Forge Viewer 没有 ES6 模块。 Viewer3D.setCutPlanes() 是一种仅用于制作ThreeJS 剪裁平面的实用方法,现在Autodesk.Viewing.Extensions.Section.SectionTool 存档了剪切覆盖功能。

如果您想在自我控制下执行此功能,则必须从 SectionTool 扩展名中复制以下列出的功能:

    getDiffuseColor() init_three_triangulator() init_three_intersector() updateCapMeshes()

此外,上述私有函数中的_viewer 变量应替换为Viewer3DImpl 实例,即Viewer3D.impl。或者您可以更改updateCapMeshes 的函数声明,如下所示:

function updateCapMeshes( _viewer, plane ) 

  init_three_triangulator();
  init_three_intersector();

  // ... Original content of updateCapMeshes below ...

像这样调用修改后的updateCapMeshes函数来创建cut-cover:

//-- Helper function to create your own cut planes.
function createMyOwnPlane( _viewer, _sectionPlanes ) 
  if (_sectionPlanes.length === 1) 
     updateCapMeshes(_viewer, new THREE.Plane().setComponents(_sectionPlanes[0].x, _sectionPlanes[0].y, _sectionPlanes[0].z, _sectionPlanes[0].w));
  
  _viewer.setCutPlanes(_sectionPlanes);



//-- Call functions here.
var viewer = viewerApp.getCurrentViewer();
createMyOwnPlane( viewer.impl, [ new THREE.Vector4(0, 0, 1, 0) ] );

如果没有TransformControl,你会得到这样的结果: Result of createMyOwnPlane

顺便说一句,这样就可以去掉cut-cover~

var oldsection = viewer.impl.sceneAfter.getObjectByName("section");
if (oldsection)
  viewer.impl.sceneAfter.remove(oldsection);

viewer.setCutPlanes();

【讨论】:

@eason-kang 你知道这是否计划在未来成为一个公共的 Viewer3D API 吗?复制私有实现有点脆弱。谢谢。

以上是关于覆盖切割平面中的切口的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3384 放地毯半平面交

MapKit 覆盖以将平面图添加到地图

数据结构与算法之深入解析“切割后面积最大的蛋糕”的求解思路与算法示例

Forge 关卡扩展的切割平面在哪里?

HDU 1255 覆盖的面积(线段树面积并)

Java案例:最小覆盖圆问题