TransformControls 是 Three.js 中的一个类,用于在网页中进行 3D 场景中物体的交互式操作。

demo案例

TransformControls 是 Three.js 中的一个类,用于在网页中进行 3D 场景中物体的交互式操作。让我们来详细讲解它的输入参数、输出、属性和方法:
在这里插入图片描述

输入参数:

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

  1. camera(THREE.Camera):用于渲染场景的摄像机。这个参数是必需的。

  2. domElement(HTMLElement):控制器将附加到的 HTML 元素。通常是渲染器的 DOM 元素。这个参数是可选的,如果未提供,则控制器将附加到文档主体上。

输出:

TransformControls 实例:表示变换控制器的对象,初始化为指定的摄像机,并附加到指定的 DOM 元素(如果未提供元素,则附加到文档主体)。

属性:

  1. object(THREE.Object3D):由变换控制器操作的对象。

  2. enabled(布尔值):指示控制器当前是否已启用或禁用。

  3. space(字符串):指定变换空间(‘local’ 或 ‘world’),其中应用变换。

  4. size(数字):以像素为单位的变换控制器的大小。

  5. dragging(布尔值):指示用户当前是否正在拖动控制器。

  6. showX(布尔值)、showY(布尔值)、showZ(布尔值):指示是否显示沿 X、Y 和 Z 轴的控制手柄。

  7. mode(字符串):变换模式(‘translate’、‘rotate’ 或 ‘scale’)。

  8. camera(THREE.Camera):控制器使用的摄像机。

  9. domElement(HTMLElement):控制器附加到的 DOM 元素。

方法:

  1. attach(object: THREE.Object3D):将控制器附加到指定的对象以进行操作。

  2. detach():将控制器从任何对象中分离,有效地停止操作,直到附加新对象为止。

  3. dispose():移除控制器,释放资源。

  4. update():更新控制器。应该在渲染循环中的每一帧中调用。

  5. setMode(mode: String):将变换模式设置为 ‘translate’、‘rotate’ 或 ‘scale’ 中的一种。

  6. setSize(size: Number):设置变换控制器的大小(以像素为单位)。

  7. setSpace(space: String):将变换空间设置为 ‘local’ 或 ‘world’。

TransformControls 具体来说,它可以实现以下功能:

  1. 平移(Translate):您可以移动物体,使其沿着三维空间中的 X、Y 或 Z 轴移动。这对于调整物体在场景中的位置非常有用。

  2. 旋转(Rotate):您可以围绕物体的原点或者某一指定点进行旋转操作,改变物体的方向或朝向。

  3. 缩放(Scale):您可以调整物体的大小,使其放大或缩小。这在场景中创建视觉效果或者调整物体大小时非常有用。

  4. 设置变换空间(Set Transform Space):您可以选择将变换应用于物体的局部坐标系(Local Space)还是全局坐标系(World Space)。在局部坐标系中进行变换会受到物体当前旋转的影响,而在全局坐标系中进行变换则会忽略物体的旋转。

  5. 多轴控制(Multiple Axis Control):您可以单独控制每个轴上的变换,以便更精确地调整物体的位置、旋转或缩放。

  6. 实时交互(Real-time Interaction):变换控制器提供实时的交互式体验,您可以通过拖动控制器上的手柄来直接调整物体的变换参数。

  7. 自定义设置(Customization):您可以通过控制器的属性来自定义其外观和行为,例如控制手柄的显示、设置控制器的大小等。

<!DOCTYPE html>
<html lang="en"><head><title>three.js webgl - transform 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"></head><body><div id="info">"W" translate | "E" rotate | "R" scale | "+/-" adjust size<br />"Q" toggle world/local space |  "Shift" snap to grid<br />"X" toggle X | "Y" toggle Y | "Z" toggle Z | "Spacebar" toggle enabled<br />"Esc" reset current transform<br />"C" toggle camera | "V" random zoom</div><script type="importmap">{"imports": {"three": "../build/three.module.js","three/addons/": "./jsm/"}}</script><script type="module">import * as THREE from 'three';import { OrbitControls } from 'three/addons/controls/OrbitControls.js';import { TransformControls } from 'three/addons/controls/TransformControls.js';let cameraPersp, cameraOrtho, currentCamera;let scene, renderer, control, orbit;init();render();function init() {renderer = new THREE.WebGLRenderer( { antialias: true } );renderer.setPixelRatio( window.devicePixelRatio );renderer.setSize( window.innerWidth, window.innerHeight );document.body.appendChild( renderer.domElement );const aspect = window.innerWidth / window.innerHeight;cameraPersp = new THREE.PerspectiveCamera( 50, aspect, 0.01, 30000 );cameraOrtho = new THREE.OrthographicCamera( - 600 * aspect, 600 * aspect, 600, - 600, 0.01, 30000 );currentCamera = cameraPersp;currentCamera.position.set( 5, 2.5, 5 );scene = new THREE.Scene();scene.add( new THREE.GridHelper( 5, 10, 0x888888, 0x444444 ) );const ambientLight = new THREE.AmbientLight( 0xffffff );scene.add( ambientLight );const light = new THREE.DirectionalLight( 0xffffff, 4 );light.position.set( 1, 1, 1 );scene.add( light );const texture = new THREE.TextureLoader().load( 'textures/crate.gif', render );texture.colorSpace = THREE.SRGBColorSpace;texture.anisotropy = renderer.capabilities.getMaxAnisotropy();const geometry = new THREE.BoxGeometry();const material = new THREE.MeshLambertMaterial( { map: texture } );orbit = new OrbitControls( currentCamera, renderer.domElement );orbit.update();orbit.addEventListener( 'change', render );control = new TransformControls( currentCamera, renderer.domElement );control.addEventListener( 'change', render );control.addEventListener( 'dragging-changed', function ( event ) {orbit.enabled = ! event.value;} );const mesh = new THREE.Mesh( geometry, material );scene.add( mesh );control.attach( mesh );scene.add( control );window.addEventListener( 'resize', onWindowResize );window.addEventListener( 'keydown', function ( event ) {switch ( event.keyCode ) {case 81: // Qcontrol.setSpace( control.space === 'local' ? 'world' : 'local' );break;case 16: // Shiftcontrol.setTranslationSnap( 100 );control.setRotationSnap( THREE.MathUtils.degToRad( 15 ) );control.setScaleSnap( 0.25 );break;case 87: // Wcontrol.setMode( 'translate' );break;case 69: // Econtrol.setMode( 'rotate' );break;case 82: // Rcontrol.setMode( 'scale' );break;case 67: // Cconst position = currentCamera.position.clone();currentCamera = currentCamera.isPerspectiveCamera ? cameraOrtho : cameraPersp;currentCamera.position.copy( position );orbit.object = currentCamera;control.camera = currentCamera;currentCamera.lookAt( orbit.target.x, orbit.target.y, orbit.target.z );onWindowResize();break;case 86: // Vconst randomFoV = Math.random() + 0.1;const randomZoom = Math.random() + 0.1;cameraPersp.fov = randomFoV * 160;cameraOrtho.bottom = - randomFoV * 500;cameraOrtho.top = randomFoV * 500;cameraPersp.zoom = randomZoom * 5;cameraOrtho.zoom = randomZoom * 5;onWindowResize();break;case 187:case 107: // +, =, num+control.setSize( control.size + 0.1 );break;case 189:case 109: // -, _, num-control.setSize( Math.max( control.size - 0.1, 0.1 ) );break;case 88: // Xcontrol.showX = ! control.showX;break;case 89: // Ycontrol.showY = ! control.showY;break;case 90: // Zcontrol.showZ = ! control.showZ;break;case 32: // Spacebarcontrol.enabled = ! control.enabled;break;case 27: // Esccontrol.reset();break;}} );window.addEventListener( 'keyup', function ( event ) {switch ( event.keyCode ) {case 16: // Shiftcontrol.setTranslationSnap( null );control.setRotationSnap( null );control.setScaleSnap( null );break;}} );}function onWindowResize() {const aspect = window.innerWidth / window.innerHeight;cameraPersp.aspect = aspect;cameraPersp.updateProjectionMatrix();cameraOrtho.left = cameraOrtho.bottom * aspect;cameraOrtho.right = cameraOrtho.top * aspect;cameraOrtho.updateProjectionMatrix();renderer.setSize( window.innerWidth, window.innerHeight );render();}function render() {renderer.render( scene, currentCamera );}</script></body>
</html>

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

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

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

相关文章

app自动化-Appium学习笔记

使用Appium&#xff0c;优点&#xff1a; 1、支持语言比较多&#xff0c;例如&#xff1a;Java、Python、Javascript、PHP、C#等语言 2、支持跨应用&#xff08;windows、mac、linux&#xff09; 3、适用平台Android、iOS 4、支持Native App(原生app)、Web App、Hybird App…

路径规划——搜索算法详解(二):Floyd算法详解与MATLAB代码

上次总结了Dijkstra算法的案例原理与代码&#xff0c;本文分享第二种比较基础且易懂的方法为Floyd算法&#xff0c;该算法可以有效正确地处理有向图的最短路径问题&#xff0c;与Dijkstra算法不同&#xff0c;Floyd算法是一种动态规划算法&#xff0c;对于稠密图效果显著。原理…

gitee多用户配置

一、引言 在工作的时候我们有时候会自己创建项目Demo来实现一些功能&#xff0c;但是又不想把自己的Demo代码放到公司的仓库代码平台&#xff08;gitee&#xff09;中管理&#xff0c;于是就是想自己放到自己的Gitee中管理&#xff0c;于是就需要配置Git多用户。 本文将配置分别…

FPGA之状态机学习

作为一名逻辑工程师&#xff0c;掌握和应用状态机设计是必不可少的。能够灵活的应用状态机是对逻辑工程师最基本的要求&#xff0c;状态机设计的好坏能够直接影响到设计系统的稳定性&#xff0c;所以学会状态机是非常的重要。 1.状态机的概念 状态机通过不同的状态迁移来完成特…

手机录屏在哪里找?手把手教你找到录屏功能

随着智能手机的普及和移动应用的快速发展&#xff0c;手机录屏功能变得越来越受欢迎。无论是记录游戏精彩瞬间、制作教程视频&#xff0c;还是为了保存重要的视频通话内容&#xff0c;手机录屏都能帮上大忙&#xff0c;可是很多人不知道手机录屏在哪里找&#xff0c;本文将介绍…

vmware,linux,centos7,NAT模式下的网络配置

centos7的NAT网络配置 NAT模式说明虚拟机网络配置工具本机配置net8网络&#xff08;NAT的网域&#xff09;本机的IP配置(用于net8局域网内解析主机IP和域名对应关系使用)&#xff08;可选&#xff09;虚拟机内的网络配置虚拟机ping不通www.baidu.com的情况下虚拟机ping可以ping…

第 1 章.提示词:开启AI智慧之门的钥匙

什么是提示词&#xff1f; 提示词&#xff0c;是引导语言模型的指令&#xff0c;让用户能够驾驭模型的输出&#xff0c;确保生成的文本符合需求。 ChatGPT&#xff0c;这位文字界的艺术大师&#xff0c;以transformer架构为基石&#xff0c;能轻松驾驭海量数据&#xff0c;编织…

【保姆级讲解Edge兼容性问题解决方法】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d; 希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

每日一题 --- 数组中的第 K 个最大元素[力扣][Go]

数组中的第 K 个最大元素 题目&#xff1a;数组中的第 K 个最大元素 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1…

设计模式-装饰者模式在Java中使用实例-打印发票装饰抬头和脚注

场景 设计模式-装饰者模式在Java中的使用示例&#xff1a; 设计模式-装饰者模式在Java中的使用示例_java装饰者模式例子-CSDN博客 上面装饰器的调用示例如下 AbstarctComputer computer;//要买1台电脑computer new BaseComputer();//加一个内存条computer new MemoryDecor…

Ansys Speos | Light Expert Group探测器组使用技巧

附件下载 联系工作人员获取附件 概述 相机挡板的设计需要在光路的不同位置同步多个照度图&#xff0c;以尽量减少杂散光。2023R2 Speos提供了一种新的探测器&#xff0c;用于高阶杂散光分析&#xff0c;可以同时对多个探测器进行光线追迹。Light Expert工具可以即时过滤3D视…

MySQL之MVCC如何实现可重复读和提交读

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ &#x1f440;&#x1f440;&#x1f440; 个人博客&#xff1a;小奥的博客 &#x1f44d;&#x1f44d;&#x1f44d;&#xff1a;个人CSDN ⭐️⭐️⭐️&#xff1a;Github传送门 &#x1f379; 本人24应届生一枚&#xff0c;技术和水平有…