学习threejs,使用RollControls相机控制器

👨‍⚕️ 主页: gis分享者

👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍⚕️ 收录于专栏:threejs gis工程师


文章目录


一、🍀前言

本文详细介绍如何基于threejs在三维场景中使用RollControls相机控制器,亲测可用。希望能帮助到您。一起学习,加油!加油!

1.1 ☘️THREE.RollControls 相机控制器

RollControls是Three.js库中的一个相机控制器,专门用于实现相机的翻滚动作。

构造函数:

THREE.RollControls(object, domElement)

object:通常是一个THREE.Camera对象,表示要控制的相机。

domElement:(可选)用于事件监听的DOM元素。如果不提供,则默认使用整个文档作为事件监听范围。

属性

.movementSpeed : Number

控制相机翻滚的移动速度。值越大,相机翻滚得越快。
.lookSpeed : Number

控制相机在翻滚时观察方向的变化速度。值越大,观察方向变化得越快。
keys : Object

一个对象,用于定义控制相机翻滚的键盘按键。开发者可以根据需要修改这个对象的属性来重新映射按键。

方法

.update(delta) : undefined

delta:时间间隔,通常用于计算动画的帧率。

更新控制器的状态。这个方法应该在动画循环中被调用,以确保相机的翻滚动作能够实时响应输入。
.reset() : undefined

重置控制器的状态。这个方法可以用于将相机恢复到初始位置或清除之前的翻滚动作。

二、🍀使用RollControls相机控制器

1. ☘️实现思路

  • 1、初始化renderer渲染器
  • 2、初始化Scene三维场景scene
  • 3、初始化camera相机,定义相机位置 camera.position.set,设置相机方向camera.lookAt。
  • 4、创建THREE.SpotLight聚光灯光源spotLight,设置spotLight的位置信息和光照强度,场景scene中添加spotLight。
  • 5、加载几何模型:创建THREE.OBJMTLLoader加载器loader,loader调用load方法加载'city.mtl'、'city.obj'模型。在load回调函数中,设置建筑物网格对象材质颜色和非建筑网格对象材质透明度、放射(光)颜色等信息。具体代码参考代码样例。
  • 6、加入THREE.RollControls相机控制器rollControls,设置rollControls相关参数。加入stats监控器,监控帧数信息。

2. ☘️代码样例

html 复制代码
<!DOCTYPE html>

<html>

<head>
    <title>使用RollControls相机控制器</title>
    <script type="text/javascript" src="../libs/three.js"></script>
    <script type="text/javascript" src="../libs/OBJLoader.js"></script>
    <script type="text/javascript" src="../libs/MTLLoader.js"></script>
    <script type="text/javascript" src="../libs/OBJMTLLoader.js"></script>
    <script type="text/javascript" src="../libs/stats.js"></script>
    <script type="text/javascript" src="../libs/dat.gui.js"></script>
    <script type="text/javascript" src="../libs/chroma.js"></script>
    <script type="text/javascript" src="../libs/RollControls.js"></script>

    <style>
        body {
            /* set margin to 0 and overflow to hidden, to go fullscreen */
            margin: 0;
            overflow: hidden;
        }
    </style>
</head>
<body>

<div id="Stats-output">
</div>
<!-- Div which will hold the Output -->
<div id="WebGL-output">
</div>

<!-- Javascript 代码 -->
<script type="text/javascript">

    // 初始化
    function init() {


        var clock = new THREE.Clock();

        var stats = initStats();

        // 创建三维场景scene
        var scene = new THREE.Scene();

        // 创建相机
        var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);


        // 创建渲染器,并设置大小、颜色和阴影
        var webGLRenderer = new THREE.WebGLRenderer();
        webGLRenderer.setClearColor(new THREE.Color(0x000, 1.0));
        webGLRenderer.setSize(window.innerWidth, window.innerHeight);
        webGLRenderer.shadowMapEnabled = true;

        // 设置相机位置和方向
        camera.position.x = 100;
        camera.position.y = 100;
        camera.position.z = 300;
        camera.lookAt(new THREE.Vector3(0, 0, 0));


        var ambientLight = new THREE.AmbientLight(0x383838);
        scene.add(ambientLight);

        // 添加聚光灯光源,设置位置和光照强度
        var spotLight = new THREE.SpotLight(0xffffff);
        spotLight.position.set(300, 300, 300);
        spotLight.intensity = 1;
        scene.add(spotLight);

        // 渲染器和html元素绑定
        document.getElementById("WebGL-output").appendChild(webGLRenderer.domElement);

        var step = 0;


        var controls = new function () {l
        };

        var gui = new dat.GUI();
        var mesh;

        var rollControls;
        var loader = new THREE.OBJMTLLoader();
        var load = function (object) {

            var scale = chroma.scale(['#aaffaa', '#ffff00', '#ffffff']);
            setRandomColors(object, scale);

            mesh = object;
            scene.add(mesh);
            rollControls = new THREE.RollControls(camera);

            rollControls.movementSpeed = 25;
            rollControls.lookSpeed = 3;
        };

        loader.load('../assets/models/city.obj', '../assets/models/city.mtl', load);

        function setCamControls() {
        }

        render();

        function setRandomColors(object, scale) {
            var children = object.children;
            if (children && children.length > 0) {
                children.forEach(function (e) {
                    setRandomColors(e, scale)
                });
            } else {
                // no children assume contains a mesh
                if (object instanceof THREE.Mesh) {
                    var height = 0;
                    var vertices = object.geometry.vertices;
                    vertices.forEach(function (e) {
                        if (e.y > height) {
                            height = e.y;
                        }
                    });
                    object.material.color = new THREE.Color(scale(height / 35).hex());
                    if (object.material.name.indexOf("building") == 0) {
//                        object.material.emissive = new THREE.Color(0x444444);
                        object.material.transparent = true;
                        object.material.opacity = 0.8;
                    }
                }
            }
        }


        function render() {
            stats.update();
            var delta = clock.getDelta();

            if (rollControls) {
                rollControls.update(delta);
            }

            webGLRenderer.clear();
            requestAnimationFrame(render);
            webGLRenderer.render(scene, camera)
        }

        function initStats() {

            var stats = new Stats();
            stats.setMode(0); 
            
            stats.domElement.style.position = 'absolute';
            stats.domElement.style.left = '0px';
            stats.domElement.style.top = '0px';

            document.getElementById("Stats-output").appendChild(stats.domElement);

            return stats;
        }
    }
    window.onload = init;
</script>
</body>
</html>

效果如下:

相关推荐
gis分享者3 天前
学习threejs,使用PointLight点光源
threejs·点光源·pointlight
gis分享者7 天前
学习threejs,使用HemisphereLight半球光
threejs·hemispherelight·半球光
gis分享者11 天前
学习threejs,使用Lensflare模拟镜头眩光
threejs·lensflare·眩光
gis分享者14 天前
学习threejs,tga格式图片文件贴图
threejs·贴图·tga·tgaloader
gis分享者14 天前
学习threejs,pvr格式图片文件贴图
threejs·贴图·pvr
gis分享者1 个月前
学习threejs,使用OrbitControls相机控制器
threejs·相机·相机控制器·orbitcontrols
不系舟1781 个月前
threejs 实现镜面反射,只反射指定物体,背景透明
threejs
gis分享者1 个月前
学习threejs,使用FlyControls相机控制器
threejs·相机控制器·flycontrols
gis分享者1 个月前
学习threejs,使用TrackballControls相机控制器
threejs·trackball·相机控制器