【threejs教程8】threejs添加3D场景键盘控制

server/2024/9/25 8:25:04/

【完整效果代码位于文章末】     

目录

准备工作

目标

步骤1:初始化按键状态对象

步骤2:监听键盘事件

步骤3:编写事件处理函数

步骤4:更新相机移动方向

总结

完整代码如下

        在3D应用开发中,用户交互是一个关键环节,特别是对于游戏和虚拟现实体验来说,能够通过键盘控制相机移动是提升沉浸感的重要手段。本文将指导你如何利用简单的代码,实现对THREE.js 3D场景中相机的键盘控制功能。

准备工作

        确保你的项目中已经集成了THREE.js库,这是创建3D场景的基础。本文不涉及THREE.js的安装和基本使用,假设你已有相关基础。查看3D场景创建基础看查看往期文章:

 【threejs教程1】threejs基础开发示例

 【threejs教程2】threejs物体点击交互事件

 【threejs教程3】threejs物体轮廓发光

 【threejs教程4】threejs添加跳动标注

 【threejs教程5】threejs添加文字标注,且始终面向屏幕

 【threejs教程6】threejs加载glb模型文件(小米su7)

 【threejs教程7】threejs聚光灯、摄影机灯和汽车运动效果

目标

        我们将实现当按下键盘上的W、S、A、D键时,3D场景中的相机分别向前、后、左、右平移。这个过程分为三步:监听键盘事件、管理按键状态、根据按键状态更新相机移动方向。

步骤1:初始化按键状态对象

        首先,我们需要一个对象来记录键盘按键的状态(按下或抬起)。这将帮助我们判断何时以及如何改变相机的移动方向。

javascript">const keyState = {KeyW: false,KeyS: false,KeyA: false,KeyD: false,
};

步骤2:监听键盘事件

        接下来,我们需要在文档级别监听键盘的keydown和keyup事件,以便在用户按下或释放特定按键时触发相应的处理函数。

javascript">document.addEventListener('keydown', onDocumentKeyDown, false);
document.addEventListener('keyup', onDocumentKeyUp, false);

步骤3:编写事件处理函数

  • keydown事件处理:当按键被按下时,更新keyState中对应按键的状态为true,并调用updateMoveDirection()更新相机移动方向。
javascript">function onDocumentKeyDown(event) {keyState[event.code] = true;updateMoveDirection();
}
  • keyup事件处理:当按键被释放时,将其状态设回false,同样调用updateMoveDirection()确保移动状态正确反映按键情况。
javascript">function onDocumentKeyUp(event) {keyState[event.code] = false;updateMoveDirection();
}

步骤4:更新相机移动方向

        最后,定义updateMoveDirection()函数,根据当前按键状态计算相机的移动方向,并应用到相机位置上。

javascript">// 定义键盘控制速度(可根据需要调整)
const moveSpeed = 0.5
​​​​​​​function updateMoveDirection() {const direction = new THREE.Vector3(); // 存储相机前方方向const moveDirection = new THREE.Vector3(); // 计算移动向量const upVector = new THREE.Vector3(0, 1, 0); // 作为旋转轴辅助计算// 获取相机面向的方向camera.getWorldDirection(direction);// 根据按键状态调整移动向量if (keyState['KeyW']) moveDirection.add(direction);if (keyState['KeyS']) moveDirection.sub(direction);if (keyState['KeyA']) moveDirection.add(upVector.clone().cross(direction)); // 左转if (keyState['KeyD']) moveDirection.sub(upVector.clone().cross(direction)); // 右转// 确保移动向量有明确的方向,避免无效移动moveDirection.normalize();// 应用移动,乘以速度常量控制速度camera.position.add(moveDirection.multiplyScalar(moveSpeed));
}

总结

        至此,你已成功为3D场景中的相机添加了基本的键盘控制功能。通过监听键盘事件、维护按键状态、并据此更新相机的移动方向,你的用户现在可以使用WASD键自由探索你创造的3D世界。记得调整moveSpeed常量以获得理想的移动速度,并根据需要进一步优化和扩展控制逻辑,如添加更多按键控制或平滑移动效果等。

完整代码如下

javascript">// 用于跟踪按键状态的对象const keyState = {KeyW: false,KeyS: false,KeyA: false,KeyD: false,};// 监听键盘按键按下和抬起事件document.addEventListener('keydown', onDocumentKeyDown, false);document.addEventListener('keyup', onDocumentKeyUp, false);// 按键按下事件处理函数function onDocumentKeyDown(event) {// 设置对应按键的状态为按下keyState[event.code] = true;updateMoveDirection();}// 按键抬起事件处理函数function onDocumentKeyUp(event) {// 设置对应按键的状态为抬起keyState[event.code] = false;updateMoveDirection();}// 定义键盘控制速度(可根据需要调整)const moveSpeed = 0.5// 更新移动方向的函数function updateMoveDirection() {const direction = new THREE.Vector3(); // 用于存储相机的视线方向const moveDirection = new THREE.Vector3(); // 用于计算移动向量// 获取相机的全局前方方向camera.getWorldDirection(direction);const upVector = new THREE.Vector3(0, 1, 0); // 用于计算旋转轴// 根据按键状态调整移动向量if (keyState['KeyW']) moveDirection.add(direction);if (keyState['KeyS']) moveDirection.sub(direction);if (keyState['KeyA']) moveDirection.add(upVector.clone().cross(direction));if (keyState['KeyD']) moveDirection.sub(upVector.clone().cross(direction));// 规范化移动向量moveDirection.normalize();// 应用移动camera.position.add(moveDirection.multiplyScalar(moveSpeed));}
 


http://www.ppmy.cn/server/23193.html

相关文章

Tensorflow AutoGraph 的作用和功能

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ TensorFlow AutoGraph 是 TensorFlow 中的一个重要特性,它允许开发者使用普通的 Python 语法编写高效的 TensorFlow 图(graph)。这意味着开发者可以利用 Python 的易…

PhaGCN2:病毒聚类

https://github.com/KennthShang/PhaGCN2.0 安装 mamba create -n phagcn2 python3.9 numpy pytorch networkx2.5 pandas mcl14.137 diamond0.9.14 biopython1.78 scipy1.5.2 conda activate phagcn2 git clone https://github.com/KennthShang/PhaGCN2.0cd database tar -zx…

iOS实现一个高性能的跑马灯

该跑马灯完全通过CATextLayer 实现,轻量级,并且通过 系统的位移动画实现滚动效果,避免了使用displaylink造成的性能瓶颈,使用系统动画,系统自动做了很多性能优化,实现更好的性能,并使用遮罩实现…

NTP授时服务器(GPS授时器)在DCS系统应用

NTP授时服务器(GPS授时器)在DCS系统应用 前言 随着计算机和网络通信技术的飞速发展,各行业自动化系统数字化、网络化的时代已经到来。这一方面为各控制和信息系统之间的数据交换、分析和应用提供了更好的平台、另一方面对各种实时和历史数据…

SG-9101CG,2520有源晶振,扩展频率晶振

扩展频率晶振中的SG-9101CG,是一款小尺寸2520有源晶振。随着市场小型化、多功能、高信赖度的电子产品需求量大增,产品开发周期时间要求越来越短,传统的石英品振性能优异,但设计制造周期相对较长。SG-9101CG内置一个高稳定的有源晶…

python程序设计语言超详细知识总结

Python 首先 python 并不是简单,什么语言都有基础和高级之分,要想掌握一门语言,必须把高级部分掌握才行。 HelloWorld helloWorld.py print(hello, world)数据类型与变量 变量的数据类型数据类型描述变量的定义方式整数型 (int)整数&…

Django框架之Django安装与使用

一、Django框架下载 首先我们需要先确定好自己电脑上的python解释器环境,否则会导致后面项目所需要的库安装不了以及项目无法运行的问题。 要下载Django并开始使用它,你可以按照以下步骤进行: 1、安装Python 首先,确保你的计算…

掌握Java并发工具:Callable和Future实战技巧

Callable接口介绍 Callable vs Runnable 在Java中,Callable接口是一个返回结果并可能抛出异常的任务。它类似于Runnable接口,但有两个显著的不同: Callable的call()方法可以返回值。call()方法可以抛出受检查的异常。 import java.util.c…