如何使用 threejs 和 svelte 渲染 3d obj 文件?

How to render 3d obj file with threejs and svelte?

提问人:Jay0813 提问时间:8/21/2023 最后编辑:Jay0813 更新时间:8/21/2023 访问量:57

问:

我正在使用 threejs 和 svelte,我想在屏幕上渲染带有 obj 扩展名的 3d 文件。 当我运行代码时,我确认对象已 100% 加载,但屏幕上只可见黑色背景。 我错过了什么吗? 这是我的代码,欢迎任何建议。谢谢

<script lang="ts">
  import { onMount } from 'svelte';
  import * as THREE from 'three';
  import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
  import { OBJLoader } from 'three/addons/loaders/OBJLoader.js';

  let container: HTMLElement;
  let camera: THREE.PerspectiveCamera;
  let renderer: THREE.WebGLRenderer;

  function onWindowResize(): void {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
    render();
  }

  onMount(() => {
    const scene: THREE.Scene = new THREE.Scene();
    scene.background = new THREE.Color(0xffffff);
    // scene.add(new THREE.AxesHelper(5));

    const ambientLight: THREE.AmbientLight = new THREE.AmbientLight(0x404040);
    scene.add(ambientLight);

    const directionalLight: THREE.DirectionalLight = new THREE.DirectionalLight(
      0xffffff,
      0.5,
    );
    directionalLight.position.set(0, 1, 1);
    scene.add(directionalLight);

    camera = new THREE.PerspectiveCamera(
      50,
      window.innerWidth / window.innerHeight,
      0.1,
      1000,
    );
    camera.position.z = 5;
    camera.position.y = 10;

    renderer = new THREE.WebGLRenderer({
      antialias: true,
    });
    renderer.setSize(window.innerWidth, window.innerHeight);
    container.appendChild(renderer.domElement);

    const controls = new OrbitControls(camera, renderer.domElement);
    controls.enableDamping = true;

    // const material: THREE.MeshLambertMaterial = new THREE.MeshLambertMaterial({
    //   color: 0xffffff,
    // });

    const objLoader: OBJLoader = new OBJLoader();
    objLoader.load(
      '/3Dmesh.obj',
      (object: THREE.Object3D) => {
        // object.traverse((child: THREE.Object3D) => {
        //   if (child instanceof THREE.Mesh) {
        //     (child as THREE.Mesh).material = material;
        //   }
        // });

        console.log('object', object);

        const box = new THREE.Box3().setFromObject(object);
        const center = box.getCenter(new THREE.Vector3());

        object.position.x += object.position.x - center.x;
        object.position.y += object.position.y - center.y;
        object.position.z += object.position.z - center.z;

        scene.add(object);
      },
      (xhr: ProgressEvent) => {
        console.log((xhr.loaded / xhr.total) * 100 + '% loaded');
      },
      (error: ErrorEvent) => {
        console.log(error);
      },
    );

    camera.position.z = 50;
    window.addEventListener('resize', onWindowResize, false);

    function animate(): void {
      requestAnimationFrame(animate);
      controls.update();
      render();
    }

    function render(): void {
      renderer.render(scene, camera);
    }

    animate();

    return () => {
      window.removeEventListener('resize', onWindowResize, false);
    };
  });
</script>

<svelte:window on:resize={onWindowResize} />

<div bind:this={container}></div>

下面是一个 3d 结果enter image description here

three.js 3d svelte

评论

1赞 Natumanya Guy 8/21/2023
你试过Thretle吗?threlte.xyz。它得到了里奇·哈里斯(Rich Harris)的认可。

答: 暂无答案