10 Three.js使用orbit controls插件(轨道控制)来控制模型交互动作

来源:互联网 发布:巫师3上古卷轴5 知乎 编辑:程序博客网 时间:2024/05/16 10:55

这个效果相对于第八节的轨迹球插件使用上感觉要好,虽然轨迹球插件可以来回的滚动,但是容易分辨不清楚上下左右的关系,容易混乱,适合调试,而轨道控制插件orbit则适合客户使用,还不会产生混乱效果。下面讲一下使用。

(1)首先引入插件,文件地址在官方案例的examples/js/controls/OrbitControls.js。

(2)然后实例化函数,把相机和渲染器的dom传入,并设置相关设置。

//用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放    var controls;    function initControls() {        controls = new THREE.OrbitControls( camera, renderer.domElement );        // 如果使用animate方法时,将此函数删除        //controls.addEventListener( 'change', render );        // 使动画循环使用时阻尼或自转 意思是否有惯性        controls.enableDamping = true;        //动态阻尼系数 就是鼠标拖拽旋转灵敏度        //controls.dampingFactor = 0.25;        //是否可以缩放        controls.enableZoom = true;        //是否自动旋转        controls.autoRotate = true;        //设置相机距离原点的最远距离        controls.minDistance  = 200;        //设置相机距离原点的最远距离        controls.maxDistance  = 600;        //是否开启右键拖拽        controls.enablePan = true;    }
(3)最后,在animate函数内调用orbit的update()更新。

function animate() {        //更新控制器        controls.update();        render();        //更新性能插件        stats.update();        requestAnimationFrame(animate);    }
就实现了相关效果。下面是全部案例代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title>    <style type="text/css">        html, body {            margin: 0;            height: 100%;        }        canvas {            display: block;        }    </style></head><body onload="draw();"></body><script src="build/three.js"></script><script src="examples/js/controls/OrbitControls.js"></script><script src="examples/js/libs/stats.min.js"></script><script>    var renderer;    function initRender() {        renderer = new THREE.WebGLRenderer({antialias:true});        renderer.setSize(window.innerWidth, window.innerHeight);        document.body.appendChild(renderer.domElement);    }    var camera;    function initCamera() {        camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 10000);        camera.position.set(0, 0, 400);    }    var scene;    function initScene() {        scene = new THREE.Scene();    }    var light;    function initLight() {        scene.add(new THREE.AmbientLight(0x404040));        light = new THREE.DirectionalLight(0xffffff);        light.position.set(1,1,1);        scene.add(light);    }    function initModel() {        var map = new THREE.TextureLoader().load("examples/textures/UV_Grid_Sm.jpg");        var material = new THREE.MeshLambertMaterial({map:map});        var cube = new THREE.Mesh(new THREE.BoxGeometry(100, 200, 100, 1, 1, 1), material);        scene.add(cube);    }    //初始化性能插件    var stats;    function initStats() {        stats = new Stats();        document.body.appendChild(stats.dom);    }    //用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放    var controls;    function initControls() {        controls = new THREE.OrbitControls( camera, renderer.domElement );        // 如果使用animate方法时,将此函数删除        //controls.addEventListener( 'change', render );        // 使动画循环使用时阻尼或自转 意思是否有惯性        controls.enableDamping = true;        //动态阻尼系数 就是鼠标拖拽旋转灵敏度        //controls.dampingFactor = 0.25;        //是否可以缩放        controls.enableZoom = true;        //是否自动旋转        controls.autoRotate = true;        //设置相机距离原点的最远距离        controls.minDistance  = 200;        //设置相机距离原点的最远距离        controls.maxDistance  = 600;        //是否开启右键拖拽        controls.enablePan = true;    }    function render() {        renderer.render( scene, camera );    }    //窗口变动触发的函数    function onWindowResize() {        camera.aspect = window.innerWidth / window.innerHeight;        camera.updateProjectionMatrix();        render();        renderer.setSize( window.innerWidth, window.innerHeight );    }    function animate() {        //更新控制器        controls.update();        render();        //更新性能插件        stats.update();        requestAnimationFrame(animate);    }    function draw() {        initRender();        initScene();        initCamera();        initLight();        initModel();        initControls();        initStats();        animate();        window.onresize = onWindowResize;    }</script></html>




阅读全文
0 0