2017-04-05 8 views
0

THREE.JSのメッシュジオメトリを所定のステップ/厚さでオフセットする方法はありますか?THREE.jsのオフセットメッシュ

offseting

これは単純なスケーリングではありません。私の提案では、スケーリングのエッジの方向を与える法線に基づいてアルゴリズムを実行する必要があります。

+0

擬似的に、THREE.FaceNormalsHelperまたはTHREE.VertexNormalsHelper。 – VVK

答えて

0

これは私がちょうど書き留めたものであり、テストセットではないコードです。しかし、これは私のやり方です。たぶんそれは何かから始まるものです。

var geo = mesh.geometry; // assuming this Geometry and not BufferGeometry 
var verts = geo.vertices; 
var faces = geo.faces; 

// vertices are used in multiple faces with different normals 
// we want to translate the vertex along the average normal 

// first, I collect all normals for each vertex 
// (it's a bit quick and dirty as I add a normals property to the Vector3 object) 
for(var i=0; i<faces.length; i++) { 
    // vertex a 
    var va = verts[faces[i].a]; 
    if(va.normals) va.normals.push(faces[i].vertexNormals[0]); // add normal to collection 
    else va.normals = [ faces[i].vertexNormals[0] ];    // otherwise create array with first element 
    // vertex b 
    var vb = verts[faces[i].b]; 
    if(vb.normals) vb.normals.push(faces[i].vertexNormals[1]); 
    else vb.normals = [ faces[i].vertexNormals[1] ]; 
    // vertex c 
    var vc = verts[faces[i].c]; 
    if(vc.normals) vc.normals.push(faces[i].vertexNormals[2]); 
    else vc.normals = [ faces[i].vertexNormals[2] ]; 
} 

// then iterate over vertices, compute average normal, and translate vertex 
for(i=0; i<verts.length; i++) { 
    var v = verts[i]; 
    var normal = computeAverageNormal(v.normals); 
    normal.multiplyScalar(offsetAmount); 
    v.add(normal); 
} 

geo.verticesNeedUpdate = true; 

function computeAverageNormal(normals) { 
    var n = new THREE.Vector3(); 
    for(var i=0; i<normals.length; i++) { 
    n.add(normals[i]); 
    } 
    n.normalize(); 
    return n; 
}