aframe - Aframe 纹理更改
问题描述
我正在编写以下脚本。更改 .glb 模型的图像。它只产生白色。没有发生适当的纹理变化。请帮我。
const nextButtonComponent = () => ({
init: function() {
const model = document.getElementById('model')
const nextButton = document.getElementById('nextbutton')
const loader = new THREE.TextureLoader();
var material = new THREE.MeshStandardMaterial({
side: THREE.DoubleSide,
flatShading: true,
});
const mesh = model.getObject3D('mesh');
nextButton.style.display = 'block';
const nextAnimation = () => {
loader.load( './assets/img/1.jpg' ,
function(texture){
material.map = texture;
material.needsUpdate = true;
if(mesh){
mesh.traverse((node) => {
if (node.isMesh) {
node.material = material;
node.material.map = texture;
node.material.needsUpdate = true;
}
});
}
});
}
nextButton.onclick = nextAnimation // Switch to the next animation when the button is pressed.
}
})
export {nextButtonComponent}
解决方案
我有另一个解决方案。这对我有用。
我正在使用THREE.ImageUtils.loadTexture(src)
export const textureSwapComponent = {
init: function() {
const nextButton = document.getElementById('nextbutton');
nextButton.style.display = 'block';
let src1 = document.getElementById('imageFile1').src;
let src2 = document.getElementById('imageFile2').src;
let src3 = document.getElementById('imageFile3').src;
// this.ImageUtils = THREE.ImageUtils();
this.text = document.getElementById('textDebug')
const model = document.getElementById('model')
this.mesh = model.getObject3D('mesh');
this.material = new THREE.MeshStandardMaterial({
// map : ImageUtils.loadTexture(src1),
side: THREE.DoubleSide,
flatShading: true,
});
model.addEventListener('model-loaded', (e) => {
this.mesh = model.getObject3D('mesh');
if(this.mesh){
this.debugDisplay('Mesh Ok');
nextAnimation();
}else{
this.debugDisplay('Mesh Not Ok');
}
})
let idx = 0;
const nextAnimation = () => {
this.debugDisplay('On Click');
var src = src1;
if(idx >=3){
idx = 0;
}
switch(idx){
case 0:
src = src1;
break;
case 1:
src = src2;
break;
case 2:
src = src3;
break;
}
this.texture = THREE.ImageUtils.loadTexture(src);
idx ++;
if(this.mesh){
this.debugDisplay('Mesh Ok');
this.mesh.traverse((node) => {
if (node.isMesh) {
if(node.material !== this.material){
node.material = this.material;
}
node.material.map = this.texture;
node.material.needsUpdate = true;
}
});
}else{
this.debugDisplay('Mesh Not Ok');
}
}
nextButton.onclick = nextAnimation
},
debugDisplay : function(val){
this.text.setAttribute('value', val);
}
}
推荐阅读
- audio - 如何使用 ffmpeg 多次连接一个 mp3 文件(包括交叉淡入淡出)?
- azure - 合并天蓝色活动目录
- r - 如何将 glm 摘要取消列出到日期框架中
- oauth-2.0 - JWK 什么时候到期?JWKS 轮换政策
- python - Flask 分页不适用于 AWS Chalice
- dns - 将子域映射到公共 ip 和端口
- reactjs - SingleDatePicker 聚焦 (react-dates) => 返回错误
- unit-testing - 如何在 Go 中对异步事件进行单元测试
- sql - 如果键数组在另一个表中,如何从字段中提取键 - Redshift,SQL
- node.js - 我想在两个 mongo dB mongoose 列表数组中连接相同的项目