我正在开发一个编辑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。:对不起图片。由于我的声誉,我还无法发布图片。
答案 0 :(得分:0)
我花了几个小时调整我的代码以获得所需的结果,最后,我终于可以解决我的问题了。问题是geometry.faceVertexUvs
的UV数组元素被缓存在ThreeJS核心的某个地方。
我之前的UV映射代码是将Vector2
数组直接分配给geometry.faceVertexUvs
:
geo.faceVertexUvs[0][side] = [faces[1], faces[2], faces[0]];
第一次它可以工作,但下次它会被缓存,即使我将UV标记为脏(geo.uvsNeedUpdate = true
),所以不是分配数组,而是最终复制Vector2
从faces
数组到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的文档中进行了解释。