AstroでThree.jsを動かす 手軽 合法

目次

    多分これが一番早いと思います な Astro で Three.js を動かす方法を見つけたのでシェアします。

    方法

    お好きな package manager で three を Astro プロジェクトにインストールした後、.astro ファイルに script で three のコードを埋め込むだけです。 import XXX from “three”も機能していると思います。

    <div id="container" />
    <style>
    #container {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
    }
    </style>
    <script>
    import { Mesh, OrthographicCamera, PlaneGeometry, Scene, ShaderMaterial, Vector2, WebGLRenderer } from 'three';
    
    const container = document.getElementById('container');
    if (!container) {
      throw new Error('Canvas Container not found');
    }
    
    const scene = new Scene();
    const camera = new OrthographicCamera(-1, 1, 1, -1, 1, 1000);
    camera.position.set(0, 0, 100)
    camera.lookAt(scene.position)
    
    const geometry = new PlaneGeometry(2, 2);
    const material = new ShaderMaterial({
      fragmentShader: `uniform vec2 resolution;
    varying vec2 vUv;
    void main() {
      vec2 st = gl_FragCoord.xy / resolution.xy;
      gl_FragColor = vec4(st.x, st.y, 1.0, 1.0);
    }`,
      vertexShader: `varying vec2 vUv;
    void main() {
      vUv = uv;
      gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
    }`,
    uniforms: {
    resolution: { value: new Vector2(window.innerWidth * window.devicePixelRatio, window.innerHeight * window.devicePixelRatio) }
    }
        });
    const mesh = new Mesh(geometry, material);
    scene.add(mesh);
    
    const renderer = new WebGLRenderer({ antialias: true, alpha: false, stencil: false, depth: true });
    renderer.setClearColor(0x000000);
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    
    container.appendChild(renderer.domElement);
    
    function handleOnResize() {
      renderer.setPixelRatio(window.devicePixelRatio);
      renderer.setSize(window.innerWidth, window.innerHeight);
      material.uniforms.resolution.value = new Vector2(window.innerWidth * window.devicePixelRatio, window.innerHeight * window.devicePixelRatio);
      camera.updateProjectionMatrix();
    }
    handleOnResize();
    window.addEventListener('resize', handleOnResize);
    
    function animate() {
      requestAnimationFrame(animate);
      renderer.render(scene, camera);
    }
    animate();
    </script>

    信憑性担保のため、StackBlitz にコード全体を置いています。did0es の言うことを信じられない方はぜひご覧ください。

    補足: TypeScriptの扱い

    script にインラインで埋め込むと、Linter で TypeScript のパースに失敗することがあります。

    その場合、インラインではなく .ts ファイルに内容を切り出して、 script の src 属性で読み込むようにしてください(StackBlitz 反映済み)。

    <script src="./_three.ts" />

    いかがでしたか?素敵なGWをお過ごしください。

    この記事を共有する