• threejs对象控制


    threejs对象控制

    threejs controls transform

    <!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>
    
            <script type="module">
    
                import * as THREE from '../build/three.module.js';
    
                import { OrbitControls } from './jsm/controls/OrbitControls.js';
                import { TransformControls } from './jsm/controls/TransformControls.js';
    
                let cameraPersp, cameraOrtho, currentCamera;
                let scene, renderer, control, orbit;
    
                init();
                render();
    
                function init() {
    
                    renderer = new THREE.WebGLRenderer();
                    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( 1000, 500, 1000 );
                    currentCamera.lookAt( 0, 200, 0 );
    
                    scene = new THREE.Scene();
                    scene.add( new THREE.GridHelper( 1000, 10, 0x888888, 0x444444 ) );
    
                    const light = new THREE.DirectionalLight( 0xffffff, 2 );
                    light.position.set( 1, 1, 1 );
                    scene.add( light );
    
                    const texture = new THREE.TextureLoader().load( 'textures/crate.gif', render );
                    texture.anisotropy = renderer.capabilities.getMaxAnisotropy();
    
                    const geometry = new THREE.BoxGeometry( 200, 200, 200 );
                    const material = new THREE.MeshLambertMaterial( { map: texture, transparent: true } );
    
                    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;
    
                        }
    
                    } );
    
                    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>

    参考:https://threejs.org/examples/#webgl_animation_keyframes

    ###################

  • 相关阅读:
    用webclient.DownloadFile下载exe文件时大小为0
    C# ,asp.net 获取当前,相对,绝对路径(转)
    c#读取进程列表判断程序是否已经启动(转)
    如何提升页面渲染效率
    前端知识点总结——VUE
    ie7ajax 跨域 no transport 解决办法
    酷炫网址
    框架学习官网
    JavaScript数组方法大全(推荐)
    rem是如何实现自适应布局的
  • 原文地址:https://www.cnblogs.com/herd/p/16331382.html
Copyright © 2020-2023  润新知