WebGL添加鼠标滚动、平移、缩放功能

本文介绍如何在Three.js项目中使用OrbitControls.js实现鼠标交互控制,包括调整旋转角度范围、设置阻尼效果、启用缩放和平移等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、引入OrbitControls.js
<script src="js/OrbitControls.js"></script>

2、写控制器函数

function controls() {
    // controls  控制鼠标滚动
    controls = new THREE.OrbitControls( camera, renderer.domElement );
    controls.maxPolarAngle = Math.PI *0.5;   //限制竖直方向上最大旋转角度 y轴正向为0~90度
    //controls.maxPolarAngle = Math.PI ;   //限制竖直方向上最大旋转角度 y轴正向为-90~90度
    controls.minDistance = 10;
    controls.maxDistance = 5000;
    // 如果使用animate方法时,将此函数删除
    //controls.addEventListener( 'change', render );
    // 使动画循环使用时阻尼或自转 意思是否有惯性
    controls.enableDamping = true;
    //动态阻尼系数 就是鼠标拖拽旋转灵敏度
    //controls.dampingFactor = 0.25;
    //是否可以缩放
    controls.enableZoom = true;
    //是否自动旋转
    //controls.autoRotate = true;
    //是否开启右键拖拽
    controls.enablePan = true;
}

3、在主程序调用

function threeStart() {
    initThree();
    setStats();
    initCamera();
    initScene();
    initLight();
    initSun();
    initball();
    initCycle2();
    controls();   //看这几句 
    window.addEventListener( 'resize', onWindowResize, false );
    animation();
}

4、在animation函数中写入 

  controls.update();    详见下

function animation()
{
    requestAnimationFrame(animation);
    controls.update();//这句不写,将不能鼠标左键旋转,鼠标中间键缩放
    stats.update();
    ballAnim();
    renderer.render(scene, camera);
}

 

### 使用 `OrbitControls` 实现基于鼠标坐标的缩放 为了实现基于鼠标坐标的缩放功能,可以利用 `THREE.OrbitControls` 的特性并结合一些额外逻辑处理。具体来说,可以通过监听鼠标的滚轮事件来调整相机的距离,从而达到缩放效果。 #### 导入必要的模块 首先确保已经正确引入了所需的库文件: ```html <script type="module"> import * as THREE from 'three'; import { OrbitControls } from './jsm/controls/OrbitControls.js'; // 调整路径以匹配实际项目结构 </script> ``` #### 初始化场景、相机和渲染器 创建基本的 Three.js 设置,包括初始化场景、设置透视投影相机以及配置 WebGL 渲染器: ```javascript const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); camera.position.z = 5; const renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 添加一个简单的几何体作为测试对象 const geometry = new THREE.BoxGeometry(); const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); const cube = new THREE.Mesh(geometry, material); scene.add(cube); ``` #### 配置 `OrbitControls` 接下来实例化 `OrbitControls` 并对其进行适当配置以便支持基于鼠标坐标的缩放行为: ```javascript const controls = new OrbitControls(camera, renderer.domElement); // 启用平移、旋转和缩放功能 controls.enablePan = true; controls.enableRotate = true; controls.enableZoom = true; // 自定义缩放范围和其他参数 controls.minDistance = 1; controls.maxDistance = 20; controls.zoomSpeed = 1.0; // 将目标点设为中心位置 (可选) controls.target.set(0, 0, 0); controls.update(); // 确保初始状态正确应用 ``` 上述代码片段中设置了最小距离 (`minDistance`) 和最大距离 (`maxDistance`) 来限制用户的缩放程度;同时也指定了缩放速度 (`zoomSpeed`) 控制滚动条每次移动时产生的放大缩小幅度[^2]。 #### 处理窗口大小变化 为了让视窗响应浏览器窗口的变化而保持正确的比例关系,还需要加入相应的事件监听器: ```javascript window.addEventListener('resize', () => { const width = window.innerWidth; const height = window.innerHeight; camera.aspect = width / height; camera.updateProjectionMatrix(); renderer.setSize(width, height); }); ``` 这样就完成了一个完整的示例程序框架,其中包含了使用 `OrbitControls` 进行交互式控制的功能,并特别强调了如何通过鼠标滚轮来进行缩放操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值