three.js入门二:相机的zoom参数

环境:

  • threejs:129 (在浏览器的控制台下输入: window.__THREE__即可查看版本)
  • vscode
  • window
  • edge

透视相机或正交相机都有一个zoom参数,它可以用来将相机排到的内容在canvas上缩放显示。

要点:

  • 设置zoom后要调用 camera.updateProjectionMatrix();
  • zoom默认是1,它的取值就像是手机拍照一样。值变大,画面放大,看到的变少;值变小,画面缩小,看到的变多;
  • 调整zoom对正交相机来说就像是临时调整了它所拍到的边界,即:left/right/top/bottom,但实际上又没有改;

一、示例:正交相机

先定义个canvas(500*500大小):

html 复制代码
<canvas ref="canvas" width="500" height="500" style="margin:50px"></canvas>

创建场景和相机:

js 复制代码
let scene = new Three.Scene();
let renderer = new Three.WebGLRenderer({ canvas: canvasDom });
let camera = new Three.OrthographicCamera(-250, 250, 250, -250, 1, 1000);
camera.zoom = 1;//改为2,将看到原画面的一半
camera.updateProjectionMatrix();
camera.position.set(0, 100, 0);
camera.lookAt(0, 0, 0);

添加网格线:

js 复制代码
const size = 500;
const divisions = 10;
const gridHelper = new Three.GridHelper(size, divisions);
scene.add(gridHelper);

开始渲染:

js 复制代码
(function animate() {
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
})()

现在观察:




二、验证:zoom 对正交相机来说,等同于是临时修改相机的 left/right/top/bottom

在场景中加入半径为500的球体:

js 复制代码
let mesh = new Three.Mesh(new Three.SphereGeometry(500, 16, 8), new Three.MeshBasicMaterial({ color: 0xff0000, wireframe: true }))
scene.add(mesh)

调整zoom=0.5,观察效果:

三、正交相机结合 OrbitControls

3.1 OrbitControls 默认改变的是相机的zoom

除了上面我们可以自己调节zoom取值外,OrbitControls 也是通过更改zoom实现视图的缩放的,如下:

js 复制代码
//创建控制器
new OrbitControls(camera, renderer.domElement);

//渲染的时候打印相机参数
(function animate() {
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
    console.log(`camera2.left=${camera.left},camera2.right=${camera.right} zoom=${camera.zoom}`)
})()

观察效果:

3.2 OrbitControls 的移动是改动的相机的位置

相关推荐
Myli_ing41 分钟前
考研倒计时-配色+1
前端·javascript·考研
余道各努力,千里自同风44 分钟前
前端 vue 如何区分开发环境
前端·javascript·vue.js
PandaCave1 小时前
vue工程运行、构建、引用环境参数学习记录
javascript·vue.js·学习
软件小伟1 小时前
Vue3+element-plus 实现中英文切换(Vue-i18n组件的使用)
前端·javascript·vue.js
醉の虾1 小时前
Vue3 使用v-for 渲染列表数据后更新
前端·javascript·vue.js
张小小大智慧1 小时前
TypeScript 的发展与基本语法
前端·javascript·typescript
疯狂的沙粒2 小时前
对 TypeScript 中高级类型的理解?应该在哪些方面可以更好的使用!
前端·javascript·typescript
旭日猎鹰3 小时前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter
一条晒干的咸魚4 小时前
【Web前端】创建我的第一个 Web 表单
服务器·前端·javascript·json·对象·表单
花海少爷4 小时前
第十章 JavaScript的应用课后习题
开发语言·javascript·ecmascript