首页 > 其他分享 >TransformControls 用于在网页中进行 3D 场景中物体的交互式操作

TransformControls 用于在网页中进行 3D 场景中物体的交互式操作

时间:2024-08-19 12:06:55浏览次数:7  
标签:control case 控制器 TransformControls THREE break 交互式 new 3D

demo案例:https://techbrood.com/threejs/examples/#misc_controls_transform

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

自定义设置(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: // Q
                            control.setSpace( control.space === 'local' ? 'world' : 'local' );
                            break;

                        case 16: // Shift
                            control.setTranslationSnap( 100 );
                            control.setRotationSnap( THREE.MathUtils.degToRad( 15 ) );
                            control.setScaleSnap( 0.25 );
                            break;

                        case 87: // W
                            control.setMode( 'translate' );
                            break;

                        case 69: // E
                            control.setMode( 'rotate' );
                            break;

                        case 82: // R
                            control.setMode( 'scale' );
                            break;

                        case 67: // C
                            const 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: // V
                            const 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: // X
                            control.showX = ! control.showX;
                            break;

                        case 89: // Y
                            control.showY = ! control.showY;
                            break;

                        case 90: // Z
                            control.showZ = ! control.showZ;
                            break;

                        case 32: // Spacebar
                            control.enabled = ! control.enabled;
                            break;

                        case 27: // Esc
                            control.reset();
                            break;

                    }

                } );

                window.addEventListener( 'keyup', function ( event ) {

                    switch ( event.keyCode ) {

                        case 16: // Shift
                            control.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>
View Code

 



转载:https://blog.csdn.net/qq_37030315/article/details/137037850

标签:control,case,控制器,TransformControls,THREE,break,交互式,new,3D
From: https://www.cnblogs.com/lst619247/p/18367042

相关文章

  • InstantStyleGaussian:利用3D Gaussian Splatting实现高效艺术风格迁移
    前言 本文介绍了InstantStyleGaussian,这是一种基于三维高斯飞溅(3DGS)场景表示的创新三维风格迁移方法。通过输入目标风格图像,它能够快速生成新的三维GS场景。方法作用于预先重建的GS场景,结合了扩散模型与改进的迭代数据集更新策略。它利用扩散模型生成目标风格图像,将这些新图像添......
  • 【Head3D X 2024 三维RGB - 头部三维数据集-RGB-高精度-三维建模渲染-高清】
    Head3DX2024商用数据集一、数据标注信息(数据量20w+)1)高清原图(短边高于等于2000像素)2)三维头部mesh(obj文件)3)三维虚拟相机内参(npy文件)4)二维头部关键点信息(npy文件5)姿态角(pitch,roll,yaw)检测(基于相机坐标系)三维维建模渲染示例:(Head3D2024三维渲染......
  • opencascade Adaptor3d_Curve源码学习
    opencascadeAdaptor3d_Curve前言用于几何算法工作的3D曲线的根类。适配曲线是曲线提供的服务与使用该曲线的算法所需服务之间的接口。提供了两个派生具体类:GeomAdaptor_Curve,用于Geom包中的曲线Adaptor3d_CurveOnSurface,用于Geom包中表面上的曲线。用于评估BSpline......
  • asp.net 禁止主机交互式 shell 命令执行权限风险 ashx
    以下为ai回复:在ASP.NET应用程序中,如果要防止通过ashx文件执行宿主环境的shell命令以避免潜在的权限提升风险,可以通过设置web.config来限制或禁用此功能。在web.config中,可以通过设置<securityPolicy>来禁止执行shell命令。以下是一个示例配置,它禁用了所有的shell执行权限:<syst......
  • 3D VC基础知识与应用场景
     ......
  • [Paper Reading] Single-to-Dual-View Adaptation for Egocentric 3D Hand Pose Estim
    名称Single-to-Dual-ViewAdaptationforEgocentric3DHandPoseEstimation时间:CVPR2024机构:TheUniversityofTokyoTL;DR多目3Dhandposeestimation数据比较难标注,作者核心思路是先训练单目模型,利用无监督的方法适配到双目场景,好处是a.无需标多目数据;b.可以适应任何......
  • 网易codewave_3D模型嵌入展示
    网易codewave是一个企业级智能开发平台,可以帮助用户轻松实现“智能生成逻辑”+“可视化拖拽生成页面”的全栈低代码应用搭建。将多种3D模型格式无缝集成到网易codewave业务表单中,实现3D模型的在线预览。这意味着用户可以在不离开网易codewave平台的情况下,直接查看和操作3D模型......
  • AI应用任何PDF转换为交互式仪表盘
    AI应用任何PDF转换为交互式仪表盘 背景      在不到一分钟的时间内将任何PDF转换为交互式仪表板(下面的提示词):这适用于所有可以正确编码的AI聊天机器人,例如ChatGPT4o、MistralLarge2、ClaudeSonnet3.5、Llama405b等大模型。ChatGPT4.0:开发商:OpenAI......
  • 突破传统看车局限,3DCAT实时云渲染为东风日产奇骏赋能
    在当今数字化飞速发展的时代,汽车行业的营销也面临着诸多变革与挑战。线下展示由于受到场地空间的限制,往往无法全面展示所有车型,且建设成本高昂。而一些销售门店可能因位置偏僻等因素,导致客户上门看车、试驾的邀约变得困难重重。图源网络传统的线上看车方式也存在着明显的不足......
  • 【3DGS】从新视角合成到3D_Gaussian_Splatting
    @目录引言:什么是新视角合成任务定义一般步骤NeRF的做法NeRF的三维重建NeRF的渲染3DGS的三维重建从一组图片估计点云高斯点云模型球谐函数参数优化损失函数和参数优化高斯点的数量控制(AdaptiveDensityControl)新的问题3DGS的渲染:快速可微光栅化3DGS的限制引言:什么是新视角合成......