👨??? 主頁: gis分享者
👨??? 感謝各位大佬 點贊👍 收藏? 留言📝 加關注?!
👨??? 收錄于專欄:threejs gis工程師
文章目錄
- 一、🍀前言
- 1.1 ??THREE.FlyControls 相機控制器
- 二、🍀使用FlyControls相機控制器
- 1. ??實現思路
- 2. ??代碼樣例
一、🍀前言
本文詳細介紹如何基于threejs在三維場景中使用FlyControls相機控制器,親測可用。希望能幫助到您。一起學習,加油!加油!
1.1 ??THREE.FlyControls 相機控制器
TrackballControls啟用了一種類似于數字內容創建工具(例如Blender)中飛行模式的導航方式。 你可以在3D空間中任意變換攝像機,并且無任何限制(例如,專注于一個特定的目標)。
構造函數:
FlyControls( object : Camera, domElement : HTMLDOMElement )
object: 被控制的攝像機。
domElement: 用于事件監聽的HTML元素。
創建一個新的 FlyControls 實例。
屬性:
.autoForward : Boolean
若該值設為true,初始變換后,攝像機將自動向前移動(且不會停止)。默認為false。
.domElement : HTMLDOMElement
該 HTMLDOMElement 用于監聽鼠標/觸摸事件,該屬性必須在構造函數中傳入。在此處改變它將不會設置新的事件監聽。
.dragToLook : Boolean
若該值設為true,你將只能通過執行拖拽交互來環視四周。默認為false。
.movementSpeed : Number
移動速度,默認為1。
.object : Camera
被控制的攝像機。
.rollSpeed : Number
旋轉速度。默認為0.005。
方法:
.dispose () : undefined
若不再需要該控制器,則應當調用此函數。
.update ( delta : Number ) : undefined
delta: 時間增量值。
更新控制器,常被用在動畫循環中。
事件:
change
當相機已被控件轉換時觸發。
二、🍀使用FlyControls相機控制器
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.FlyControls相機控制器flyControls,設置flyControls相關參數。加入stats監控器,監控幀數信息。
2. ??代碼樣例
<!DOCTYPE html>
<html>
<head><title>學習threejs,使用FlyControls相機控制器</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/FlyControls.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();// 創建三維場景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 flyControls = new THREE.FlyControls(camera);flyControls.movementSpeed = 25;flyControls.domElement = document.querySelector("#WebGL-output");flyControls.rollSpeed = Math.PI / 24;flyControls.autoForward = true;flyControls.dragToLook = false;var ambientLight = new THREE.AmbientLight(0x383838);scene.add(ambientLight);// 添加聚光燈光源,設置位置和光強var spotLight = new THREE.SpotLight(0xffffff);spotLight.position.set(100, 140, 130);spotLight.intensity = 2;scene.add(spotLight);// 渲染器綁定頁面要素document.getElementById("WebGL-output").appendChild(webGLRenderer.domElement);var step = 0;var controls = new function () {};var gui = new dat.GUI();var mesh;var loader = new THREE.OBJMTLLoader();var load = function (object) {var scale = chroma.scale(['red', 'green', 'blue']);setRandomColors(object, scale);mesh = object;scene.add(mesh);};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 meshif (object instanceof THREE.Mesh) {object.material.color = new THREE.Color(scale(Math.random()).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();flyControls.update(delta);webGLRenderer.clear();requestAnimationFrame(render);webGLRenderer.render(scene, camera)}function initStats() {var stats = new Stats();stats.setMode(0); // 0: fps, 1: ms// Align top-leftstats.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>
效果如下: