更改纹理大小时的UV映射问题

时间:2016-08-26 15:01:19

标签: javascript 3d three.js

我正在开发一个编辑Minecraft模型的应用程序。我使用ThreeJS显示在3D播放器模型上映射的绘制纹理,但是存在与纹理大小变化相关的问题。

所以,最初我在模型上映射了一个纹理,如this,当我将纹理高度更改为64时,它变得像this

我创建这样的纹理:

/* Texture */
var texture = new THREE.Texture(canvas);

texture.minFilter = texture.magFilter = THREE.NearestFilter;

其中canvas是HTMLCanvasElement,而当画布'内容被更改,我刷新纹理:

this.skin.render(canvas.getContext("2d"), this.skin.w, this.skin.h);

this.limbs.forEach(function (limb) {
    limb.mapUV(self.skin.w, self.skin.h);
});

this.material.map.needsUpdate = true;
this.material.needsUpdate = true;

this.material是双面透明材料,上面附有纹理。紫外线似乎是正确的。

我通过重新创建整个网格来修复我之前的应用程序中的类似问题,但是对于这种情况,它看起来很昂贵。

我该如何解决?它似乎是缓存的纹理或其他东西,如果我是对的,我怎么能解开呢?

感谢您的关注!

P.S。:对不起图片。由于我的声誉,我还无法发布图片。

1 个答案:

答案 0 :(得分:0)

我花了几个小时调整我的代码以获得所需的结果,最后,我终于可以解决我的问题了。问题是geometry.faceVertexUvs的UV数组元素被缓存在ThreeJS核心的某个地方。

我之前的UV映射代码是将Vector2数组直接分配给geometry.faceVertexUvs

geo.faceVertexUvs[0][side] = [faces[1], faces[2], faces[0]];

第一次它可以工作,但下次它会被缓存,即使我将UV标记为脏(geo.uvsNeedUpdate = true),所以不是分配数组,而是最终复制Vector2faces数组到geo.faceVertexUvs[0][side]中的每个三角形顶点:

geo.faceVertexUvs[0][side][0].copy(faces[1]);
geo.faceVertexUvs[0][side][1].copy(faces[2]);
geo.faceVertexUvs[0][side][2].copy(faces[0]);

我希望这(如何正确映射UV)在ThreeJS的文档中进行了解释。