首页 > 其他分享 >Three.js入门-相机控制器

Three.js入门-相机控制器

时间:2024-12-04 16:57:42浏览次数:13  
标签:控制器 OrbitControls const Three THREE 相机 new js

Three.js入门-相机控制器

概念介绍

在开始前,我们先看一下效果,我在场景中创建了一个立方体,当我们点击鼠标左键并拖动时,可以旋转相机视角,滚动鼠标滚轮可以缩放相机视角。

相信看了动图效果,大家对相机控件有了一个直观的认识。它是 Three.js 中用于控制相机的工具,可以帮助用户在 3D 场景中自由旋转、缩放和*移相机,提供更加友好的交互体验。

在 Three.js 中,相机(Camera)是决定如何渲染场景的关键元素。它是用户从哪个角度看到 3D 场景的“窗口”。相机控制器(Camera Controls)则是允许开发者在场景中动态调整相机视角、位置和缩放的工具。对于大多数 3D 应用程序,尤其是需要交互的应用程序,控制相机的行为是非常重要的一部分。

常见的相机类型:

透视相机(PerspectiveCamera)

这是最常见的相机类型,它模仿了人眼的视觉效果。通过设定视野角度、*剪裁*面和远剪裁*面来决定观察的范围。

正交相机(OrthographicCamera)

不同于透视相机,正交相机的视图没有透视失真,适合需要*行视角的场景,比如 2D 游戏、CAD 或者是某些类型的数据可视化。

常见的相机控件

Three.js 提供了一些非常强大的相机控制器,用于增强用户与 3D 场景的交互。这些控件一般会利用鼠标、触控板等输入设备,允许用户旋转、缩放、*移相机。

2.1 OrbitControls

 OrbitControls 是 Three.js 中最常用的相机控件之一。它允许用户绕着一个目标点进行旋转、缩放和拖动,适用于大多数需要相机交互的场景。

用法

先在场景中创建一个立方体,作为 OrbitControls 的目标点。

import * as THREE from "three";

const scene = new THREE.Scene();

const camera = new THREE.PerspectiveCamera(

  75,

  window.innerWidth / window.innerHeight,

  0.1,

  1000

);

const renderer = new THREE.WebGLRenderer();

renderer.setSize(window.innerWidth, window.innerHeight);

document.body.appendChild(renderer.domElement);

camera.position.set(0, 0, 5);

const geometry = new THREE.BoxGeometry();

const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });

const cube = new THREE.Mesh(geometry, material);

scene.add(cube);

function render() {

  renderer.render(scene, camera);

}

render();

接着,我们引入一个坐标系辅助,用于等会操作时更好地观察变化

const axesHelper = new THREE.AxesHelper(5);

scene.add(axesHelper);

最后,引入相机控制器。相机控制器不能直接通过 Three.OrbitControls()的方式引入,如果你是通过 npm 包管理器安装的 three.js,那么你可以在 node_modules/three/examples/jsm/controls 中找到 OrbitControls.js 文件,然后通过 import 的方式引入。

 所以你可以通过以下方式引入 OrbitControls:

import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";

最后,完整的引入代码如下:

import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";

// 创建一个控制器

const controls = new OrbitControls(camera, renderer.domElement);

// 更新控件

controls.update();

// 添加事件监听器,在控件变化时重新渲染

controls.addEventListener("change", render);

可以看到,引入一个控制器非常简单,只需要传入相机和渲染器的 dom 元素即可。然后通过 update() 方法更新控件,添加事件监听器,当控件变化时重新渲染。

完整的代码如下:

import * as THREE from "three";

import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";

const scene = new THREE.Scene();

const camera = new THREE.PerspectiveCamera(

  75,

  window.innerWidth / window.innerHeight,

  0.1,

  1000

);

const renderer = new THREE.WebGLRenderer();

renderer.setSize(window.innerWidth, window.innerHeight);

document.body.appendChild(renderer.domElement);

const controls = new OrbitControls(camera, renderer.domElement);

camera.position.set(0, 0, 5);

controls.update();

const geometry = new THREE.BoxGeometry();

const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });

const cube = new THREE.Mesh(geometry, material);

scene.add(cube);

const axesHelper = new THREE.AxesHelper(5);

scene.add(axesHelper);

标签:控制器,OrbitControls,const,Three,THREE,相机,new,js
From: https://blog.csdn.net/weixin_55010563/article/details/144178600

相关文章

  • AT_jsc2019_qual_c Cell Inversion
    算法场上也是把所有需要的性质全部都推出来了,但是计数类型的底子太差,直接也是没把答案式子表示出来啊容易的,我们可以知道,对于一个长度为\(n\)的序列,其中每一个\([l_i,r_i]\)确定,那么不管怎样排列,最终都是合法的我们还可以知道,如果每一个点,作为左端点还......
  • JAVA开源毕业设计 房屋租赁系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T020,文末自助获取源码\color{red}{T020,文末自助获取源码}......
  • JAVA开源毕业设计 大学生租房平台 Vue.JS+SpringBoot+MySQL
    本文项目编号T019,文末自助获取源码\color{red}{T019,文末自助获取源码}......
  • JAVA开源毕业设计 网上订餐系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T018,文末自助获取源码\color{red}{T018,文末自助获取源码}......
  • Nuxt.js 应用中的 request 事件钩子
    title:Nuxt.js应用中的request事件钩子date:2024/12/4updated:2024/12/4author:cmdragonexcerpt:在构建现代Web应用时,处理请求是核心内容之一。无论是从后端获取数据,还是处理用户请求、验证和授权,正确地处理请求能够确保应用的稳定性、可维护性和用户体验。Nuxt.......
  • 使用自定义 JsonConverter 解决 long 类型在前端的精度问题
    问题Javascript的number类型存在精度限制,浏览器反序列化JSON时,无法完整保留long类型的精度。在JSON序列化时将long转换为string进行传递就可以保留精度。在ASP.NETCore中,可以创建一个自定义JsonConverter来达到这一目的。实现long和string转换的JsonC......
  • node.js毕设图书租赁与推荐系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于图书租赁与推荐系统的研究,现有研究主要以传统图书租赁业务管理或者通用推荐系统为主。专门针对图书租赁场景下的推荐系统研究较少。在国内外,传统图......
  • node.js毕设图书租赁管理系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于图书租赁管理系统的研究,现有研究主要以传统图书管理系统为主,专门针对图书租赁场景下的管理系统研究较少。在国内外,传统图书管理系统多聚焦于馆藏管......
  • Node.js实现WebSocket教程
    Node.js实现WebSocket教程1.WebSocket简介WebSocket是一种在单个TCP连接上提供全双工通信的协议,允许服务器和客户端之间进行实时、双向通信。本教程将详细讲解如何在Node.js中实现WebSocket。2.技术选型我们将使用ws库来实现WebSocket服务器,并结合express创建Web应用......
  • Node.js JWT认证教程
    Node.jsJWT认证教程1.项目介绍JSONWebToken(JWT)是一种安全的跨域身份验证解决方案,在现代Web应用中广泛使用。本教程将详细讲解如何在Node.js中实现JWT认证。2.项目准备2.1初始化项目#创建项目目录mkdirnodejs-jwt-authcdnodejs-jwt-auth#初始化项目n......