96. 正投影相机-Canvas尺寸变化

一些应用场景Cnavas画布可能不是固定尺寸,而是变化的。这时候就需要重新设置WebGL渲染器、相机等参数。

前面给大家演示的时候,相机是用的透视投影,下面主要演示下,正投影相机的参数如何随着Canvas画布尺寸的变化而变化。​​​​​​

WebGL渲染器更新Canvas画布尺寸

javascript 复制代码
// onresize 事件会在窗口被调整大小时发生
window.onresize = function () {
    const width = window.innerWidth; //canvas画布宽度
    const height = window.innerHeight; //canvas画布高度
    // 重置渲染器输出画布canvas尺寸
    renderer.setSize(width, height);
};
javascript 复制代码
window.onresize = function () {
    const width = window.innerWidth-200; //canvas画布宽度
    const height = window.innerHeight-200; //canvas画布高度
    // 重置渲染器输出画布canvas尺寸
    renderer.setSize(window.innerWidth, window.innerHeight);
};

相机参数更新

.aspect属性受到canvas画布宽高度影响,当canvas画布尺寸发生变化的时候,需要更新透视投影相机PerspectiveCamera.aspect属性。

javascript 复制代码
window.onresize = function () {
    // width、height表示canvas画布宽高度
    camera.aspect = width / height;
    camera.updateProjectionMatrix();
};

你预览案例源码中正投影相机代码,可以看到,正投影相机OrthographicCameraleftright属性受到canvas画布宽高比影响,所以需要随着canvas画布更新。

javascript 复制代码
const k = width / height; //canvas画布宽高比
const s = 50; 
//控制left, right, top, bottom范围大小
const camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 8000);
javascript 复制代码
// Canvas画布跟随窗口变化
window.onresize = function () {
    const width = window.innerWidth; //canvas画布宽度
    const height = window.innerHeight; //canvas画布高度
    // 1. WebGL渲染器渲染的Cnavas画布尺寸更新
    renderer.setSize(width, height);
    // 2.1.更新相机参数
    const k = width / height; //canvas画布宽高比
    camera.left = -s*k;
    camera.right = s*k;
    // 2.2.相机的left, right, top, bottom属性变化了,通知threejs系统
    camera.updateProjectionMatrix();
};
相关推荐
程序员码歌10 分钟前
【零代码AI编程实战】AI灯塔导航-总结篇
android·前端·后端
用户21411832636021 小时前
免费玩转 AI 编程!Claude Code Router + Qwen3-Code 实战教程
前端
AndrewHZ2 小时前
【3D重建技术】如何基于遥感图像和DEM等数据进行城市级高精度三维重建?
图像处理·人工智能·深度学习·3d·dem·遥感图像·3d重建
小小愿望2 小时前
前端无法获取响应头(如 Content-Disposition)的原因与解决方案
前端·后端
小小愿望2 小时前
项目启功需要添加SKIP_PREFLIGHT_CHECK=true该怎么办?
前端
烛阴2 小时前
精简之道:TypeScript 参数属性 (Parameter Properties) 详解
前端·javascript·typescript
nonono3 小时前
深度学习——常见的神经网络
人工智能·深度学习·神经网络
海上彼尚3 小时前
使用 npm-run-all2 简化你的 npm 脚本工作流
前端·npm·node.js
小艳加油3 小时前
Python机器学习与深度学习;Transformer模型/注意力机制/目标检测/语义分割/图神经网络/强化学习/生成式模型/自监督学习/物理信息神经网络等
python·深度学习·机器学习·transformer
开发者小天4 小时前
为什么 /deep/ 现在不推荐使用?
前端·javascript·node.js