Three.js 管理几何体上的顶点/面颜色(r71与r73)
我正在尝试在我的应用程序中升级ThreeJS的发布版本。我将在3D场景中显示一些网格,并允许用户设置它们的颜色映射。网格可以通过两种方式着色,即通过顶点着色或通过面着色 创建网格材质时,我将vertexColors属性设置为THREE.vertexColors或THREE.FaceColors,具体取决于我想要的行为 在rev71上,我实现了如下颜色更改:Three.js 管理几何体上的顶点/面颜色(r71与r73),three.js,Three.js,我正在尝试在我的应用程序中升级ThreeJS的发布版本。我将在3D场景中显示一些网格,并允许用户设置它们的颜色映射。网格可以通过两种方式着色,即通过顶点着色或通过面着色 创建网格材质时,我将vertexColors属性设置为THREE.vertexColors或THREE.FaceColors,具体取决于我想要的行为 在rev71上,我实现了如下颜色更改: var geometry = mesh.geometry; /* For each face, change it's face colou
var geometry = mesh.geometry;
/* For each face, change it's face colour or vertex colour */
for(var i = 0; i < geometry.faces.length; i++) {
if (colourFace) {
geometry.faces[i].color = myColorFace;
} else {
geometry.faces[i].vertexColors =
[myColorVert1, myColorVert2, myColorVert3];
}
}
然后WebGLRenderer使用buffergeometry属性来更新WebGL数组缓冲区(在我的例子中是颜色缓冲区)。似乎在从网格更新几何体时,WebGLGeometry的几何体永远不会更新
是否有人有解决方案,或者我是否应该发布问题或请求来解决问题?添加/删除设置超时以查看更改:
setTimeout(函数(){
对于(变量i=0;i
在添加网格(即无超时)后的下一次渲染调用之前修改颜色时,它会起作用
在下一次渲染调用后修改颜色时,它将不起作用
我深入研究了3JS代码,发现geometry用于生成DirectGeometry,然后生成BufferGeometry,并将其推送到GPU。修改几何图形后,不会更新DirectGeometry。请看第333行
BufferGeometry似乎已使用DirectGeometry正确更新,但DirectGeometry仅创建一次,从未更新。为了测试,我成功地破解了ThreeJS,只要在需要时更新DirectGeometry,一切都正常
我考虑发送一个拉请求,但我不确定我是否会遵守规则。至少有2-3种方法可以解决这些问题,但可能我没有正确使用这些功能;) 如我在评论中所述,您不能重新分配颜色(使用
=
),必须使用copy()
或set()
更改颜色。更改颜色时,还需要设置colorsenedupdate
标志
使用您的示例,首先创建几何体,并在渲染之前实例化顶点颜色数组:
for (var i = 0; i < size; i++) {
face = faces[i];
var color = new THREE.Color( 1, 0, 1 );
face.vertexColors = [ color, color, color ];
}
for(变量i=0;i
渲染后,更新颜色,如下所示:
for (var i = 0; i < size; i++) {
face = faces[i];
var color = new THREE.Color().setHSL( (i / size) * 0.8, 1.0, 0.5 );
// change colors
face.vertexColors[ 0 ].copy( color );
face.vertexColors[ 1 ].copy( color );
face.vertexColors[ 2 ].copy( color );
}
mesh.geometry.colorsNeedUpdate = true;
for(变量i=0;i
小提琴:
three.js r.74试试r.74。另外,不要用
=
使用copy()
或set()
重新分配颜色。在应用更改后,rev73/74仍然无法工作,我快速查看了ThreeJS代码,似乎在WebGLGeometrics上创建了BufferGeometrics以将其发送到GPU之后,此缓冲区几何图形在其关联的几何图形被修改时从不更新。是否设置了必要的needsUpdate
标志?否则,请通过编辑提供问题的简单工作示例。代码片段不够。好的,它正在工作,谢谢:)我正在尝试更好地理解ThreeJS如何与WebGL一起工作,但我似乎还需要很长时间才能做到:oYou使用调试器逐步检查three.js源代码是正确的。这是一个很好的方式开始让你的手臂围绕它。
for (var i = 0; i < size; i++) {
face = faces[i];
var color = new THREE.Color( 1, 0, 1 );
face.vertexColors = [ color, color, color ];
}
for (var i = 0; i < size; i++) {
face = faces[i];
var color = new THREE.Color().setHSL( (i / size) * 0.8, 1.0, 0.5 );
// change colors
face.vertexColors[ 0 ].copy( color );
face.vertexColors[ 1 ].copy( color );
face.vertexColors[ 2 ].copy( color );
}
mesh.geometry.colorsNeedUpdate = true;