【问题标题】:Make the plane draggable in ThreeJS在 ThreeJS 中使平面可拖动
【发布时间】:2020-04-23 14:56:13
【问题描述】:

如何使平面可在 X 、 Y 方向拖动。在这里,我正在尝试在 X 和 Y 方向上绘制平面的框剪辑。但我不知道如何使它可拖动到特定方向。谁能帮我解决这个问题。

我想让飞机在鼠标事件中只能在自己的方向上拖动

    import * as THREE from '../build/three.module.js';

    import Stats from './jsm/libs/stats.module.js';
    import { GUI } from './jsm/libs/dat.gui.module.js';

    import { OrbitControls } from './jsm/controls/OrbitControls.js';
    import { DragControls } from './jsm/controls/DragControls.js';

    var camera, scene, renderer, startTime, object, stats;

    init();
    animate();

    function init() {

        camera = new THREE.PerspectiveCamera(36, window.innerWidth / window.innerHeight, 0.0001, 100000);

        camera.position.set(0, 1.3, 8);

        scene = new THREE.Scene();

        // Lights

        scene.add(new THREE.AmbientLight(0x505050));
        scene.background = new THREE.Color('white')
        var spotLight = new THREE.SpotLight(0xffffff);
        spotLight.angle = Math.PI / 5;
        spotLight.penumbra = 0.2;
        spotLight.position.set(2, 3, 3);
        spotLight.castShadow = true;
        spotLight.shadow.camera.near = 3;
        spotLight.shadow.camera.far = 10;
        spotLight.shadow.mapSize.width = 1024;
        spotLight.shadow.mapSize.height = 1024;
        scene.add(spotLight);

        var dirLight = new THREE.DirectionalLight(0x55505a, 1);
        dirLight.position.set(0, 3, 0);
        dirLight.castShadow = true;
        dirLight.shadow.camera.near = 1;
        dirLight.shadow.camera.far = 10;

        dirLight.shadow.camera.right = 1;
        dirLight.shadow.camera.left = - 1;
        dirLight.shadow.camera.top = 1;
        dirLight.shadow.camera.bottom = - 1;

        dirLight.shadow.mapSize.width = 1024;
        dirLight.shadow.mapSize.height = 1024;
        scene.add(dirLight);

        // ***** Clipping planes: *****

        var localPlane = new THREE.Plane(new THREE.Vector3(0, - 1, 0), 1.5);
        var helper1 = new THREE.PlaneHelper(localPlane, 3, 0xffff00);
        scene.add(helper1);
        var globalPlane = new THREE.Plane(new THREE.Vector3(- 1, 0, 0), 1);
        var helper = new THREE.PlaneHelper(globalPlane, 3, 0xffff00);
        scene.add(helper);          // Geometry

        var material = new THREE.MeshPhongMaterial({
            color: 0x80ee10,
            shininess: 100,
            side: THREE.DoubleSide,

            // ***** Clipping setup (material): *****
            clippingPlanes: [localPlane],
            clipShadows: true

        });

        var geometry = new THREE.TorusKnotBufferGeometry(0.4, 0.08, 95, 20);

        object = new THREE.Mesh(geometry, material);
        object.castShadow = true;
        scene.add(object);

        var ground = new THREE.Mesh(
            new THREE.PlaneBufferGeometry(9, 9, 1, 1),
            new THREE.MeshPhongMaterial({ color: 0xa0adaf, shininess: 150 })
        );

        ground.rotation.x = - Math.PI / 2; // rotates X/Y to X/Z
        ground.receiveShadow = true;
        // scene.add( ground );

        // Stats

        stats = new Stats();
        document.body.appendChild(stats.dom);

        // Renderer

        renderer = new THREE.WebGLRenderer({ antialias: true });
        renderer.shadowMap.enabled = true;

        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);
        window.addEventListener('resize', onWindowResize, false);
        document.body.appendChild(renderer.domElement);

        // ***** Clipping setup (renderer): *****
        var globalPlanes = [globalPlane],
            Empty = Object.freeze([]);
        renderer.clippingPlanes = Empty; // GUI sets it to globalPlanes
        renderer.localClippingEnabled = true;
        renderer.clippingPlanes = globalPlanes;

        // Controls

        var controls = new OrbitControls(camera, renderer.domElement);
        controls.target.set(0, 1, 0);
        controls.update();

        // controls1 = new DragControls([...globalPlane], camera, renderer.domElement);
        // controls1.addEventListener('drag', render);
        // GUI

        var gui = new GUI(),
            folderLocal = gui.addFolder('Local Clipping'),
            propsLocal = {

                get 'Enabled'() {

                    return renderer.localClippingEnabled;

                },
                set 'Enabled'(v) {

                    renderer.localClippingEnabled = v;

                },

                get 'Shadows'() {

                    return material.clipShadows;

                },
                set 'Shadows'(v) {

                    material.clipShadows = v;

                },

                get 'Plane'() {

                    return localPlane.constant;

                },
                set 'Plane'(v) {

                    localPlane.constant = v;

                }

            },

            folderGlobal = gui.addFolder('Global Clipping'),
            propsGlobal = {

                get 'Enabled'() {
                    console.log('hitting 1')
                    return renderer.clippingPlanes !== Empty;
                    console.log(renderer.clippingPlanes);

                },
                set 'Enabled'(v) {
                    console.log('hitting 2')
                    renderer.clippingPlanes = v ? globalPlanes : Empty;
                    console.log(renderer.clippingPlanes);

                },

                get 'Plane'() {

                    return globalPlane.constant;

                },
                set 'Plane'(v) {

                    globalPlane.constant = v;

                }

            };

        folderLocal.add(propsLocal, 'Enabled');
        folderLocal.add(propsLocal, 'Shadows');
        folderLocal.add(propsLocal, 'Plane', 0.3, 1.25);

        folderGlobal.add(propsGlobal, 'Enabled');
        folderGlobal.add(propsGlobal, 'Plane', - 0.4, 3);

        // Start

        startTime = Date.now();
        document.addEventListener('click', onClick, false);

    }

    function onClick(event) {

        event.preventDefault();

        if (enableSelection === true) {

            var draggableObjects = controls.getObjects();
            draggableObjects.length = 0;

            mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
            mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;

            raycaster.setFromCamera(mouse, camera);

            var intersections = raycaster.intersectObjects(objects, true);

            if (intersections.length > 0) {

                var object = intersections[0].object;

                if (group.children.includes(object) === true) {

                    object.material.emissive.set(0x000000);
                    scene.attach(object);

                } else {

                    object.material.emissive.set(0xaaaaaa);
                    group.attach(object);

                }

                controls.transformGroup = true;
                draggableObjects.push(group);

            }

            if (group.children.length === 0) {

                controls.transformGroup = false;
                draggableObjects.push(...objects);

            }

        }

        render();

    }

    function onWindowResize() {

        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();

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

    }

    function animate() {

        // var currentTime = Date.now();
        // var time = ( currentTime - startTime ) / 1000;

        requestAnimationFrame(animate);

        // object.position.y = 0.8;
        // object.rotation.x = time * 0.5;
        // object.rotation.y = time * 0.2;
        // object.scale.setScalar( Math.cos( time ) * 0.125 + 0.875 );

        stats.begin();
        renderer.render(scene, camera);
        stats.end();

    }

【问题讨论】:

    标签: three.js


    【解决方案1】:

    为了在three.js 中移动东西,您使用TransformControls。查看https://threejs.org/docs/#examples/en/controls/TransformControls 获取其文档,查看https://github.com/mrdoob/three.js/blob/master/examples/misc_controls_transform.html 获取实现示例。

    您可以在此处将模式设置为“平移”并缩放为“XY”以限制仅在 X 和 Y 方向上的移动。

    controls.axis ="XY";
    

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2017-01-19
      • 2018-06-20
      • 1970-01-01
      • 2011-06-10
      • 2013-03-25
      相关资源
      最近更新 更多