【问题标题】:Remove adjoining faces in three.js删除three.js中的相邻面
【发布时间】:2014-04-30 06:17:48
【问题描述】:

我正在尝试优化基于图像像素数据渲染立方体的场景:

http://jsfiddle.net/majman/4sukB/

代码只是检查图像中的每个像素并相应地创建和定位立方体网格。

但是,正如您所看到的,如果您打开线框,则会出现大量不必要的内部面。

我正在使用 mergeVerticesTHREE.GeometryUtils.merge - 所以事情得到了部分优化。

我遇到了比较合并几何体的所有面的this approach,但是因为每个立方体面现在都是一对三角形 - 它们很难比较,因为相邻面的两个三角形将被翻转。

我也看过 minecraft 示例,但我无法理解这种方法。

【问题讨论】:

  • 修改BoxGeometry 构造函数,使相邻立方体的对角线始终对齐,而不是相互交叉。然后,具有相同质心的面必须是背靠背的。
  • 感谢韦斯特!在几何体创建后,我曾尝试调整面的 a、b、c 属性,但没有成功。
  • 似乎在r67 中删除了 centroid/computeCentroid。无法真正弄清楚为什么,但现在事情又出问题了。 @WestLangley 除了修改更多原始 src 之外,还有什么变通办法?
  • 自己计算。 centroid.addVectors( va, vb ).add( vc ).divideScalar( 3 );

标签: javascript three.js


【解决方案1】:

好的,在 WestLangley 的帮助下 - 我能够到达那里。

http://jsfiddle.net/majman/4sukB/2/

花了一些时间来确定在 buildPlane 中要调整哪些面。之后,比较质心就相对简单了:

        function removeDuplicateFaces(geometry){
            for(var i=0; i<geometry.faces.length; i++){
                var centroid = geometry.faces[i].centroid;
                for(var j=0; j < i; j++){
                    var f2 = geometry.faces[j];
                    if( f2 !== undefined ){
                        var centroid2 = f2.centroid;
                        if(centroid.equals(centroid2)){
                            delete geometry.faces[i];
                            delete geometry.faces[j];
                        }
                    }
                }
            }
            geometry.faces = geometry.faces.filter( function(a){ return a!== undefined });
            return geometry;
        }

【讨论】:

  • 谢谢你!你的小提琴帮了我很多忙。
猜你喜欢
  • 1970-01-01
  • 2015-10-15
  • 2019-06-17
  • 2015-11-29
  • 1970-01-01
  • 2019-10-06
  • 2014-02-11
  • 2018-11-28
  • 1970-01-01
相关资源
最近更新 更多