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

相关推荐
dy17172 小时前
element-plus表格默认展开有子的数据
前端·javascript·vue.js
一朵梨花压海棠go7 小时前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript
一只小风华~8 小时前
Vue: Class 与 Style 绑定
前端·javascript·vue.js·typescript·前端框架
十碗饭吃不饱9 小时前
net::ERR_EMPTY_RESPONSE
java·javascript·chrome·html5
Zz_waiting.9 小时前
Javaweb - 14.6 - Vue3 数据交互 Axios
开发语言·前端·javascript·vue·axios
每天吃饭的羊10 小时前
state和ref
前端·javascript·react.js
GEO_YScsn10 小时前
Vite:Next-Gen Frontend Tooling 的高效之道——从原理到实践的性能革命
前端·javascript·css·tensorflow
GISer_Jing10 小时前
滴滴二面(准备二)
前端·javascript·vue·reactjs
摇滚侠10 小时前
Vue3入门到实战,最新版vue3+TypeScript前端开发教程,笔记03
javascript·笔记·typescript
GISer_Jing10 小时前
滴滴二面准备(一)
前端·javascript·面试·ecmascript