0

我想创建自己的模型格式。为此,我正在尝试创建自定义几何。我可以正确导入几何图形。即使我将它们添加到几何体中,也不会渲染 Bur 面法线。

这是输入文件:

# Coordinates
    0e+0 0e+0 0e+0
    1e+0 0e+0 0e+0
    1e+0 0e+0 1e+0
    0e+0 0e+0 1e+0
    0e+0 1e+0 0e+0
    1e+0 1e+0 0e+0
    1e+0 1e+0 1e+0
    0e+0 1e+0 1e+0
# Normals
0e+0 0e+0 -1e+0
0e+0 -1e+0 0e+0
0e+0 0e+0 1e+0
0e+0 1e+0 0e+0
1e+0 0e+0 0e+0
-1e+0 0e+0 0e+0

# Connectivity List
1 2 6 5
1 2 3 4
3 4 8 7
6 5 8 7
2 6 7 3
1 5 8 4

这是我导入它的方式。

    var geometry = new THREE.Geometry();

    //Add all positions to geometry
    for (var g=0;g<coordinates.length;g++){
        geometry.vertices.push(coordinates[g]);

    }

    for(var l=0;l<connectivity.length;l++){

        //sml file have rectangular faces but three js uses triangular faces (THREE.Face4 is deprecated) so converting 4 vertex faces to 3 verex faces 
        var index0= connectivity[l][3]-1;
        var index1= connectivity[l][4]-1;
        var index2= connectivity[l][5]-1;
        var index3= connectivity[l][6]-1;

        //If normals is exist thenaddthem to face array too

        if(normals.length==connectivity.length){

            console.log("Normals are exist");

            var face0=  new THREE.Face3(index0,index1,index2); 
            face0.normal.set(normals[l]);

            geometry.faces.push(face0);

            var face1=  new THREE.Face3(index2,index3,index0);
            face1.normal.set(normals[l]);

            geometry.faces.push(face1); 

        } else{

            console.log("Normals are not exist");

            var face0=  new THREE.Face3(index0,index1,index2);
            geometry.faces.push(face0);
            var face1= new THREE.Face3(index2,index3,index0);

            geometry.faces.push(face1); 
        }
    }

    geometry.computeBoundingBox();
    // geometry.compteVertexNormals();
    geometry.computeFaceNormals();

在代码中,我将面(连接列表)数组中的四边形转换为三角形,而 thee.js 不推荐使用 FACE4。我为共享相同四边形的两个三角形分配了相同的法线。

这是这个盒子的渲染方式:

框渲染

我错过了什么吗?

4

1 回答 1

0

以下行不使用正确的语法。

face0.normal.set(normals[l]);
...
face1.normal.set(normals[l]);

Face3.normal是一个Vector3,并Vector3.set接受 3 个参数

如果normals[l]xyz属性:

face0.normal.set(normals[l].x, normals[l].y, normals[l].z);

将正确设置它。

或者,您可以将法线作为 a 传递给Vector3构造Face3函数。有关更多信息,请参阅此处的文档。

根据新信息:

由于normals[l]已经是 a Vector3,您应该使用Vector3.copy而不是set

face0.normal.copy(normals[l]);

也就是说,因为它a Vector3,所以你真的应该将它包含在构造函数中,就像我上面提到的那样。

于 2017-10-02T15:54:04.050 回答