TrackballControls是Three.js中的一个相机控件,它允许用户通过鼠标拖拽、滚轮缩放以及键盘移动相机,实现类似于球形的相机旋转操作。

news/2024/4/28 2:02:14/文章来源:https://blog.csdn.net/qq_37030315/article/details/137010952

demo案例

TrackballControls是Three.js中的一个相机控件,它允许用户通过鼠标拖拽、滚轮缩放以及键盘移动相机,实现类似于球形的相机旋转操作。这个控件可以用于3D场景中,以提供更好的用户体验。以下是对TrackballControls的入参、出参、方法和属性的详细讲解:

在这里插入图片描述

入参

TrackballControls的构造函数通常接受两个参数:

  1. camera:这是用于渲染场景的摄像机对象。TrackballControls将控制这个摄像机的移动和旋转。
  2. domElement:这是一个HTMLDOMElement对象,用于监听鼠标/触摸事件。这通常是一个canvas元素,用户可以在上面进行交互操作。

出参

TrackballControls本身并没有直接的返回值(出参)。它主要的作用是通过改变摄像机的位置、旋转和缩放,从而改变渲染的场景视图。用户与TrackballControls的交互会直接影响摄像机的状态,进而改变渲染结果。

方法

TrackballControls提供了一些方法用于控制其行为:

  • update():这个方法需要在循环函数中不断调用,以更新控件的状态。它根据用户的交互操作(如鼠标拖拽、滚轮滚动等)来更新摄像机的位置、旋转和缩放。
  • handleResize():当渲染窗口的大小发生变化时,可以调用这个方法来重新计算控件的布局和尺寸。

此外,TrackballControls还定义了一些事件处理函数,如changestartend,这些函数会在摄像机被变换、交互被初始化以及交互完成后被触发。

属性

TrackballControls有一些属性可以用于配置其行为:

  • domElement:如前所述,这是一个HTMLDOMElement对象,用于监听鼠标/触摸事件。
  • enabled:一个布尔值,用于启用或禁用控件。当设为false时,控件将不再响应用户的交互操作。
  • rotateSpeedzoomSpeedpanSpeed:这些属性用于控制旋转、缩放和平移的速度。
  • noRotatenoZoomnoPan:这些属性用于禁用特定的交互操作,如旋转、缩放或平移。

全部源码


<!DOCTYPE html>
<html lang="en"><head><title>three.js webgl - trackball controls</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"><link type="text/css" rel="stylesheet" href="main.css"><style>body {background-color: #ccc;color: #000;}a {color: #f00;}</style></head><body><div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - trackball controls<br />MOVE mouse &amp; press LEFT/A: rotate, MIDDLE/S: zoom, RIGHT/D: pan</div><script type="importmap">{"imports": {"three": "../build/three.module.js","three/addons/": "./jsm/"}}</script><script type="module">import * as THREE from 'three';import Stats from 'three/addons/libs/stats.module.js';import { GUI } from 'three/addons/libs/lil-gui.module.min.js';import { TrackballControls } from 'three/addons/controls/TrackballControls.js';let perspectiveCamera, orthographicCamera, controls, scene, renderer, stats;const params = {orthographicCamera: false};const frustumSize = 400;init();animate();function init() {const aspect = window.innerWidth / window.innerHeight;perspectiveCamera = new THREE.PerspectiveCamera( 60, aspect, 1, 1000 );perspectiveCamera.position.z = 500;orthographicCamera = new THREE.OrthographicCamera( frustumSize * aspect / - 2, frustumSize * aspect / 2, frustumSize / 2, frustumSize / - 2, 1, 1000 );orthographicCamera.position.z = 500;// worldscene = new THREE.Scene();scene.background = new THREE.Color( 0xcccccc );scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );const geometry = new THREE.ConeGeometry( 10, 30, 4, 1 );const material = new THREE.MeshPhongMaterial( { color: 0xffffff, flatShading: true } );for ( let i = 0; i < 500; i ++ ) {const mesh = new THREE.Mesh( geometry, material );mesh.position.x = ( Math.random() - 0.5 ) * 1000;mesh.position.y = ( Math.random() - 0.5 ) * 1000;mesh.position.z = ( Math.random() - 0.5 ) * 1000;mesh.updateMatrix();mesh.matrixAutoUpdate = false;scene.add( mesh );}// lightsconst dirLight1 = new THREE.DirectionalLight( 0xffffff, 3 );dirLight1.position.set( 1, 1, 1 );scene.add( dirLight1 );const dirLight2 = new THREE.DirectionalLight( 0x002288, 3 );dirLight2.position.set( - 1, - 1, - 1 );scene.add( dirLight2 );const ambientLight = new THREE.AmbientLight( 0x555555 );scene.add( ambientLight );// rendererrenderer = new THREE.WebGLRenderer( { antialias: true } );renderer.setPixelRatio( window.devicePixelRatio );renderer.setSize( window.innerWidth, window.innerHeight );document.body.appendChild( renderer.domElement );stats = new Stats();document.body.appendChild( stats.dom );//const gui = new GUI();gui.add( params, 'orthographicCamera' ).name( 'use orthographic' ).onChange( function ( value ) {controls.dispose();createControls( value ? orthographicCamera : perspectiveCamera );} );//window.addEventListener( 'resize', onWindowResize );createControls( perspectiveCamera );}function createControls( camera ) {controls = new TrackballControls( camera, renderer.domElement );controls.rotateSpeed = 1.0;controls.zoomSpeed = 1.2;controls.panSpeed = 0.8;controls.keys = [ 'KeyA', 'KeyS', 'KeyD' ];}function onWindowResize() {const aspect = window.innerWidth / window.innerHeight;perspectiveCamera.aspect = aspect;perspectiveCamera.updateProjectionMatrix();orthographicCamera.left = - frustumSize * aspect / 2;orthographicCamera.right = frustumSize * aspect / 2;orthographicCamera.top = frustumSize / 2;orthographicCamera.bottom = - frustumSize / 2;orthographicCamera.updateProjectionMatrix();renderer.setSize( window.innerWidth, window.innerHeight );controls.handleResize();}function animate() {requestAnimationFrame( animate );controls.update();stats.update();render();}function render() {const camera = ( params.orthographicCamera ) ? orthographicCamera : perspectiveCamera;renderer.render( scene, camera );}</script></body>
</html>

本内容来源于小豆包,想要更多内容请跳转小豆包 》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1027493.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pulsar: kafka on pulsar之把pulsar当kafka用

一、下载协议包&#xff08;要和pulsar版本比较一致&#xff09; https://github.com/streamnative/kop/releases?q2.8.0&expandedtrue二、在pulsar的根目录创建一个protocols目录&#xff0c;将上述包放到这个目录里 三、编辑broker.conf(如果是集群)或者standalone.con…

振弦采集仪在预防地质灾害监测中的作用与应用前景

振弦采集仪在预防地质灾害监测中的作用与应用前景 振弦采集仪&#xff08;String Vibrating Sensor&#xff0c;简称SVM&#xff09;是一种用于地质灾害监测的重要仪器&#xff0c;它通过测量地面振动信号来预测和预警地质灾害的发生。SVM的作用在于提供实时、准确的地质灾害监…

最优算法100例之10-数组中重复出现多次的数

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不…

QT环境搭建

学习QT 一、QT环境搭建二、QT的SDK下载三、认识QT SDK 中自带的一些程序 一、QT环境搭建 QT开发环境&#xff0c;需要安装三个部分。 c编译器&#xff08;gcc、cl.exe……不是visual studio&#xff09;QT SDK&#xff08;QT SDK里面已经内置了C编译器&#xff1b;SDK就是软件…

009_lhs_rhs_in_Matlab中的左值和右值约定

Matlab中的左值和右值约定 1. 左值和右值 我们在把Matlab作为计算器来使用时&#xff0c;有些时候会直接列出一个表达式&#xff0c;等着Matlab打印出计算结果。就这个简单的举动&#xff0c;在计算机科学中&#xff0c;也有一个高大上的名字&#xff0c;叫什么REPL&#xff…

OpenCV 如何使用 XML 和 YAML 文件的文件输入和输出

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;如何利用OpenCV4.9离散傅里叶变换 下一篇: 目标 本文内容主要介绍&#xff1a; 如何使用 YAML 或 XML 文件打印和读取文件和 OpenCV 的文本条目&#xff1f;如何对 OpenCV …

mysql--事务四大特性与隔离级别

事务四大特性与隔离级别 mysql事务的概念事务的属性事务控制语句转账示例 并发事务引发的问题脏读脏读场景 不可重复读幻读幻读场景 事务的隔离级别读未提交读已提交可重复读&#xff08;MySQL默认&#xff09; 总结 mysql事务的概念 事务就是一组操作的集合&#xff0c;他是一…

Unbtun-arach64架构安装PySide2(python3.6)

aarch平台是无法通过pip安装PySide2的&#xff0c;同时利用源码下载一直报错 1. 我是python3.6.9&#xff0c;在官网上找到对应的PySide2版本 5.15.2.所以首先在官网下载Qt5.15.2的源码&#xff1a;https://download.qt.io/archive/qt/5.15/5.15.2/single/ 2. 编译qt环境 aar…

win11蓝牙图标点击变灰,修复过程

问题发现 有一天突然心血来潮想着连接蓝牙音响放歌来听,才发现win11系统右下角菜单里的蓝牙开关有问题。 打开蓝牙设置,可以正常直接连上并播放声音,点击右下角菜单里的蓝牙开关按钮后,蓝牙设备也能正常断开,但是按钮直接变深灰色,无法再点击打开。 重启电脑,蓝牙开关显…

Parade Series - SVG Resource

iconfont https://www.iconfont.cn/?spma313x.search_index.i3.2.74e53a819tkkcG音符 <div class"form-group"><a href"Javascript:reload();" class"btn btn-icon btn-outline-light btn-block" style";"><svg t&q…

Docker命令及部署Java项目

文章目录 简介Docker镜像镜像列表查找镜像拉取镜像删除镜像镜像标签 Docker容器容器启动容器查看容器停止和重启后台模式和进入强制停止容器清理停止的容器容器错误日志容器别名及操作 Docker部署Java项目 简介 Docker是一种容器化技术&#xff0c;可以帮助开发者轻松打包应用…

学透Spring Boot — [二] Spring 和 Spring Boot的比较

欢迎关注我们的专栏 学透 Spring Boot 一、创建一个简单Web应用 本篇文章&#xff0c;我们将会比较 Spring 框架和 Spring Boot 的区别。 什么是 Spring? 也许你在项目中已经可以很熟练的使用 Spring 了&#xff0c;但是当被问到这个问题时&#xff0c;会不会犹豫一下&#…

SQLyog连接MySQL8.0+报错:错误码2058的解决方案

最近把mysql从5.7迁移到8.3.0发现连接不上 因为 MySQL 从 8.0 版本开始&#xff0c;新增了caching_sha2_password授权插件 技术博客 http://idea.coderyj.com/ 1.更换sqlyog 更新到13.1.3之后的版本 2.取消mysql8的加密授权机制 mysql> ALTER USER sqlyog% IDENTIFIED WIT…

Nginx【概述:网页服务器 并发能力强】【常见命令】【部署实战】【反向代理】

Nginx-概述 介绍下载和安装下载安装重点目录和文件如下 Nginx-命令常用命令1). 查看版本2). 检查配置文件3). 启动4). 停止5). 重新加载 环境变量配置 Nginx-应用配置文件结构部署静态资源介绍测试1). 将静态资源上传到 /usr/local/nginx/html 目录2). 启动nginx3). 访问4). 配…

栈和队列——c语言实现栈

本节复习栈和队列中栈的增删查改。 首先回顾一下栈的性质&#xff1a; 栈的存储数据的原则是“后入先出”&#xff0c; 先入的在栈底&#xff1b; 后入的在栈顶。&#xff0c;弹出数据时在栈顶弹出。 目录 准备文件 创建栈的结构体蓝图 栈的初始化 入栈 出栈 获取栈顶元素 获…

MoonBit MeetUp回顾——张正、宗喆:编程语言在云原生与区块链领域的技术探索

宗喆和张正分别给我们带了 KCL 相关的最新进展&#xff0c;由蚂蚁集团开发的 Rust 编写的开源 DSL&#xff0c;目标是优化云原生策略配置和用户体验。它通过引入动态配置管理、配置校验和基础设施抽象等核心概念&#xff0c;解决开发者认知负担、配置膨胀和标准化工具缺乏的问题…

目标检测的相关模型图:YOLO系列和RCNN系列

目标检测的相关模型图&#xff1a;YOLO系列和RCNN系列 前言YOLO系列的图展示YOLOpassthroughYOLO2YOLO3YOLO4YOLO5 RCNN系列的图展示有关目标检测发展的 前言 最近好像大家也都在写毕业论文&#xff0c;前段时间跟朋友聊天&#xff0c;突然想起自己之前写画了一些关于YOLO、Fa…

自己编译SQLite或将SQLite移植到新的操作系统(六)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite中的动态内存分配&#xff08;五&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 1.0 引言 对于大多数应用程序&#xff0c;推荐的构建方法 SQLite是使用合并代码 文件 sqlite3.c 及其相应的头文件 sqlite3.…

C# OpenCvSharp 轮廓检测

目录 效果 代码 下载 效果 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.…

k8s1.28.8版本配置prometheus监控告警

文章目录 官方架构图组件的具体介绍kube-prometheus包含的组件简介&#xff1a;文件存储路径&#xff1a; 结构分析官网自带的一些规则自己总结流程 1-创建规则磁盘使用率报警规则 详解上面rule流程Alertmanagerg查看 2-报警接收器2.1-邮件报警修改Alertmanager配置查看现有的s…