在Three.js中获取面全局法线
假设我用raycaster找到了一个交集在Three.js中获取面全局法线,three.js,Three.js,假设我用raycaster找到了一个交集 intersects[0] 如何使相交面的世界正常 希望我把这个问题表述得正确。 换言之: 如何获取网格表面上点的方向?法线将在面中可用 比如说 intersects[0].face.normal 典型的相交将返回以下内容: { "distance": 511.4062319788414, "point": { "x": -49.99999999999999, "y": -2.3972604422461
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我才意识到你在问一个不同的问题:如何将本地法线转换为世界法线?原始答案底部的代码片段将本地法线转换为世界法线。@谢谢!这正是我需要的。对不起,如果已经有了,我可能会错过的。