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 的移动是改动的相机的位置

相关推荐
脑袋大大的5 小时前
JavaScript 性能优化实战:减少 DOM 操作引发的重排与重绘
开发语言·javascript·性能优化
速易达网络6 小时前
RuoYi、Vue CLI 和 uni-app 结合构建跨端全家桶方案
javascript·vue.js·低代码
耶啵奶膘7 小时前
uniapp+firstUI——上传视频组件fui-upload-video
前端·javascript·uni-app
JoJo_Way7 小时前
LeetCode三数之和-js题解
javascript·算法·leetcode
视频砖家7 小时前
移动端Html5播放器按钮变小的问题解决方法
前端·javascript·viewport功能
GISer_Jing10 小时前
Monorepo+Pnpm+Turborepo
前端·javascript·ecmascript
天涯学馆10 小时前
前端开发也能用 WebAssembly?这些场景超实用!
前端·javascript·面试
我在北京coding11 小时前
TypeError: Cannot read properties of undefined (reading ‘queryComponents‘)
前端·javascript·vue.js
海天胜景12 小时前
vue3 获取选中的el-table行数据
javascript·vue.js·elementui