6

我不确定答案是否应该是显而易见的,但它让我望而却步。我正在使用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。但我只是想不出一种方法来做到这一点而不会重叠。我不想让任何人为我做我的工作,我想尽可能地自己弄清楚。但是有没有人可以指出我正确的方向或给我一个公式或什么的?

4

2 回答 2

12

您可以自动进行三角测量

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

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您可以在多边形中定义孔。

注意:小心,如果你的多边形是自相交的,它会抛出一个错误。确保您的 vertices 数组表示有效(非相交)多边形。

于 2014-03-17T15:58:05.963 回答
4

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

于 2013-04-03T19:47:06.073 回答