如何隐藏从其他(复杂)3D对象背面伸出的3D对象部分?

时间:2014-12-15 12:12:07

标签: javascript 3d three.js intersection mesh

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

front of the bone; the markers should be visible here back of the bone; the markers should NOT be visible here

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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方向上旋转球体以使其在骨骼的局部表面上垂直的位置。