将DataTexture应用于以three.js编程生成的Mesh

时间:2013-03-02 19:31:04

标签: three.js

实际问题:

我是否需要设置超过faceVertexUvs[0]纹理网格上的材质?我不知道如何摆脱glDrawElements错误。我尝试过使用MeshPhongMaterialMeshLambertMaterial等不同材质,但坦率地说,我不确定区别是什么。我也尝试在基础几何体上调用computeVertexNormals()computeTangents()。这种消防方法在这里不起作用..

之前的说明

我正在运行时使用几何体开始构建网格,该几何体以三角形镶嵌平面开始。我通过定期更新顶点的z坐标来变形网格。这一切都很好,但我在使用带有DataTexture的材质时遇到了问题。

我收到此错误:

glDrawElements: attempt to access out of range elements in attribute 0

我认为这个消息意味着它找不到我的几何体的UV层,但这并不是因为没有尝试插入矢量。这是我的代码,它将面部加载到名为model

的Geometry中
for (j=0; j<vh-1; j++) {
for (i=0; i<vw-1; i++) {

    var a = j*vw+i;
    var b = (j+1)*vw+i;
    var c = (j*vw+i+1);
    var d = (j+1)*vw+i+1;

    model.faces.push( new THREE.Face3(a,b,c) );
    model.faces.push( new THREE.Face3(c,b,d) );

    model.faceVertexUvs[0].push( [ new THREE.Vector2(0,0),
                   new THREE.Vector2(1,1),
                   new THREE.Vector2(1,0) ] );
    model.faceVertexUvs[0].push( [ new THREE.Vector2(0,0),
                   new THREE.Vector2(1,1),
                   new THREE.Vector2(1,0) ] );

}
}

然后我将这个模型以及一个材质添加到faceMesh,然后将其添加到场景中:

var material = new THREE.MeshBasicMaterial();
var faceMesh = new THREE.Mesh(model, material);

稍后在代码中我为这个材质添加了一个纹理,这就是上面的gL错误出现的时候(在Chrome javascript控制台中)

material.map = new THREE.DataTexture(new Uint8Array(bytes, rgbByteIdx), 
                     inputW, inputH, THREE.RGBFormat);

material.needsUpdate = true;

在构建Geometry时,除了faceUVs之外,我还尝试使用faceVertexUVs。也许我需要使用MeshBasicMaterial以外的东西吗?

1 个答案:

答案 0 :(得分:2)

经过多次试验和错误,我弄明白了。

这里的问题是我最初设置的MeshBasicMaterial没有纹理。添加纹理并为此材质设置needsUpdate标志后,它继续抛出gL错误。

通过最初使用特定纹理创建我的材质(使用ImageUtils.generateDataTexture),系统接受后来添加的纹理,错误消失,我成功地在网格上绘制我的图片。 / p>

var texture = THREE.ImageUtils.generateDataTexture(inputW, inputH, initColor );
var material = new THREE.MeshBasicMaterial( { map : texture });
var faceMesh = new THREE.Mesh(model, material);