Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Three.js中获取面全局法线_Three.js - Fatal编程技术网

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

在Three.js中获取面全局法线,three.js,Three.js,假设我用raycaster找到了一个交集 intersects[0] 如何使相交面的世界正常 希望我把这个问题表述得正确。 换言之: 如何获取网格表面上点的方向?法线将在面中可用 比如说 intersects[0].face.normal 典型的相交将返回以下内容: { "distance": 511.4062319788414, "point": { "x": -49.99999999999999, "y": -2.3972604422461

假设我用raycaster找到了一个交集

intersects[0]
如何使相交面的世界正常

希望我把这个问题表述得正确。 换言之:
如何获取网格表面上点的方向?

法线将在面中可用

比如说

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());

法线将在面中可用

比如说

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());

如何对嵌套对象执行此操作?@JamesHeald您的问题与OP有直接关系。但是,在使用光线投射器时,有一种常用的方法:。intersectObject(object,recursive)。第二个参数“recursive”需要设置为true才能递归所有嵌套对象。这可能会影响性能,需要好好考虑。@JamesHeald我才意识到你在问一个不同的问题:如何将本地法线转换为世界法线?原始答案底部的代码片段将本地法线转换为世界法线。@谢谢!这正是我需要的。很抱歉,如果已经存在,我可能会错过它。如何对嵌套对象执行此操作?@JamesHeald您的问题与OP有直接关系。但是,在使用光线投射器时,有一种常用方法:。intersectObject(object,recursive)。第二个参数“recursive”需要设置为true才能递归所有嵌套对象。这可能会影响性能,需要好好考虑。@JamesHeald我才意识到你在问一个不同的问题:如何将本地法线转换为世界法线?原始答案底部的代码片段将本地法线转换为世界法线。@谢谢!这正是我需要的。对不起,如果已经有了,我可能会错过的。