Three.js正交相机:从零开始玩转3D世界
创作时间:
作者:
@小白创作中心
Three.js正交相机:从零开始玩转3D世界
在Three.js中,正交相机(OrthographicCamera)是一种特殊的相机类型,它不会产生近大远小的透视效果,而是保持物体的原始大小和形状。这种特性使得正交相机非常适合用于2D游戏开发、UI界面渲染以及各种需要等距投影的场景。
一、创建正交相机
正交相机的创建需要指定6个参数:left、right、top、bottom、near和far。这些参数定义了相机的视景体(Viewing Volume),即相机能够看到的空间范围。
const camera = new THREE.OrthographicCamera(
left, // 视景体左侧边界
right, // 视景体右侧边界
top, // 视景体顶部边界
bottom, // 视景体底部边界
near, // 近剪切面(必须大于0)
far // 远剪切面(必须大于near)
);
二、基础示例
下面是一个创建正交相机的基本示例,包括场景和渲染器的初始化:
// 创建场景
const scene = new THREE.Scene();
// 创建渲染器
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 计算视景体参数
const aspect = window.innerWidth / window.innerHeight;
const viewSize = 100; // 视景体高度
const left = -viewSize * aspect / 2;
const right = viewSize * aspect / 2;
const top = viewSize / 2;
const bottom = -viewSize / 2;
const near = 0.1;
const far = 1000;
// 创建正交相机
const camera = new THREE.OrthographicCamera(left, right, top, bottom, near, far);
camera.position.set(0, 0, 50); // 沿z轴后移
camera.lookAt(0, 0, 0); // 看向原点
三、动态调整相机
为了确保相机视景体与窗口大小保持一致,我们需要监听窗口的resize事件,并在窗口大小变化时更新相机的参数:
window.addEventListener('resize', () => {
const newAspect = window.innerWidth / window.innerHeight;
// 更新相机参数
camera.left = -viewSize * newAspect / 2;
camera.right = viewSize * newAspect / 2;
camera.top = viewSize / 2;
camera.bottom = -viewSize / 2;
camera.updateProjectionMatrix(); // 必须调用!
renderer.setSize(window.innerWidth, window.innerHeight);
});
四、应用场景
1. 2D游戏开发
在2D游戏中,我们通常希望使用像素坐标系,即原点位于左下角:
const width = 800;
const height = 600;
const camera = new THREE.OrthographicCamera(
0, // left
width, // right
height, // top
0, // bottom
0.1,
1000
);
camera.position.set(width/2, height/2, 50); // 居中
2. CAD等轴测视图
在CAD软件中,我们可能需要创建等轴测视图:
camera.rotation.order = 'YXZ';
camera.rotation.y = Math.PI / 4; // 绕Y轴旋转45度
camera.rotation.x = Math.atan(-1 / Math.sqrt(2)); // 35.264°等轴测角
五、与透视相机的对比
特性 | 正交相机 | 透视相机 |
|---|---|---|
投影方式 | 平行投影 | 中心投影(模拟人眼) |
参数 | left/right/top/bottom/near/far | fov/aspect/near/far |
应用场景 | 2D界面、工程制图 | 3D游戏、真实感渲染 |
物体大小 | 与距离无关 | 随距离减小 |
六、常见问题
物体不可见:
- 检查物体是否在near/far范围内;
- 确认相机位置(默认在原点,可能需要
camera.position.z = 50)。
图像拉伸:
- 确保
left/right与top/bottom的比例匹配窗口宽高比。
- 确保
七、完整代码示例
<!DOCTYPE html>
<html>
<head>
<style> body { margin: 0; } </style>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script>
// 初始化场景、相机、渲染器
const scene = new THREE.Scene();
const camera = initOrthoCamera();
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 创建立方体
const geometry = new THREE.BoxGeometry(10, 10, 10);
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();
// 正交相机初始化函数
function initOrthoCamera() {
const aspect = window.innerWidth / window.innerHeight;
const viewSize = 100;
const camera = new THREE.OrthographicCamera(
-viewSize * aspect / 2,
viewSize * aspect / 2,
viewSize / 2,
-viewSize / 2,
1,
200
);
camera.position.set(0, 0, 150);
camera.lookAt(0, 0, 0);
return camera;
}
// 窗口自适应
window.addEventListener('resize', () => {
const aspect = window.innerWidth / window.innerHeight;
camera.left = -viewSize * aspect / 2;
camera.right = viewSize * aspect / 2;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
</script>
</body>
</html>
通过以上步骤,你已经掌握了在Three.js中创建和使用正交相机的基本方法。无论是开发2D游戏还是制作工程制图,正交相机都能为你提供强大的支持。现在,不妨动手尝试一下,看看你能创造出怎样的精彩作品!
热门推荐
一日三餐有个最佳吃饭时间,不然……
详述简单、实用的太极拳热身方法
怎样提高智力
保证深度睡眠可能是预防阿尔茨海默病的关键
如何理解建筑施工安全生产标准化考评暂行办法中的安全生产责任制?
东北财经大学宿舍条件好不好-有空调否?(宿舍图片)
二本线多少分2024:全国各省高考二本录取分数线一览表最新汇总
重磅:所有增肌训练者必读的营养和补剂最新指南(上)
一分钟带你了解十天干属性丨快来看看你的属性吧!
如何判断牛奶是否已经变质?
当归的功效与作用:常见中药,具有补血活血,调经止痛,润肠通便的功效
耳鸣的原因和治疗方法有哪些
股票回测是什么?如何利用股票回测进行投资分析?
“美国最大金库”黄金储备量不实?特朗普发话,马斯克领导的政府效率部或将出动
植牙费用详解:7大植牙价格明细,医生来解密
健身一天吃几个蛋黄?健身期间蛋黄摄入量全解析
一个家,最好的风水:有爱与和谐
缓解坐骨神经痛和增强下背部力量的有效锻炼
全面解读念珠菌病:病因、传播、病理、诊断与防治
如何修复外置硬盘上的坏扇区:Windows 指南
香港在职研究生申请指南:5大常见问题及解答
电动车电池分4种类型,有什么区别?选哪种更有性价比?答案来了
芥子的功效与作用
量子计算,未来不可限“量”
停车位风水有禁忌,停车一定要注意!
「美国B2旅游签证」必看:7大申请条件+5步申请流程(含材料清单)
上海男篮引进第四外援迫在眉睫!后卫线短板太明显,卢伟如何调整
专利转让合同详解:主要条款与注意事项
让自己睡个好觉,这是每个职场人的要紧事
什么是项目管理GTM?它如何助力产品快速进入市场?