Skip to content

三维场景截图:将Three.js渲染结果保存为图片

在Three.js中,将渲染的三维场景保存为图片是一个实用的功能,这可以通过操作canvas元素实现。以下是详细的步骤和示例代码。

概述

Three.js渲染器生成的每个场景都可以被捕捉并保存为图片文件。这通常涉及到配置渲染器以保留绘制缓冲区,并使用浏览器的下载API来触发文件下载。

步骤一:设置渲染器

首先,需要确保渲染器配置正确,以便能够捕捉当前的渲染结果。

javascript
const renderer = new THREE.WebGLRenderer({
    preserveDrawingBuffer: true, // 允许从渲染缓冲区读取像素数据
    alpha: true // 启用透明度
});
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

步骤二:创建下载按钮

在HTML中添加一个按钮,用户点击时将触发图片的下载。

html
<button id="download">下载图片</button>

步骤三:绑定下载事件

为下载按钮添加事件监听器,当用户点击时,将渲染结果保存为图片。

javascript
document.getElementById('download').addEventListener('click', function() {
    downloadCanvasAsImage();
});

步骤四:实现下载功能

定义downloadCanvasAsImage函数,该函数将canvas的内容转换为图片并触发下载。

javascript
function downloadCanvasAsImage() {
    const canvas = renderer.domElement;
    const link = document.createElement('a');
    link.href = canvas.toDataURL('image/png'); // 以PNG格式获取canvas的像素数据
    link.download = 'threejs-scene.png'; // 设置下载文件的名称
    link.click(); // 触发下载
}

步骤五:配置场景和相机

创建一个简单的场景和相机,用于演示。

javascript
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 0, 5);

const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

function animate() {
    requestAnimationFrame(animate);
    cube.rotation.x += 0.01;
    cube.rotation.y += 0.01;
    renderer.render(scene, camera);
}
animate();

完整示例代码

将上述代码整合到一个HTML文件中,创建一个完整的示例。

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Three.js Scene Screenshot</title>
    <style>
        body { margin: 0; }
        canvas { display: block; }
        #download { display: block; margin-top: 20px; }
    </style>
</head>
<body>
    <button id="download">下载图片</button>
    <script type="importmap">
      {
        "imports": {
          "three": "https://threejs.org/build/three.module.js",
          "three/addons/": "https://threejs.org/examples/jsm/addons/"
        }
      }
    </script>
    <script type="module">
      import * as THREE from 'three';

      const renderer = new THREE.WebGLRenderer({
          preserveDrawingBuffer: true,
          alpha: true
      });
      renderer.setSize(window.innerWidth, window.innerHeight);
      document.body.appendChild(renderer.domElement);

      const scene = new THREE.Scene();
      const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
      camera.position.set(0, 0, 5);

      const geometry = new THREE.BoxGeometry();
      const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
      const cube = new THREE.Mesh(geometry, material);
      scene.add(cube);

      document.getElementById('download').addEventListener('click', function() {
          const canvas = renderer.domElement;
          const link = document.createElement('a');
          link.href = canvas.toDataURL('image/png');
          link.download = 'threejs-scene.png';
          link.click();
      });

      function animate() {
          requestAnimationFrame(animate);
          cube.rotation.x += 0.01;
          cube.rotation.y += 0.01;
          renderer.render(scene, camera);
      }
      animate();
    </script>
</body>
</html>

通过这个示例,您可以将Three.js渲染的三维场景保存为PNG图片。用户只需点击下载按钮,即可触发图片的下载。您可以进一步扩展此示例,添加更多的场景元素和交互功能。

Theme by threelab