如何使用三个j来正常缩放以使对象“更厚”或“更薄”

时间:2015-03-28 21:35:55

标签: math 3d three.js

我正在试图弄清楚如何挤出已经加载的.obj对象以使其“更厚”。我想我正在寻找一种方法来缩放我的对象,而不是从它的锚点开始,而是按每个多边形法线缩放它。

一个典型的例子是采用“环”对象。如果你只用正常的比例方法进行扩展,它只会从中心变大,但我希望环变得更厚/更薄。它在电影院4d被称为“正常规模”。

以下是我目前所拥有的一些示例代码,这些代码没有给我预期的结果。

var objLoader = new THREE.OBJLoader();
var material = new THREE.MeshLambertMaterial({color:'yellow', shading:THREE.FlatShading});
objLoader.load('objects/gun/M1911.obj', function (obj) {
    obj.traverse(function (child) {
      if (child instanceof THREE.Mesh) {
        child.geometry.computeVertexNormals();
        child.material = material;
      }
    });
    obj.material = material;
    obj.scale.set(7, 7, 7);

    scene.add(obj);
});

1 个答案:

答案 0 :(得分:0)

scaleGeo: function (geo, ratio) {
    for (var i = 0; i < geo.faces.length; i++) {
        var faceI = geo.faces[i];

        var vertexArr = [faceI.a, faceI.b, faceI.c];
        for (var j = 0; j < vertexArr.length; j++) {
            var vertexJ = geo.vertices[vertexArr[j]];
            var normalJ = faceI.vertexNormals[j];

            if (vertexJ.hasScale) continue;

            vertexJ.x += normalJ.x * ratio;
            vertexJ.y += normalJ.y * ratio;
            vertexJ.z += normalJ.z * ratio;

            vertexJ.hasScale = true;
        }
    }


    return geo;
},