当前位置: 首页 > article >正文

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

👨‍⚕️ 主页: gis分享者
👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨‍⚕️ 收录于专栏:threejs gis工程师


文章目录

  • 一、🍀前言
    • 1.1 ☘️THREE.RollControls 相机控制器
  • 二、🍀使用RollControls相机控制器
    • 1. ☘️实现思路
    • 2. ☘️代码样例


一、🍀前言

本文详细介绍如何基于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. ☘️代码样例

<!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>

效果如下:
在这里插入图片描述


http://www.kler.cn/a/505039.html

相关文章:

  • HTML中最基本的东西
  • 计算机的错误计算(二百一十二)
  • Vue3使用vue-count-to数字滚动模块报错解决方案
  • 神经网络
  • Kbengine+Unity3D多人在线游戏服务器+客户端从源码详细搭建教程
  • 源码安装httpd2.4
  • JavaScript-正则表达式方法(RegExp)
  • ref useRef React.createRef React.forwardRef
  • PostgreSQL 语法
  • MySQL数据库基本操作命令
  • gitlab runner正常连接 提示 作业挂起中,等待进入队列 解决办法
  • 基于当前最前沿的前端(Vue3 + Vite + Antdv)和后台(Spring boot)实现的低代码开发平台
  • 代码随想录算法训练营day02| 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II
  • 裸金属服务器和虚拟机之间的区别
  • CentOS 9 Stream 中查看 Python 版本并升级 Python
  • react中hooks之useRef 用法总结
  • Hadoop3.3.4伪分布式环境搭建
  • 《Vue3实战教程》34:Vue3状态管理
  • 大数据学习(33)-spark-transformation算子
  • Android BitmapShader更简易的实现刮刮乐功能,Kotlin
  • 计算机二级-Java系列(Java的特点)
  • nodejs后端ws与http结合共享一个服务器,前端websocket发送信息后端ws接收信息,使用Map定型数组设置ID
  • rust调用DLL或lib
  • Redis 缓存穿透、击穿、雪崩 的区别与解决方案
  • 微软组建新内部 AI 研发组织:开启智能创新新篇章
  • GPT-SoVITS学习01