[英]How can I get texture to the right place when I change texture in gltf format with Three.js?
我試圖通過用THREE.TextureLoader
替換紋理來動態地改變glTF模型的紋理。 紋理的顏色按照我的預期改變,但紋理的圖案有些混合。
這是我第一次做網頁圖形。 我正在使用可以加載glTF模型的three.js重新混合一個3d模型查看器示例。 我想用按鈕動態改變紋理。 從各種格式,我選擇glTF因為它似乎是一個新的標准。 我能找到的最好的解決方案是添加texture.flipY = false;
在我的紋理加載器下面,但它不起作用。 我也試圖改變紋理對象中的一些值,但沒有發生任何事情。
這是我加載模型的地方:
loader.load( urls, function (texture) {
var pmremGenerator = new THREE.PMREMGenerator( texture );
pmremGenerator.update( renderer );
var pmremCubeUVPacker = new THREE.PMREMCubeUVPacker(pmremGenerator.cubeLods);
pmremCubeUVPacker.update( renderer );
var envMap = pmremCubeUVPacker.CubeUVRenderTarget.texture;
var loader = new THREE.GLTFLoader().setPath( `models/${modelName}/`);
loader.load(`${modelName}.gltf`, (gltf) => {
gltf.scene.traverse((child) => {
if (child.isMesh) {
child.material.envMap = envMap;
}
});
gltf.scene.scale.set(0.01,0.01,0.01)
scene.add(gltf.scene);
});
我試圖通過實現這個功能來改變它的紋理:
function changeColor(color) {
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load(`models/${modelName}/textures/fabric-${color}.jpg`);
texture.flipY = false;
scene.traverse((child) => {
if (child.isMesh) {
if (child.material.map.format === 1022) {
child.material.map = texture;
}
}
});
}
雖然我能夠定位我想要的網格並改變它的顏色,但紋理圖案非常笨拙。 它是椅子的頂部,用織物制成。
用文字畫出來,看起來像......
這是什么意思:
-------------------
| / / / / / / / / |
| / / / / / / / / |
| / / / / / / / / |
| / / / / / / / / |
| / / / / / / / / |
| / / / / / / / / |
| / / / / / / / / |
-------------------
Figure 1
現實:
-------------------
| +++++ |
| +++++ |
| ++++++++++++++ |
| ++++++++++++++ |
| ++++++++++++++ |
| +++++ |
| +++++ |
-------------------
Figure 2
要清楚:當通過上面的函數更改紋理文件時,如何保留紋理圖案,如圖1所示?
感謝DonMcCurdy的幫助,我終於得到了答案。
這確實是UV映射的問題。
為了在正確的位置獲得紋理,我需要添加以下內容:wrapS,wrapT和RepeatWrapping
function changeColor(color) {
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load(`models/${modelName}/textures/fabric-${color}.jpg`);
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;
texture.flipY = false;
scene.traverse((child) => {
if (child.isMesh) {
if (child.material.map.format === 1022) {
child.material.map = texture;
}
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.