从顶点和顶点法线添加几何

时间:2014-12-25 09:14:35

标签: three.js

我加载了一个顶点和顶点nromal的模型,

for (var i = 0, vindex = 0; i < triangle.length; i++, vindex += 3) {

            x = parseFloat(triangle[i].attributes.getNamedItem('x1').value);
            y = parseFloat(triangle[i].attributes.getNamedItem('y1').value);
            z = parseFloat(triangle[i].attributes.getNamedItem('z1').value);
            this.geometry.vertices.push(new THREE.Vector3(x * scale + this.translateVector.x, y * scale + this.translateVector.y, z * scale + this.translateVector.z));

            x = parseFloat(triangle[i].attributes.getNamedItem('x2').value);
            y = parseFloat(triangle[i].attributes.getNamedItem('y2').value);
            z = parseFloat(triangle[i].attributes.getNamedItem('z2').value);
            this.geometry.vertices.push(new THREE.Vector3(x * scale + this.translateVector.x, y * scale + this.translateVector.y, z * scale + this.translateVector.z));

            x = parseFloat(triangle[i].attributes.getNamedItem('x3').value);
            y = parseFloat(triangle[i].attributes.getNamedItem('y3').value);
            z = parseFloat(triangle[i].attributes.getNamedItem('z3').value);
            this.geometry.vertices.push(new THREE.Vector3(x * scale + this.translateVector.x, y * scale + this.translateVector.y, z * scale + this.translateVector.z));

            var face = new THREE.Face3(vindex, vindex + 1, vindex + 2);
            face.color.setHex(this.faceColor || this.defaultcolor);
            face.vertexNormals = [];

            nx = parseFloat(triangle[i].attributes.getNamedItem('nx1').value);
            ny = parseFloat(triangle[i].attributes.getNamedItem('ny1').value);
            nz = parseFloat(triangle[i].attributes.getNamedItem('nz1').value);
            face.vertexNormals.push(new THREE.Vector3(-nx, -ny, -nz));

            nx1 = parseFloat(triangle[i].attributes.getNamedItem('nx2').value);
            ny1 = parseFloat(triangle[i].attributes.getNamedItem('ny2').value);
            nz1 = parseFloat(triangle[i].attributes.getNamedItem('nz2').value);
            face.vertexNormals.push(new THREE.Vector3(-nx1, -ny1, -nz1));

            nx2 = parseFloat(triangle[i].attributes.getNamedItem('nx3').value);
            ny2 = parseFloat(triangle[i].attributes.getNamedItem('ny3').value);
            nz2 = parseFloat(triangle[i].attributes.getNamedItem('nz3').value);
            face.vertexNormals.push(new THREE.Vector3(-nx2, -ny2, -nz2));

            face.normal.set((nx + nx1 + nx2) / 3, (ny + ny1 + ny2) / 3,(nz + nz1 + nz2) / 3);

            this.geometry.faces.push(face);
            }

this.material = new THREE.MeshBasicMaterial({ vertexColors: THREE.FaceColors, overdraw: true , opacity: 1, transparent: 0 });

        this.mesh = new THREE.Mesh(this.geometry, this.material);
        this.mesh.name = this.id;

        this.mesh.updateMatrix();
        this.mesh.matrixAutoUpdate = false;

        scene.add(this.mesh);
下面的房子,前面是看不见的,所以前墙和左墙是看不见的,我们可以看到房子的内部,但我希望它显示所有的墙壁,而不是透视,任何人都可以帮助我吗?

enter image description here

在我改为兰伯特材料后,它仍然显示房子内部,我尝试过,cw,ccw或反转顶点索引,反转正常。任何人都可以帮忙吗?

enter image description here

2 个答案:

答案 0 :(得分:0)

脸部紫外线可能有问题。尝试将材料双面涂抹。

答案 1 :(得分:0)

似乎找到了答案。

那是因为房屋模型的一部分位置.z&lt; 0,相机附近&lt; 0,也许是three.js z-buffer clear negative = 0,z-buffer决定了sheltery关系。