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游戏还是制作工程制图,正交相机都能为你提供强大的支持。现在,不妨动手尝试一下,看看你能创造出怎样的精彩作品!
热门推荐
广州地铁APM线最新出行攻略:9站串联珠江新城,2元畅游广州塔
牙膏需要经常换品牌用吗?这份牙膏选购攻略请收好
刷牙这件小事,你真的做对了吗?
江苏省消保委发布牙膏市场调查报告:这些牙膏产品存在安全隐患!
九华山:心灵的净土与安宁之地
《只此青绿》:从名画到舞剧的千年之旅
兔年春晚非遗舞蹈大赏:国风之美
江苏十大经典名菜:松鼠桂鱼的前世今生
冬季吃桂鱼,这些挑选技巧你必须知道!
数字背后的秘密:探索那些隐藏的寓意
非遗文化遗产是什么?中国非遗文化都有哪些?
新加坡AI医疗创新:从政策布局到应用落地
科技创新为营养健康管理插上科技翅膀
国家卫健委力推健康科技,为公共卫生护航
跟着刘畊宏去徒步:天台山新手徒步全攻略
四川天台山:新晋5A景区里的瀑布与萤火虫
天台山旅游全攻略:必打卡景点+地道美食
《哪吒2》:家庭观影新宠儿!
吴财记:一碗云吞面里的67年广式风味传承
Intel 4004:开启CPU新纪元
MM三人行|春晚无锡分会场:江南美学的极致呈现
苏州九区县名称的历史由来:从姑苏到太仓
心理学上有一个词叫:跳蚤效应
央视蛇年春晚收视创新高:传统文化大放异彩
春游惠山古镇:千年古迹与万朵蔷薇的浪漫邂逅
五洩风景区秋日打卡攻略:红枫黄杏与碧绿湖水的绝美邂逅
阳明故里和西小河:绍兴古建的前世今生
甘青大环线vs新疆自驾:两条经典路线如何选?
春节打卡普宁南溪水乡:舟在碧波上,人在画中游
普宁英歌:从田间地头跳到央视春晚的“中华战舞”