THREE.js 使用 JSONLoader 重复 UV 纹理
THREE.js repeating UV texture using JSONLoader
我需要帮助才能在 three.js 中正确渲染 UV 纹理。我在 Blender 中创建了一个具有重复瓷砖纹理的模型。瓦片纹理是使用 UV 映射应用的,如果渲染正确,它看起来像这样:
Render image using Blender
.然而,当 three.js 使用 JSONLoader 加载它时,瓷砖只是被拉伸以填充每个多边形,给出了这样奇怪的结果:Screenshot of render using three.js
.我试过在我的代码中设置 THREE.RepeatWrapping 但没有任何改变:
bodyLoader = new THREE.JSONLoader();
bodyLoader.load('./starofthesea_threejs.json', function(geometry, materials) {
mainBodyMaterials = new THREE.MeshFaceMaterial(materials);
console.log(materials);
mainBodyMaterials.wrapS = THREE.RepeatWrapping;
mainBodyMaterials.wrapT = THREE.RepeatWrapping;
mainBodyMaterials.needsUpdate = true;
mainBody = new THREE.Mesh(geometry, mainBodyMaterials);
mainBody.traverse ( function (child) {
if (child instanceof THREE.Mesh) {
child.castShadow = true;
child.receiveShadow = true;
}
});
mainBody.scale.x = mainBody.scale.y = mainBody.scale.z = 1;
geometry.computeBoundingBox();
geometry.computeFaceNormals();
geometry.computeFlatVertexNormals();
scene.add(mainBody);
});
我的代码有什么问题吗,或者有什么解决方法可以正确呈现它?非常感谢所有帮助。
最后我自己解决了问题,Blender模型和JS都配置错误。 RepeatWrapping 应该应用于纹理,而不是material。我需要研究 THREE.MeshFaceMaterial 的结构来找到底层纹理的句柄。我需要遍历 materials 找出所有带有图像纹理的 materials:
mainBodyMaterials = new THREE.MeshFaceMaterial(materials);
for(prop in mainBodyMaterials.materials) {
if(mainBodyMaterials.materials[prop].map != null) {
mainBodyMaterials.materials[prop].map.wrapS = THREE.RepeatWrapping;
mainBodyMaterials.materials[prop].map.wrapT = THREE.RepeatWrapping;
tex.push(mainBodyMaterials.materials[prop].map.clone());
tex[tex_sequence].needsUpdate = true;
tex_sequence++;
}
}
在正确应用 wrapS 和 wrapT 到纹理后,其中一个 materials 得到正确渲染,但 'Texture marked for update but image is undefined' 错误不断抛出。根据另一个问题,我需要克隆纹理以消除错误:
由于有几个 materials 有重复的图块,我需要在 JS 例程的开头创建一个全局数组,并在遍历 materials 时将修改后的纹理一张一张地推送:
var tex = new Array();
var tex_sequence = 0;
修复 JS 调用后,其中一个纹理仍然无法正常工作。我忘记了 three.js 只允许 ONE 个 UV 插槽。我需要在 Blender 中的同一个 UV 插槽下再次展开 UV。一切正常,我希望我的痛苦经历可以帮助那些被类似问题抓狂的人。
我需要帮助才能在 three.js 中正确渲染 UV 纹理。我在 Blender 中创建了一个具有重复瓷砖纹理的模型。瓦片纹理是使用 UV 映射应用的,如果渲染正确,它看起来像这样: Render image using Blender .然而,当 three.js 使用 JSONLoader 加载它时,瓷砖只是被拉伸以填充每个多边形,给出了这样奇怪的结果:Screenshot of render using three.js .我试过在我的代码中设置 THREE.RepeatWrapping 但没有任何改变:
bodyLoader = new THREE.JSONLoader();
bodyLoader.load('./starofthesea_threejs.json', function(geometry, materials) {
mainBodyMaterials = new THREE.MeshFaceMaterial(materials);
console.log(materials);
mainBodyMaterials.wrapS = THREE.RepeatWrapping;
mainBodyMaterials.wrapT = THREE.RepeatWrapping;
mainBodyMaterials.needsUpdate = true;
mainBody = new THREE.Mesh(geometry, mainBodyMaterials);
mainBody.traverse ( function (child) {
if (child instanceof THREE.Mesh) {
child.castShadow = true;
child.receiveShadow = true;
}
});
mainBody.scale.x = mainBody.scale.y = mainBody.scale.z = 1;
geometry.computeBoundingBox();
geometry.computeFaceNormals();
geometry.computeFlatVertexNormals();
scene.add(mainBody);
});
我的代码有什么问题吗,或者有什么解决方法可以正确呈现它?非常感谢所有帮助。
最后我自己解决了问题,Blender模型和JS都配置错误。 RepeatWrapping 应该应用于纹理,而不是material。我需要研究 THREE.MeshFaceMaterial 的结构来找到底层纹理的句柄。我需要遍历 materials 找出所有带有图像纹理的 materials:
mainBodyMaterials = new THREE.MeshFaceMaterial(materials);
for(prop in mainBodyMaterials.materials) {
if(mainBodyMaterials.materials[prop].map != null) {
mainBodyMaterials.materials[prop].map.wrapS = THREE.RepeatWrapping;
mainBodyMaterials.materials[prop].map.wrapT = THREE.RepeatWrapping;
tex.push(mainBodyMaterials.materials[prop].map.clone());
tex[tex_sequence].needsUpdate = true;
tex_sequence++;
}
}
在正确应用 wrapS 和 wrapT 到纹理后,其中一个 materials 得到正确渲染,但 'Texture marked for update but image is undefined' 错误不断抛出。根据另一个问题,我需要克隆纹理以消除错误:
var tex = new Array();
var tex_sequence = 0;
修复 JS 调用后,其中一个纹理仍然无法正常工作。我忘记了 three.js 只允许 ONE 个 UV 插槽。我需要在 Blender 中的同一个 UV 插槽下再次展开 UV。一切正常,我希望我的痛苦经历可以帮助那些被类似问题抓狂的人。