当前位置: 首页 > backend >正文

6.Three.js 中的 OrthographicCamera 详解(含示例)

效果图

👨‍💻 作者:彭麒
📧 Email:1062470959@qq.com
🧠 适用人群:Three.js 初学者、正在搞懂各种相机的小伙伴
🧰 使用技术:Three.js + JavaScript(推荐结合 Vue 也能使用)


🎯 1. 什么是 OrthographicCamera?

OrthographicCamera 又称为正交相机,它和常用的 PerspectiveCamera(透视相机)不同的地方在于:

不会因为远近不同而变大变小
是平行投影,所有物体看起来一样大
✅ 更适合二维场景、建筑平面图、CAD、UI 展示等应用场景。

你可以理解为 ——
🪟 PerspectiveCamera 就像我们的真实眼睛,而
📏 OrthographicCamera 更像画图工具里的俯视图或工程图!


🤔 2. PerspectiveCamera vs OrthographicCamera

比较项PerspectiveCamera(透视)OrthographicCamera(正交)
📷 模拟真实人眼✅ 是❌ 不是
🔍 远近会缩放✅ 会❌ 不会
🧭 适合场景游戏、三维展示UI、CAD、建筑、地图等
📐 数学计算复杂度稍高较低
📏 比例感真实感强但失真精确但平面化

🧪 3. OrthographicCamera 的参数详解

new THREE.OrthographicCamera(left, right, top, bottom, near, far)
参数名含义
left相机视锥体左边界
right相机视锥体右边界
top相机视锥体上边界
bottom相机视锥体下边界
near最近的可视距离(不显示更近的物体)
far最远的可视距离(不显示更远的物体)

📌 提示:通常我们会结合 window.innerWidth / window.innerHeight 来动态计算上下左右。


💻 4. 示例代码:一个正交相机的小球场景 ⚽

<template><div ref="containerRef" class="w-full h-full" />
</template><script setup>
import { onMounted, onBeforeUnmount, ref } from 'vue'
import * as THREE from 'three'const containerRef = ref(null)let scene, camera, renderer, sphereonMounted(() => {initScene()animate()
})onBeforeUnmount(() => {renderer?.dispose()
})function initScene() {const container = containerRef.valueconst width = container.clientWidthconst height = container.clientHeightconst aspect = width / height// 创建场景scene = new THREE.Scene()// 创建正交相机const d = 5camera = new THREE.OrthographicCamera(-d * aspect, d * aspect, d, -d, 0.1, 1000)camera.position.set(10, 10, 10)camera.lookAt(scene.position)// 创建渲染器renderer = new THREE.WebGLRenderer({ antialias: true })renderer.setSize(width, height)container.appendChild(renderer.domElement)// 添加地面网格const grid = new THREE.GridHelper(10, 10)scene.add(grid)// 添加一个红色球体const geometry = new THREE.SphereGeometry(1, 32, 32)const material = new THREE.MeshBasicMaterial({ color: 0xff0000 })sphere = new THREE.Mesh(geometry, material)sphere.position.set(0, 1, 0)scene.add(sphere)// 响应式窗口自适应window.addEventListener('resize', onWindowResize)
}function animate() {requestAnimationFrame(animate)if (sphere) sphere.rotation.y += 0.01renderer?.render(scene, camera)
}function onWindowResize() {if (!containerRef.value) returnconst width = containerRef.value.clientWidthconst height = containerRef.value.clientHeightconst aspect = width / heightconst d = 5camera.left = -d * aspectcamera.right = d * aspectcamera.top = dcamera.bottom = -dcamera.updateProjectionMatrix()renderer.setSize(width, height)
}
</script><style scoped>
div {width: 100%;height: 100vh;background-color: #000;
}
</style>

📌 可以看到小球无论转多少圈,大小始终一致,这就是正交相机的魔力!


🧱 5. OrthographicCamera 的应用场景有哪些?

🎨 UI 层渲染,例如游戏中固定不动的道具栏
🧾 二维地图与图纸
🏠 建筑投影、俯视图(正交投影比透视更清晰)
📊 数据可视化(三维柱状图避免失真)
📐 CAD、工业制图系统
📦 物体包围盒检测(不受远近干扰)


🧠 6. Tips & 注意事项

  • 💡 不适合需要真实感强的三维场景;

  • 📏 left/right/top/bottom 越小越“放大”,越大越“缩小”;

  • 📺 尽量监听窗口 resize 事件,保持相机视口比例同步;

  • 🪄 可以结合 GUI 工具(如 dat.gui)实时修改参数看效果。


🎉 7. 总结

OrthographicCamera 是 Three.js 中一把低调却实用的“工具刀”🔪,非常适合 UI 场景、地图场景、俯视图场景使用,它可以帮你打造平稳、比例一致的画面,搭配透视相机使用简直不要太香 🔥!


❤️ 如果你觉得本文有帮助

👉 点赞 👍 收藏 ⭐ 评论 💬 是我继续分享更多内容的动力鸭~
👨‍🔧 后续我还会更新更多 Vue3 + Three.js 的实战教程,如果你也感兴趣,欢迎一起交流!

http://www.xdnf.cn/news/1953.html

相关文章:

  • 微信小程序文章管理系统开发实现
  • 5种隐蔽的外挂获取执行时机方法介绍
  • Ubuntu 上手动安装 Go 环境并解决“可执行文件格式错误”
  • 反射、枚举以及lambda表达式
  • 某些网站不允许复制怎么办
  • 蓝桥杯 4. 卡片换位
  • txtai:全能AI框架
  • 龙虎榜——20250425
  • spreadsheet 之websheet
  • vue项目前后端分离设计
  • 从氛围到节奏:情绪化配乐网站指南
  • 【Harmony_Bug】forEach + asyncawait 的异步陷阱
  • assertEquals()
  • 基于AIGC的3D场景生成实战:从文本描述到虚拟世界构建
  • 脚本分享:快速作图对比wannier拟合能带python脚本
  • 产品动态|千眼狼sCMOS科学相机捕获单分子荧光信号
  • Java代理讲解
  • 常见网络安全攻击类型深度剖析(三):DDoS攻击——分类、攻击机制及企业级防御策略
  • AI编程:[体验]从 0 到 1 开发一个项目的初体验
  • 利用车联网中的 V2V 通信技术传播公平的紧急信息
  • 【深度强化学习 DRL 快速实践】异步优势演员评论员算法 (A3C)
  • PCIe具体解释分析
  • 【基础IO上】复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux系统下,一切皆文件 | 重定向原理
  • 【kafka初学】启动执行命令
  • c#操作excel表格
  • Java与Kotlin在Android开发中的全面对比分析
  • 【Luogu】动态规划四
  • Hot100方法及易错点总结2
  • firewalld 详解
  • 微信小程序蓝牙连接打印机打印单据完整Demo【蓝牙小票打印】