我正在使用Three.js(髂骨)渲染复杂的3D网格。然后我将渲染一些简单的球体以及这个网格来标记表面上的某些点(肌肉会附着在哪里):
问题是,在某些区域网格非常薄,标记会从背面伸出。
假设标记坐标总是比背面更接近网格的正面,并且球体在网格的正面总是显示比背面更多的表面积/体积:
如何在不手动干预特定标记的情况下隐藏挤出背面的部分?
编辑:这是一种(天真的?)方式,我可以这样做。我想要反馈这个想法的可行性,以及(编写一些指示)实际代码来做到这一点:
我不确定如何编写任何这些步骤的代码。我也不确定这是否是一种明智的做法。
答案 0 :(得分:1)
绘制半球而不是全球。
使用SphereGeometry构造函数的phiStart
和phiLength
参数。
球体的中心仍然位于骨骼的表面(顶点)。
一个球体的方向将由球体原点计算的normal
给出。
Three.js已经计算了网格的法线,以确定光线如何从网格反弹。您可以使用VertexNormalsHelper
显示网格的法线:
var bone = ...; // bone mesh
var scene = ...; //your THREE.Scene
scene.add(new THREE.VertexNormalsHelper(bone));
VertexNormalsHelper
的源代码可在此处找到:VertexNormalsHelper
您必须计算法线向量与oZ
轴之间的差异角度,以便获得difX
和difY
。这些是您必须在X
和Y
方向上旋转球体以使其在骨骼的局部表面上垂直的位置。