1. 程式人生 > >Three.js(二)LOD原始碼註釋

Three.js(二)LOD原始碼註釋

//對lod的原始碼進行了註釋
/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/
//  目錄src/objects/LOD.js
<script>
	THREE.LOD = function () 
	{
		THREE.Object3D.call( this );
		this.objects = [];
	};


	THREE.LOD.prototype = Object.create( THREE.Object3D.prototype );
	//新增細節
	THREE.LOD.prototype.addLevel = function ( object, distance ) 
	{
		if ( distance === undefined ) 
			distance = 0;//未定義距離時為0
		distance = Math.abs( distance );//取距離的絕對值
		//將各個細節的距離進行從小到大的排序
		for ( var l = 0; l < this.objects.length; l ++ ) 
		{
			if ( distance < this.objects[ l ].distance ) 
			{
				break;
			}
		}

		this.objects.splice( l, 0, { distance: distance, object: object } );//?objects.splice
		this.add( object );

	};
	//根據距離返回對應層次的物件
	THREE.LOD.prototype.getObjectForDistance = function ( distance ) 
	{
		//排序由小到大遍歷
		for ( var i = 1, l = this.objects.length; i < l; i ++ )
		{
			if ( distance < this.objects[ i ].distance )
			{

				break;
			}
		}
		return this.objects[ i - 1 ].object;
	};
	//更新顯示的層次
	THREE.LOD.prototype.update = function () 
	{
	
		var v1 = new THREE.Vector3();//點1
		var v2 = new THREE.Vector3();//點2
		return function ( camera ) 
		{
			//當細節層次不為1時
			if ( this.objects.length > 1 ) 
			{
				v1.setFromMatrixPosition( camera.matrixWorld );//相機的矩陣
				v2.setFromMatrixPosition( this.matrixWorld );//LOD的矩陣
				var distance = v1.distanceTo( v2 );//相機到LOD的距離
				this.objects[ 0 ].object.visible = true;//第一層(細節最詳細)的可見性為true
				//向細節不詳細的層次距離遍歷
				for ( var i = 1, l = this.objects.length; i < l; i ++ ) 
				{
					//距離小的詳細程度高的可見度為false
					if ( distance >= this.objects[ i ].distance ) 
					{
						this.objects[ i - 1 ].object.visible = false;
						this.objects[ i ].object.visible = true;
					} 
					//到達對應的詳細程度的距離區間後跳出
					else 
					{
						break;
					}
				}	
				//對應級別向後的可見度為false
				for( ; i < l; i ++ ) 
				{
					this.objects[ i ].object.visible = false;
				}
			}
		};
	}();

	THREE.LOD.prototype.clone = function ( object ) 
	{	
		//未定義時宣告lod
		if ( object === undefined ) 
			object = new THREE.LOD();
		//將LOD複製到object中
		THREE.Object3D.prototype.clone.call( this, object); 
		//依次新增每個細節到object中
		for ( var i = 0, l = this.objects.length; i < l; i ++ )
		{
			var x = this.objects[i].object.clone();
			x.visible = i === 0;
			object.addLevel( x, this.objects[i].distance );
		}
		return object;
	};
</script>

相關推薦

Three.jsLOD原始碼註釋

//對lod的原始碼進行了註釋 /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://

資料結構LinkedList原始碼分析

一、基本概念 1、關係圖: public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, C

JS基本知識

一 預解釋 1、預解釋(變數提聲):在當前的作用域中,JS程式碼執行之前,瀏覽器首先會預設的把所有帶var和function的進行提前的宣告或者定義。 2、var和function在預解釋的時候操作不同: var:在預解釋的時候只是提前的宣告 funct

Hadoop Yarn原始碼閱讀系列Yarn原始碼目錄組織結構

Hadoop Yarn分為5部分:API、Common、Applications、Client和Server,他們的內容具體如下: YARN API(hadoop-yarn-api目錄):給出了YARN記憶體涉及的4個主要RPC協議的Java宣告和Protocol Buffers定義,這4個RP

Java原始碼解析系列ArrayList原始碼解析

備註:以下都是基於JDK8 原始碼分析 ArrayList簡介        ArrayList 是一個數組佇列,相當於 動態陣列。與Java中的陣列相比,它的容量能動態增長。它繼承於AbstractList,實現了List, RandomAccess, Clonea

Android應用程式啟動詳解原始碼瞭解App的啟動過程

本文承接《Android應用程式啟動詳解(一)》繼續來學習應用程式的啟動的那些事。上文提到startActivity()方法啟動一個app後經過一翻過程就到了app的入口方法ActivityThread.main()。其實我們在之前的文章中《Android的訊息機制(二)之L

微信小程式“反編譯”實戰原始碼還原

小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java線上bug實時監控。真的是一個很好用的bug監控服務,眾多大佬公司都在使用。 在上一篇文章《微信小程式“反編譯”實戰(一):解包》中,我們詳細介紹瞭如何獲取某一個小程式

rpm包打包過程詳解——製作原始碼安裝包

製作原始碼安裝包(.tar.gz) 1.      解決依賴的軟體: 系統環境:[紅帽企業Linux.6.4.64位伺服器版].rhel-server-6.4-x86_64 原始碼製作中使用到的軟體為GNU M4,GNU autoconf,GNU automake;GNU

mongo shell啟動配置檔案.mongorc.js

如果你的主目錄下有個.mongorc.js檔案,那麼當你啟動shell時他就會自動執行。使用它可以初始化任何你經常使用的helper方法和你不想意外操作的刪除方法。 比如,你不想使用預設的dropDatabase()方法了,你可以在.mongorc.js檔案中新增下面的命令: 複製內容到剪貼簿 程式碼:

ghostscript原始碼分析之interp()函式之IREF_NEXT巨集分析

interp()函式用了大量的巨集。IREF_NEXT只是其中一個巨集,但是出現的頻率很高。 但是透徹的理解這個巨集將為理解interp()函式提供便利。 它的定義形式如下: #define IREF_NEXT(ip)/ ((const ref_packed *)((const re

問答方式學 Node.js

Q: 好了,我們繼續談談 Node.js 吧,我記得上次說到了「非阻塞」和「事件驅動」,這引起了我的好奇心,但是又給我潑了一桶冷水,這兩個詞有點高階。 A:別急,我們先來看一個簡單的場景: 人人網刷朋友新鮮事你應該用過吧?實現這樣的功能有一種簡單的方式,是讓使用者與伺服器之間保持一個長輪詢。 但是它與普

從零開始學 Web 之 Vue.js過濾器,按鍵修飾符,自定義指令

大家好,這裡是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 部落格園:http://www.cnblogs.com/lvonve/ CSDN:https://blog.csdn.net/lvonve/

學習使用vue.js宣告式渲染 和 指令繫結

<——— 在這之前,你肯定會注意到上面箭頭所指的位置,那麼你一定會看見,文章外面的大拇指圖示,動動你的手指,就能點一下它,表示你很喜歡這篇文章。 正題: 如果你不願意多花時間去自學vue.js 官網的API,那麼你可以在跟著下面的例子學習最實用

Android Recovery OTA升級—— Recovery原始碼解析

目錄 概述 之前部落格裡一篇文章講解了OTA包的生成原理,這篇文章主要是從Recovery原始碼的角度介紹一下Recovery是如何使用OTA包進行系統升級的。 為了防止洩密,本文原始碼都是基於Android4.4.2_r1版本進行分析。

JS-閉包和箭頭函式

(一)閉包 一、函式作為返回值 高階函式除了可以接受函式作為引數外,還可以把函式作為結果值返回。 求和的函式定義: function sum(arr) {     return arr.reduce(function (x, y) {         return x +

require js結合director.js配置項

目錄 __js |__jquery.min.js |__director.js |__bootstrap.bundle.min.js |__test |__js

深入理解阻塞佇列——ArrayBlockingQueue原始碼分析

在深入理解阻塞佇列(一)——基本結構中,介紹了BlockingQueue這一介面的子類以及子介面。本文主要就其中的一個實現類:ArrayBlockingQueue進行原始碼分析,分析阻塞佇列的阻塞是如何實現的。 概述 ArrayBlockingQueue

快速排序 jdk原始碼中如何優化快速排序

     快速排序是一種相當棒的排序方案,相關理論內容可以參見      在jdk的[java.util.Arrays]類中,有一個sort的函式,它實現對很多資料結構進行的排序方法,其中sort(int[] a)中主要使用的是優化後的快速排序法,本文正是基於此來講解如何優化

Vert.x系列--EventBusImpl原始碼分析

開發十年,就只剩下這套架構體系了! >>>   

Webgl顯示Revit模型——利用Three.js優化顯示效果

Webgl顯示Revit模型(一)請見: https://blog.csdn.net/niuge8905/article/details/80044802 Three.js已經算是開發webgl最常用的開源庫了。Autodesk團隊開源了一個va3c來在web端顯示revit,但是這個更