【问题标题】:BufferGeometry: how to render groups of facesBufferGeometry:如何渲染面组
【发布时间】:2015-09-28 23:06:16
【问题描述】:

我有 2 个几何图形和 2 个网格。主要目标有时是排除第一个几何图形的一部分(所以我需要 2 个组)并在这个时候显示第二个几何图形的一部分(总是 1 个组)。在发布 r72 之前,我使用此代码

第一几何:

bufCompaniesGeomNotActive.addDrawCall(0, geomCompaniesNotActive.faces.length * 3, 0);
bufCompaniesGeomNotActive.addDrawCall(0, 0, 0);

第二几何

bufCompaniesGeomActive.addDrawCall(0, 0, 0);

在 r72 版本中,addDrawCall 刚刚重命名为 addGroup。 但主要问题是第一个几何中的 2 个组。我试图让可见的部分像以前一样

 floor.companiesGeomNotActive.groups[0].start = 0;
 floor.companiesGeomNotActive.groups[0].count = obj.startFaceIndexNotActive * 3;

 floor.companiesGeomNotActive.groups[1].start = obj.endFaceIndexNotActive * 3;
 floor.companiesGeomNotActive.groups[1].count = lengthNotActive - obj.endFaceIndexNotActive * 3;

但没有成功。 我找到了 companiesGeomActive.setDrawRange(obj.startFaceIndexActive * 3, 3 * (obj.endFaceIndexActive - obj.startFaceIndexActive)); 方法,它可以工作,但是如何为多个组设置范围?

【问题讨论】:

    标签: javascript three.js


    【解决方案1】:

    BufferGeometry.groups 现在用于支持MultiMaterial(以前称为 MeshFaceMaterial)。

    geometry.clearGroups();
    geometry.addGroup( start1, count1, 0 ); // materialIndex 0
    geometry.addGroup( start2, count2, 1 ); // materialIndex 1
    
    var material = new THREE.MultiMaterial( materialsArray );
    var mesh = new THREE.Mesh( geometry, material );
    

    如果你有一个单一的材质并且想要渲染子组的面,你可以使用这样的模式:

    geometry.clearGroups();
    geometry.addGroup( start1, count1, 0 ); // zero
    geometry.addGroup( start2, count2, 0 ); // zero
    
    var materialsArray = [ material ];
    var material = new THREE.MultiMaterial( materialsArray );
    var mesh = new THREE.Mesh( geometry, material );
    

    当材料为MultiMaterial时,geometry.drawRange被忽略。

    three.js r.72

    【讨论】:

    猜你喜欢
    • 2015-04-22
    • 2016-08-08
    • 2018-10-06
    • 2019-04-13
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多