使用 FBX Loader 在 React 3 Fiber 中更改 Material
Change Material in React Three Fiber using FBX Loader
我正在尝试更改我导入的 FBX 文件的 material。我可以轻松更改已附加到我的 FBX 文件的 material 的属性,但我无法将 material 更改为预定义的“matAluMedium”。我以前在另一个项目中这样做过,但想不通,这次我做错了什么。
希望能帮到你
init();
function init() {
const cubeTexureloader = new CubeTextureLoader();
envMap = cubeTexureloader.load([
"assets/models/textures/envMap/px.jpg",
"assets/models/textures/envMap/nx.jpg",
"assets/models/textures/envMap/py.jpg",
"assets/models/textures/envMap/ny.jpg",
"assets/models/textures/envMap/pz.jpg",
"assets/models/textures/envMap/nz.jpg",
]);
matAluMedium = new MeshStandardMaterial({
color: 0x98720b,
roughness: 0.2,
metalness: 1,
envMap: envMap,
});
}
function newFBX(props) {
const fbx = useLoader(FBXLoader, "assets/models/" + props.path + ".fbx");
fbx.traverse( function ( child ) {
if ( child instanceof Mesh ) {
child.material = matAluMedium;
}
} );
return
(<mesh>
<primitive object={fbx} dispose={null} />
</mesh>)
};
所以我做了一个解决方法来解决我的问题。我不知道为什么,但是当我用“foreach”替换“traverse”时,它起作用了。然而...?
也许有人可以解释我为什么。
这是我的工作代码:
const fbx = useLoader(FBXLoader, "assets/models/" + props.path + ".fbx");
fbx.children.forEach((mesh, i) => {
mesh.material = matAluBright;
});
我正在尝试更改我导入的 FBX 文件的 material。我可以轻松更改已附加到我的 FBX 文件的 material 的属性,但我无法将 material 更改为预定义的“matAluMedium”。我以前在另一个项目中这样做过,但想不通,这次我做错了什么。
希望能帮到你
init();
function init() {
const cubeTexureloader = new CubeTextureLoader();
envMap = cubeTexureloader.load([
"assets/models/textures/envMap/px.jpg",
"assets/models/textures/envMap/nx.jpg",
"assets/models/textures/envMap/py.jpg",
"assets/models/textures/envMap/ny.jpg",
"assets/models/textures/envMap/pz.jpg",
"assets/models/textures/envMap/nz.jpg",
]);
matAluMedium = new MeshStandardMaterial({
color: 0x98720b,
roughness: 0.2,
metalness: 1,
envMap: envMap,
});
}
function newFBX(props) {
const fbx = useLoader(FBXLoader, "assets/models/" + props.path + ".fbx");
fbx.traverse( function ( child ) {
if ( child instanceof Mesh ) {
child.material = matAluMedium;
}
} );
return
(<mesh>
<primitive object={fbx} dispose={null} />
</mesh>)
};
所以我做了一个解决方法来解决我的问题。我不知道为什么,但是当我用“foreach”替换“traverse”时,它起作用了。然而...? 也许有人可以解释我为什么。
这是我的工作代码:
const fbx = useLoader(FBXLoader, "assets/models/" + props.path + ".fbx");
fbx.children.forEach((mesh, i) => {
mesh.material = matAluBright;
});