首页 > 其他分享 >ThreeJS入门(182):THREE.FirstPersonControls 知识详解,示例代码

ThreeJS入门(182):THREE.FirstPersonControls 知识详解,示例代码

时间:2024-12-08 11:58:17浏览次数:10  
标签:case 控件 ThreeJS 示例 THREE 视角 firstPersonControls FirstPersonControls

作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。

在这里插入图片描述

查看本专栏目录 - 本文是第 182篇入门文章

文章目录

THREE.FirstPersonControls 是 Three.js 中的一个交互控件,它允许用户通过键盘和鼠标来控制一个第一人称视角(First-Person View)。这个控件主要用于模拟游戏中的第一人称视角操作,使得用户可以通过键盘控制方向,并通过鼠标控制视角的旋转。

构造函数

构造函数 new THREE.FirstPersonControls(camera, domElement) 创建一个新的 FirstPersonControls 实例。

  • camera:要控制的相机对象。
  • domElement:可选参数,指定与控件交互的 DOM 元素,默认为渲染器的 domElement

属性

enabled

一个布尔值,表示控件是否可用,默认为 true。当设为 false 时,控件不会响应用户的输入。

movementSpeed

一个数值,表示移动的速度,默认为 1。较高的值会使移动更快。

lookSpeed

一个数值,表示视角旋转的速度,默认为 0.005。较高的值会使视角旋转得更快。

autoForward

一个布尔值,表示是否自动向前移动,默认为 true。如果设为 false,则需要用户通过按键来移动。

constrainVertical

一个布尔值,表示是否约束垂直视角,默认为 true。如果设为 false,则允许垂直视角无限旋转。

verticalMin

一个数值,表示垂直视角的最小角度,默认为 -85 度。

verticalMax

一个数值,表示垂直视角的最大角度,默认为 85 度。

moveForward, moveBackward, moveLeft, moveRight

布尔值,表示当前是否有按键按下以指示方向移动。这些值通常由内部事件处理程序更新。

方法

update()

更新控件的状态。这个方法通常在渲染循环中被调用,以确保控件的状态得到及时更新。

dispose()

释放控件使用的资源。当不再需要控件时可以调用此方法来释放相关资源。

使用示例

下面是一个简单的示例,展示如何使用 THREE.FirstPersonControls 来创建一个基本的第一人称视角交互场景:

import * as THREE from 'three';
import { FirstPersonControls } from 'three/examples/jsm/controls/FirstPersonControls.js';

// 创建场景
const scene = new THREE.Scene();

// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 1, 0); // 设置相机初始位置

// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建一个地面平面
const geometry = new THREE.PlaneGeometry(10, 10);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const ground = new THREE.Mesh(geometry, material);
ground.rotation.x = -Math.PI / 2;
scene.add(ground);

// 创建 FirstPersonControls
const firstPersonControls = new THREE.FirstPersonControls(camera, renderer.domElement);

// 设置属性
firstPersonControls.movementSpeed = 10; // 移动速度
firstPersonControls.lookSpeed = 0.005; // 视角旋转速度
firstPersonControls.autoForward = false; // 关闭自动前进

// 键盘事件监听
document.addEventListener('keydown', function(event) {
    switch (event.code) {
        case 'ArrowUp':
        case 'KeyW':
            firstPersonControls.moveForward = true;
            break;
        case 'ArrowDown':
        case 'KeyS':
            firstPersonControls.moveBackward = true;
            break;
        case 'ArrowLeft':
        case 'KeyA':
            firstPersonControls.moveLeft = true;
            break;
        case 'ArrowRight':
        case 'KeyD':
            firstPersonControls.moveRight = true;
            break;
    }
});

document.addEventListener('keyup', function(event) {
    switch (event.code) {
        case 'ArrowUp':
        case 'KeyW':
            firstPersonControls.moveForward = false;
            break;
        case 'ArrowDown':
        case 'KeyS':
            firstPersonControls.moveBackward = false;
            break;
        case 'ArrowLeft':
        case 'KeyA':
            firstPersonControls.moveLeft = false;
            break;
        case 'ArrowRight':
        case 'KeyD':
            firstPersonControls.moveRight = false;
            break;
    }
});

// 渲染循环
function animate() {
    requestAnimationFrame(animate);

    // 更新 FirstPersonControls
    firstPersonControls.update();

    // 渲染场景
    renderer.render(scene, camera);
}
animate();

事件监听

为了使 FirstPersonControls 能够响应用户的输入,需要监听键盘和鼠标事件。FirstPersonControls 会在内部处理这些事件,但你需要确保 DOM 元素是可交互的,并且适当地设置事件监听器来响应用户的输入。

注意事项

  1. 键盘映射:上述示例中的键盘事件监听器可以根据实际需要进行调整,以适应不同的键位布局。
  2. 相机位置:确保相机的初始位置适合你的场景,以便用户能够看到周围的环境。
  3. 性能优化:如果场景中有大量的几何体或纹理,移动时可能会导致性能下降。确保场景尽可能优化,减少不必要的计算和渲染开销。
  4. 视角约束:通过设置 constrainVerticalverticalMinverticalMax 属性来限制视角的旋转范围,以防止视角过于极端。

总结

THREE.FirstPersonControls 是 Three.js 中用于实现第一人称视角交互的控件。通过使用 FirstPersonControls,你可以让用户通过键盘和鼠标来控制相机的移动和旋转。在使用时,确保正确设置相机和渲染器,并监听必要的事件来处理用户的输入。如果你需要更复杂的交互功能,如跳跃或特殊动作,可以进一步扩展 FirstPersonControls 或结合其他控件来实现。

标签:case,控件,ThreeJS,示例,THREE,视角,firstPersonControls,FirstPersonControls
From: https://blog.csdn.net/cuclife/article/details/142256966

相关文章

  • 学习threejs,实现配合使用WebWorker
    ......
  • 介绍一下 WebApplicationContext 思维导图 代码示例(java 架构)
    WebApplicationContext是Spring框架中的一个接口,它是ApplicationContext的扩展,专门用于Web应用程序。它提供了对Web特定功能的支持,例如解析主题(themes)、管理国际化资源、以及与Servlet容器集成等。下面是一个关于WebApplicationContext的思维导图大纲和一些代码示例。WebAp......
  • 提升数据提取质量的秘诀:如何有效使用参考示例
    提升数据提取质量的秘诀:如何有效使用参考示例在当今信息爆炸的时代,如何从大量非结构化数据中提取出有用的信息变得尤为重要。数据提取通常试图生成文本和其他半结构化格式的信息的结构化表示。这篇文章将为您展示如何通过参考示例的使用,提高大型语言模型(LLM)中的数据提取质......
  • 零基础学习Air724UG低功耗模组软件的FTP示例 | 演示篇
    一文讲清Air724UG低功耗模组软件的FTP示例,分步演示,就算零基础也一眼懂!一、简介FTP(FileTransferProtocol,文件传输协议)是TCP/IP协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过......
  • Ansible常用模块及使用示例
    Ansible常用模块        每个Ansible模块都是一个独立的小程序或脚本,设计用来完成特定的任务。它们通常以Python编写,但也可以用其他语言。模块被设计为幂等的(idempotent),这意味着无论执行多少次,结果都是一样的,并且不会对系统造成不必要的改变。Ansible拥有大量的内置模......
  • 前端高级组件(树组与自动填充)封使用示例,看看封装表的青现理解思想就好,商业源码,不能泄
     第一先看树组件          以下是自动提示的封装,以下是效果 以下点击是肯它需要后端反回数据,参数是上面输的值,后端的接口应该如下:importcom.jfinal.core.ActionKey;importcom.jfinal.core.Controller;importcom.jfinal.core.paragetter.Para;......
  • QT - QOverload说明及示例
    在QT中,通常我们建立信号槽时信号和槽传递的参数是对应的,允许槽的函数比信号的函数少,但是排列顺序不能变。当信号的参数被重载或者信号参数与槽函数的参数不一致时,需要指定本次connect时信号使用的参数或者将信号使用的参数强转,这就用到了信号重载。比如常用的QComboBox类中的&QC......
  • 【RAS非对称加密算法】DEMO原理与示例
    fromCrypto.PublicKeyimportRSAfromCrypto.CipherimportPKCS1_OAEP#生成RSA密钥对defgenerate_rsa_keys():"""公钥是通过特定算法从私钥导出的,可以安全地公开。公钥用于加密数据或验证签名。私钥用于解密数据或生成签名。""......
  • Python如何将Excel数据导入到MySQL数据库?详细教程与实战示例
    在数据处理和分析的过程中,我们常常需要将Excel数据导入到MySQL数据库中,以便进行更高效的查询和管理。那么,如何利用Python实现这一过程呢?本文将深入探讨Python将Excel数据导入到MySQL数据库的方法,并提供详细的教程和实战示例。无论您是初学者还是有经验的开发者,都可以通过本文掌......
  • ​‌Spring Boot中的@GetMapping注解可以用于处理HTTP GET请求,并且可以接收对象参数​
    下面内容来自Ai回答,经过亲自验证,正确 ‌SpringBoot中的@GetMapping注解可以用于处理HTTPGET请求,并且可以接收对象参数。‌接收对象参数的基本方式在SpringBoot中,可以通过@GetMapping注解接收对象参数,这通常通过@RequestParam或@RequestBody注解来实现。‌使用@Reque......