自定义UVGenerator - howto?

时间:2016-08-25 15:24:53

标签: three.js

我有一个用例,用户可以在其中指定纹理,然后将纹理映射到多个面上的对象。所以不幸的是我不能像Blender一样使用标准的UV映射,因此想要编写我自己的自定义UVGenerator来创建我自己的投影。 所以我正在寻找详细信息如何做到这一点。

我知道THREE.ExtrudeGeometry.WorldUVGenerator可以作为位于src/extras/geometries/ExtrudeGeometry.js

的示例

在那里,我找到了两种方法,我不确定如何一起工作。第一个是generateTopUV,它基本上将3个顶点作为参数,并期望我返回三对u / v值。所以这个方法很简单。

generateTopUV: function ( geometry, indexA, indexB, indexC ) 

第二个对我来说很奇怪,因为它需要四个顶点,我想知道为什么这个名字并没有真正帮助我。希望某人能够对此有所了解。

WorldUVGenerator的代码是:

generateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {
    var vertices = geometry.vertices;

    var a = vertices[ indexA ];
    var b = vertices[ indexB ];
    var c = vertices[ indexC ];
    var d = vertices[ indexD ];

    if ( Math.abs( a.y - b.y ) < 0.01 ) {

        return [
            new THREE.Vector2( a.x, 1 - a.z ),
            new THREE.Vector2( b.x, 1 - b.z ),
            new THREE.Vector2( c.x, 1 - c.z ),
            new THREE.Vector2( d.x, 1 - d.z )
        ];

    } else {

        return [
            new THREE.Vector2( a.y, 1 - a.z ),
            new THREE.Vector2( b.y, 1 - b.z ),
            new THREE.Vector2( c.y, 1 - c.z ),
            new THREE.Vector2( d.y, 1 - d.z )
        ];

    }

}

干杯汤姆

2 个答案:

答案 0 :(得分:0)

最后,我通过将geometry.faceVertexUvs设置为一个数组数组来解决这个问题,其中内部数组包含3个给出uv值的vector2&#39; s。

很好地工作:-)并且不需要处理4个顶点

答案 1 :(得分:0)

顶部和底部UV生成过程中的三个顶点各自定义一个三角形。

(单独)将侧壁创建为一串矩形,然后将每个矩形分成两个共面三角形。这四个顶点定义一个矩形。

如果请求了斜角,则它是此矩形处理的一部分。