我有一个算法,允许用户输入数据或函数,然后绘制函数图形。基本上,它是一个表面地图just like here。图形工作正常。但是,我想添加一个映射,以添加黑点,从点到点,就像在示例中一样。但是,我一直得到标准错误:GL_INVALID_OPERATION:glDrawElements:尝试访问属性2中的范围顶点。我知道这个错误意味着我试图绘制超出缓冲区范围的东西,但是我我不知道我在做什么。我已经确认用于映射的x和y长度的变量确实是x和y索引的数量。例如,我将重复设置为76和76,对于具有76个条目和76个条目的网格,因此5776个点。
在这个例子中,他们使用参数几何,我必须使用标准的THREE.Geometry,因为我有时会接收数据而不是函数。除此之外,我已经按照示例继续得到错误。我可能会对纹理上重复所需的映射数字感到困惑。我相信它们应该代表X和Y点的数量,也许它应该是别的东西。
以下是我设置网格的方法:
Surface.prototype.setMeshes =function(DataID, callback)
{ var graphMesh={};
var PlotID=this.Format_id;
if (PlotID['Chart_dataobj'][DataID]['type']=="Surface")
{ if (PlotID['Chart_dataobj'][DataID]['sWireFrame']=="Solid")
{
var wireTexture = new THREE.ImageUtils.loadTexture( 'http://www.cadwolf.com/Images/square.png' );
wireTexture.wrapS = wireTexture.wrapT = THREE.RepeatWrapping;
wireTexture.repeat.set( parseInt(PlotID['Chart_dataobj'][DataID].xLength), parseInt(PlotID['Chart_dataobj'][DataID].yLength) );
wireMaterial = new THREE.MeshBasicMaterial( { map: wireTexture, vertexColors: THREE.VertexColors, side:THREE.DoubleSide } );
wireMaterial.map.repeat.set( parseInt(PlotID['Chart_dataobj'][DataID].xLength), parseInt(PlotID['Chart_dataobj'][DataID].yLength) );
graphMesh = new THREE.Mesh( window[PlotID]['Chart_dataobj'][DataID].surfaceGeometry, wireMaterial );
graphMesh.doubleSided = true;
}
}
graphMesh.id = DataID;
graphMesh.name = DataID;
window[PlotID].Scene.add(graphMesh);
if (typeof(callback)=="function") { callback(); }
}
我知道表面几何形状的一切都是正确的,只有一个错误,我所拥有的元素数量与重复的数字相匹配。此外,如果有人知道属性2是什么,那将是有帮助的。
由于
答案 0 :(得分:0)
检查几何体以查看是否定义了UV。如果没有,那么缺少UV可能是您的错误消息的原因。
如果网格的几何体缺少UV,则网格不能应用纹理。
对于THREE.Geometry
,在属性faceVertexUVs
中指定了UV。
对于THREE.BufferGeometry
,UV被指定为几何属性。
three.js r.71