Skip to content

在Three.js中,选择合适的相机类型对于创建逼真或特定的视觉效果至关重要。OrthographicCamera,即正投影相机,提供了一种与透视相机截然不同的视图效果。以下是关于正投影相机的详细教程和示例代码。


正投影相机:提供独特的视觉效果

正投影可视空间

在Three.js的世界中,相机是我们观察场景的窗口。除了常见的透视投影相机(PerspectiveCamera),正投影相机(OrthographicCamera)也扮演着重要角色。它为我们提供了一种不同的视角,尤其适合展示二维视图或需要均匀缩放的场景。

正投影相机简介

与透视投影相机不同,正投影相机不会模拟人眼的视觉效果。它提供了一种平行的视图,物体的大小不会随着距离的变化而变化。

正投影相机的构造

正投影相机的构造函数接受六个参数,定义了相机的可视空间:

  • left:渲染空间的左边界
  • right:渲染空间的右边界
  • top:渲染空间的上边界
  • bottom:渲染空间的下边界
  • near:开始渲染的距离
  • far:截止渲染的距离

示例代码:创建正投影相机

javascript
const width = window.innerWidth; // canvas画布宽度
const height = window.innerHeight; // canvas画布高度
const k = width / height; // canvas画布宽高比
const s = 600; // 控制left, right, top, bottom范围大小
const camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 8000);

相机位置和观察目标

相机的位置和观察目标对于确定场景的视图至关重要。

示例代码:设置相机位置和观察目标

javascript
camera.position.set(0, 2000, 0); // 相机放在了y轴上
camera.lookAt(0, 0, 0); // 指向坐标原点

调整相机的渲染范围

通过调整leftrighttopbottom参数,可以改变相机的渲染范围,确保所有需要的对象都在视图中。

示例代码:调整渲染范围

javascript
const camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 8000);

正投影相机与透视投影相机的区别

正投影相机和透视投影相机的主要区别在于它们对场景的渲染方式。透视投影相机模拟了人眼的视觉效果,物体随着距离的增加而逐渐变小。而正投影相机则保持物体的大小不变,无论距离如何。

完整示例代码

以下是一个完整的示例,展示如何在Three.js中使用正投影相机:

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Three.js Orthographic Camera Example</title>
    <style>
        body { margin: 0; }
        canvas { display: block; }
    </style>
</head>
<body>
   <script type="importmap">
    {
      "imports": {
        "three": "https://threejs.org/build/three.module.js",
        "three/addons/": "https://threejs.org/examples/jsm/"
      }
    }
    </script>
    <script type="module">
        const scene = new THREE.Scene();
        const camera = new THREE.OrthographicCamera(
            window.innerWidth / -2, window.innerWidth / 2,
            window.innerHeight / 2, window.innerHeight / -2,
            1, 8000
        );
        const renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);

        camera.position.set(0, 2000, 0);
        camera.lookAt(scene.position);

        const boxGeometry = new THREE.BoxGeometry();
        const boxMaterial = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
        const box = new THREE.Mesh(boxGeometry, boxMaterial);
        scene.add(box);

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

Theme by threelab