Как добавить пользовательские материалы для 3D-объектов (.mtl) поверх пользовательских 3D-объектов (.obj)? - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь визуализировать 3d-объект, используя реагирующее три-волокно. Мне удалось импортировать пользовательский 3d-объект, но я не могу применить пользовательский материал к объекту. Любая помощь могла бы быть полезна. Ниже приведен код, который я пробовал до сих пор

let mat = useLoader(MTLLoader,'/public/IronMan.mtl')
    const objec = useLoader(OBJLoader,url, object =>
      {

        object.setMaterials(mat)
        console.log(object)
      })
    const loader = new OBJLoader();
       loader.load(url,
        function(obj)
        {
          console.log("loaded")
         // console.log(obj)
        });
       // const objec = useLoader(OBJLoader,url)
    console.log(objec)

    loader.setMaterials(mat)
   // console.log(loader)
    //console.log(mat)
    //objec.setMaterials(mat)

    //let mtlLoader = new MTLLoader();

    //let objLoader = new OBJLoader();

    // mtlLoader.load('/public/IronMan.mtl', (materials) => {
    //   materials.preload()
    //   objLoader.setMaterials(materials)
    //   objLoader.load('./test.obj', (object) => {
    //     scene.add(object)
    //   })
    // })

    return (
    <mesh material-color='red'>
      <primitive object={objec}/>
      <meshBasicMaterial attach="material" color="yellow" transparent />
      </mesh>
    )

1 Ответ

0 голосов
/ 02 ноября 2019

OBJLoader всегда возвращает объект типа THREE.Group, который является более или менее контейнерным объектом для визуализируемых элементов, таких как сетки, точки или линии. Следовательно, вы не можете применить к нему материал.

В официальном примере загрузчика OBJ материалы модифицируются следующим образом:

object.traverse( function ( child ) {

    if ( child.isMesh ) child.material.map = texture;

} );

Вместо назначениядиффузная текстура, вы также можете изменить весь материал.

three.js R109

...