在Three.js中获取面的全局法线

3

假设我使用射线投射器找到了一个交点。

intersects[0]

我该如何获取这个相交面的世界法线向量?

希望我的问题表述得正确。 换句话说: 我该如何获取网格表面上某个点的方向?

1个回答

7

法线将在面部可用。

例如:

intersects[0].face.normal

一个典型的交集返回以下内容:

{
    "distance": 511.4062319788414,
    "point": {
        "x": -49.99999999999999,
        "y": -2.3972604422461297,
        "z": -8.950476224522788
    },
    "face": {
        "a": 2,
        "b": 3,
        "c": 1,
        "normal": {
            "x": 1,
            "y": 0,
            "z": 0
        },
        "vertexNormals": [{
            "x": 1,
            "y": 0,
            "z": 0
        }, {
            "x": 1,
            "y": 0,
            "z": 0
        }, {
            "x": 1,
            "y": 0,
            "z": 0
        }],
        "color": {},
        "vertexColors": [],
        "vertexTangents": [],
        "materialIndex": 0
    },
    "faceIndex": 1,
    "object": {
        "metadata": {
            "version": 4.3,
            "type": "Object",
            "generator": "ObjectExporter"
        },
        "geometries": [{
            "uuid": "D12DB865-0BA3-4B38-BB18-92CBCFD5D630",
            "type": "BoxGeometry",
            "width": 20,
            "height": 20,
            "depth": 20
        }],
        "materials": [{
            "uuid": "B405897C-0A60-44A8-B057-683EFA53E895",
            "type": "MeshLambertMaterial",
            "color": 16716340,
            "ambient": 16777215,
            "emissive": 0
        }],
        "object": {
            "uuid": "34E07648-DA46-42B8-A1B1-7C87A67315B9",
            "type": "Mesh",
            "name": "cube1",
            "geometry": "D12DB865-0BA3-4B38-BB18-92CBCFD5D630",
            "material": "B405897C-0A60-44A8-B057-683EFA53E895",
            "matrix": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -60, 0, 0, 1]
        }
    }
}

要将物体转换为世界法线,其中该物体是所选项目,请使用以下方法:

var normalMatrix = new THREE.Matrix3().getNormalMatrix( object.matrixWorld );
console.log(normal.clone().applyMatrix3( normalMatrix ).normalize());

如何针对嵌套对象执行此操作? - James Heald
@JamesHeald 您的问题与 OP 略有关联。但是,在使用光线投射器时,有一个常用的方法:.intersectObject ( object, recursive )。第二个参数“recursive”需要设置为 true,以便递归遍历所有嵌套对象。这可能会影响性能,需要仔细考虑。 - Radio
@JamesHeald 我才恍然大悟,你问的是另一个问题:如何将局部法线转换为世界法线?我原回答底部的代码片段将会把局部法线转换为世界法线。 - Radio
@Radio 谢谢!那正是我所需要的。如果已经有了,我可能错过了。 - James Heald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接