WebGL/Three.js一个复杂对象(网格)上的不同材质
WebGL / Three.js Different materials on one complex object (grid)
为了提高性能,我将网格渲染为一个THREE.Geometry()对象:
build : function(){ // simplified
square = new THREE.Geometry();
face = 0;
for( r = 0; r < this["rows"]; r++)
for( c = 0; c < this["cols"]; c++)
// creates square
square.vertices.push(new THREE.Vector3( x, y, z));
square.vertices.push(new THREE.Vector3( x + w, y, z));
square.vertices.push(new THREE.Vector3( x + w, y - h, z));
square.vertices.push(new THREE.Vector3( x, y - h, z));
square.faces.push(new THREE.Face4(face + 0, face + 1, face + 2, face + 3));
face+=4;
// end of loops
// This adds material to the whole grid.
// How to do it to each individual square?
squareMaterial = new THREE.MeshBasicMaterial({
color:"white",
side:THREE.DoubleSide
});
grid = new THREE.Mesh(square, squareMaterial);
scene.add(grid);
比方说,我有一个函数,从网格中选择一组顶点(一个正方形),然后如何仅将颜色应用于这组顶点(正方形)?
在代码中,您使用一种材质创建一个对象网格。不能为对象的一部分设置新材质。在您的情况下,您可以编写自己的着色器,并将它们设置为属性(例如posx、posy和textere),或者按部分绘制网格(但这是个坏主意)
首先:将网格创建为具有多个线段(10x10)的平面几何体:
var planeGeo = new THREE.PlaneGeometry( 100, 100, 10, 10 );
第二:为你想改变材料(如颜色)的任何面设置materialIndex
像这样:
planeGeo.faces[5].materialIndex=1;
注意:默认materialIndex为0;
然后创建两个或多个材料并将其放入阵列中:
var materialsArray= [
new THREE.MeshBasicMaterial({color:0xFF0000, side:THREE.DoubleSide}), // matIdx = 0
new THREE.MeshBasicMaterial({color:0x00FF00, side:THREE.DoubleSide}) // matIdx = 1
];
然后创建一个多材料:
var multiMaterial = new THREE.MeshFaceMaterial( materialsArray );
然后创建网格并将其添加到场景中:
grid = new THREE.Mesh(planeGeo, squareMaterial);
scene.add(grid);
希望有帮助,
M。
PS:
也许你必须绕X或Z轴旋转planeGeo 180度——我认为PlaneGeometry是在法线向下的情况下创建的——但不确定。
如果需要,你可以通过进行轮换
planeGeo.applyMatrix ( new THREE.Matrix4().makeRotationX(Math.PI) );
相关文章:
- 如何传递具有多个网格对象的数组
- 剑道网格-插入具有外部列的新对象失败
- 我该如何解决这个问题;参考网格”;在JavaScript中完成的对象数
- Three.js:我可以创建网格来替换很多对象吗
- 获取网格视图行中对象的类型
- 在三个.js中加载多个 Blender 导出的对象/网格 + 材质
- JQuery 可拖动 - 防止网格对象移动到同一位置
- 将现有的剑道网格绑定到新的 JSON 对象
- 在下拉列表中使用多个对象类型为数据网格提供筛选
- 从本地 json 对象加载数据的灵活网格
- 将本地 JSON 对象加载到网格中的 extjs
- 剑道网格 :对数组对象进行过滤
- 在WebGL中渲染多网格对象时,背景(画布)颜色将消失
- Kendo序列化的Javascript数组网格对象属性在服务器上为null
- (three.js)-任何动态创建纹理并应用于网格对象的方法
- extjs网格不显示预期的数据,即使存储,列存在于网格对象
- 用indexedDB存储一个three.js网格对象
- 通过AJAX发送表/网格对象
- 在程序生成的城市中,在three.js网格对象中关联数据
- 从包含ng网格对象的状态转换不起作用