【发布时间】:2014-12-15 21:50:13
【问题描述】:
我正在使用 Three.js(髂骨)渲染一个复杂的 3D 网格。然后我渲染一些简单的球体和这个网格来标记表面上的某些点(肌肉会附着的地方):
问题是,网格在某些区域非常薄,标记会从背面伸出。
假设标记坐标总是更接近网格的正面而不是背面,并且球体在网格正面的表面积/体积总是比背面多:
如何在不手动干预特定标记的情况下隐藏从背面突出的部分?
编辑:这是一种(天真的?)我可以做到的方式。我想就这个想法的可行性提供反馈,以及(一些编写指针)实际代码:
- 对于每个标记球体:
- 找到与球体相交的所有网格面
- 计算这些面的所有向外的法线向量(顶点法线?面法线?)
- 计算从面中心到球体中心的所有距离
- 将所有这些法向量相加,按各自的距离加权
- 给定(归一化?)结果向量,隐藏指向该方向的半球
我不确定如何编写这些步骤。我也不确定这是否是一种明智的做法。
【问题讨论】:
-
想法 1:绘制半球而不是球体(
phiStart和phiLength参数: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