【问题标题】:How to hide parts of 3D objects that stick out of the back of other (complex) 3D objects?如何隐藏从其他(复杂)3D 对象背面伸出的 3D 对象部分?
【发布时间】:2014-12-15 21:50:13
【问题描述】:

我正在使用 Three.js(髂骨)渲染一个复杂的 3D 网格。然后我渲染一些简单的球体和这个网格来标记表面上的某些点(肌肉会附着的地方):

              

问题是,网格在某些区域非常薄,标记会从背面伸出。

假设标记坐标总是更接近网格的正面而不是背面,并且球体在网格正面的表面积/体积总是比背面多:

如何在不手动干预特定标记的情况下隐藏从背面突出的部分?

编辑:这是一种(天真的?)我可以做到的方式。我想就这个想法的可行性提供反馈,以及(一些编写指针)实际代码:

  • 对于每个标记球体:
    • 找到与球体相交的所有网格面
    • 计算这些面的所有向外的法线向量(顶点法线?面法线?)
    • 计算从面中心到球体中心的所有距离
    • 将所有这些法向量相加,按各自的距离加权
    • 给定(归一化?)结果向量,隐藏指向该方向的半球

我不确定如何编写这些步骤。我也不确定这是否是一种明智的做法。

【问题讨论】:

  • 想法 1:绘制半球而不是球体(phiStartphiLength 参数:threejs.org/docs/#Reference/Extras.Geometries/SphereGeometry)。想法 2:根据球体半径和骨骼厚度(您需要该信息)在应放置球体的位置设置 normal 上的球体偏​​移量,使其在另一侧不可见。
  • @B0Andrew:这两个想法都不错,但对两者来说最困难的部分是:如何检测哪个方向的可见性应该受到限制(通过移除一个半球,或通过移动球体在另一个方向)。理想情况下,这将通过分析这些坐标周围骨骼的几何形状以某种方式自动完成。
  • 您应该能够使用bone.geometry.faces 访问骨骼面。那么每张脸都应该有vertexNormals。查看VertexNormalsHelper 代码。这应该会给你一个好的开始:github.com/mrdoob/three.js/blob/master/src/extras/helpers/…
  • Three.js 代码的问题在于它的文档记录很差 --- 在这种情况下,not 记录了。而且我远非几何和 3D 建模方面的专家。针对我的特定问题的一段示例代码会很有用。尽管如此,我一定会看看VertexNormalsHelper,看看我能做些什么。谢谢!
  • @B0Andrew:根据您的链接,我已经写下了解决问题的方法,并将其添加到我原来的问题中。非常感谢您的反馈!

标签: javascript 3d three.js intersection mesh


【解决方案1】:

绘制半球而不是完整的球体。 使用SphereGeometry构造函数的phiStartphiLength参数。

球体的中心仍将位于骨骼的表面(一个顶点)。

一个球体的方向将由在球体原点计算的normal 给出。

Three.js 已经计算了网格的法线,以确定光线从网格中反射的方式。您可以使用 VertexNormalsHelper 显示网格的法线:

var bone = ...; // bone mesh
var scene = ...; //your THREE.Scene
scene.add(new THREE.VertexNormalsHelper(bone));

VertexNormalsHelper的源代码可以在这里找到:VertexNormalsHelper

您必须计算法线向量和oZ 轴之间的差角,以便获得difXdifY。这些是您必须沿 XY 方向旋转球体的数量,以使其垂直于骨骼的局部表面。

【讨论】:

  • 两个问题:[1] 那么什么是“人脸法线”?直觉上,感觉我应该使用这些。 [2] 给定一个球体,如何自动找到它对应的法向量?可能我需要不止一个,而且我必须取一个平均值(否则,想象一个以非常小但陡峭的局部斜坡为中心的标记)。这需要对几何进行线性搜索,还是有更聪明的方法来找到它们?谢谢!
  • 骨骼几何加载了STLLoader,是BufferGeometry。它没有faces 属性,所以VertexNormalsHelper 不能在它上面工作。另外,我找不到任何方法将BufferGeometry 转换为Geometry... :-/
猜你喜欢
  • 2011-08-14
  • 2018-03-19
  • 2020-09-28
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2012-11-25
  • 2013-09-17
  • 2020-05-03
相关资源
最近更新 更多