【问题标题】:Generate mesh faces for vertices in THREE.js在 THREE.js 中为顶点生成网格面
【发布时间】:2014-03-17 23:58:05
【问题描述】:

我不确定答案是否应该是显而易见的,但它让我无法理解。我正在使用three.js 的Udacity 上做3D 图形类。我正处于需要生成 3d 网格的地步。

我已经正确生成了所有顶点,但我一直在为它们生成面。我想不出一种明显的方法来自动生成不重叠的面孔。我在网上搜索和搜索,但找不到任何有关它的信息。我不确定这是否是显而易见的,或者只是没有很好的记录。代码如下:

function PolygonGeometry(sides) {
    var geo = new THREE.Geometry();

    // generate vertices
    for ( var pt = 0 ; pt < sides; pt++ )
    {
        // Add 90 degrees so we start at +Y axis, rotate counterclockwise around
        var angle = (Math.PI/2) + (pt / sides) * 2 * Math.PI;

        var x = Math.cos( angle );
        var y = Math.sin( angle );

        // YOUR CODE HERE
        //Save the vertex location - fill in the code
        geo.vertices.push( new THREE.Vector3(x, y, 0) );
    }
    // YOUR CODE HERE
    // Write the code to generate minimum number of faces for the polygon.


    // Return the geometry object
    return geo;
}

我知道最小面数的基本公式是 n-2。但我只是想不出一种方法来做到这一点而不会重叠。 我不想让任何人为我做我的工作,我想尽我所能解决这个问题。但是有没有人可以指出我正确的方向或给我一个公式或什么的?

【问题讨论】:

    标签: javascript three.js


    【解决方案1】:

    您可以自动进行三角测量

    对于大多边形,手动添加面可能是一项艰巨的工作。您可以使用THREE.Shape.Utils 中的triangulateShape 方法自动将面添加到网格中,如下所示:

    var vertices = [your vertices array]
    var holes = [];
    var triangles, mesh;
    var geometry = new THREE.Geometry();
    var material = new THREE.MeshBasicMaterial();
    
    geometry.vertices = vertices;
    
    triangles = THREE.Shape.Utils.triangulateShape ( vertices, holes );
    
    for( var i = 0; i < triangles.length; i++ ){
    
        geometry.faces.push( new THREE.Face3( triangles[i][0], triangles[i][1], triangles[i][2] ));
    
    }
    
    mesh = new THREE.Mesh( geometry, material );
    

    vertices 是您的顶点数组,holes 您可以在多边形中定义孔。

    注意:请注意,如果您的多边形是自相交的,则会引发错误。确保您的顶点数组代表一个有效的(非相交的)多边形。

    【讨论】:

    【解决方案2】:

    假设您以凹形方式和逆时针方式生成顶点,那么如果您有 3 个边(三角形),则将顶点 0 与 1 与 2 连接。如果您有 4 个边(四边形),则将顶点 0 与 1 连接用 2(第一个三角形),然后用 2 和 3 连接顶点 0。如果你有 5 个边(五边形),你连接顶点 0 和 1 和 2(第一个三角形)然后顶点 0 和 2 和 3(第二个三角形,然后顶点 0 和3 和 4。我想你明白了。

    【讨论】:

    • 所以基本上做个粉丝?我想我只是在思考这个问题哈哈。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 2018-02-03
    • 2019-03-04
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多