PhiloGL學習(5)——神說要有光,便有了光

前言

上一篇文章中介紹了如何創建三維對象及加載皮膚,本文為大家介紹如何為場景添加光源。

一、 原理分析

光在任何地方都是非常重要的,無論在哪里都說是要發光發熱,光和熱也是分不開的。光線分為點光源和線光源,所謂點光源和線光源也是個相對的概念,站在地球上我們可以認為太陽光是線光源,其實從更大的尺度來看太陽光也是個點光源,只是我們站在地球上來看光線基本上是平行的了,所以可以認為是線光源。所有問題,站在不同的角度來看就會發生變化。

光線還有另外幾個概念,環境光(ambient light)、漫反射光(diffuse light)、鏡面反射光(specular light)。所謂環境光是指入射光均勻地從周圍環境入射至景物表面并等量地向各個方向反射出去,通常物體表面還會受到從周圍環境來的反射光(地面、天空、墻壁等)的照射,這些統稱為環境光。漫反射光表示特定光源在景物表面的反射光中那些向空間各方向均勻反射出去的光。鏡面反射光為朝一定方向的反射光,如點光源照射一個金屬球時會在表面形成一塊特定亮的區域,它是光源在金屬球面上產生的鏡面反射光,鏡面反射光與物體的光滑程度有關系。

對于3D也是一樣,我這幾年搞的比較多的是地理信息系統,那么為什么還要學習3D以及之前的大數據等技術呢?首先我對學習充滿了無限熱情,碰到新技術就想學一下,當然這不見得是個好事情,因為一個人不可能把什么都學會,必須要有所取舍,否則就會像我一樣導致什么都略懂但都不精通。其次任何知識都是有用的,不知道哪天就會用到,比如Hadoop集群,剛開始感覺很高大上就學了一點,后面果然需要使用這種分布式計算技術來處理遙感影像,于是Geotrellis很快就上手了,關于3D我認為也是同樣如此,這個說不定就會在將來的工作中用到,比如傾斜攝影以及點云等等技術。

騷年們,讓我們開始今天的學習吧。

二、 創建光源

首先,我們必須清楚,光源是加在整個場景中的而不是某個對象,就像太陽光打到地球上,是整個環境都有了光,而不是說只是某個對象有了光。對待PhiloGL也是一樣,直接從場景中獲取光線設置信息,并對其進行設置。

2.1 場景配置

所以在onLoad事件中添加如下代碼:

var scene = app.scene
var lightConfig = scene.config.lights;
lightConfig.enable = true;

lightConfig就是對整個場景光源設置的變量。首先設置其enbale屬性為true,表示使用光源。上面分析的幾種光源均可以添加或者不添加在特定場景中,并可以任意設置其光源位置及顏色分量等。

2.2 線光源

設置lightConfig屬性的directional的direction和color屬性。

lightConfig.directional.direction = {x: +light.x,y: +light.y,z: +light.z
};
lightConfig.directional.color = {r: +light.r,g: +light.g,b: +light.b
};

其中direction表示光線方向,color表示光線顏色。

  • 坐標系

此處需要補充一個之前早已涉及但被我忽略的問題——坐標系。坐標系是任何圖形學的基礎,居然遺漏了此問題。

WEbGL同樣采用笛卡爾左手坐標系,其Z軸正向為從屏幕指向用戶的方向,X軸正向為從屏幕中央指向屏幕右側的方向,Y軸正向為從屏幕中央指向屏幕上側的方向。

此處light是我定義的變量,存儲了光線的上述信息,注意此處變量前的+,此符號在js中的意義為將其他類型的數據轉換為number,此處因為可以直接定義成number類型,所以不寫也可。

此處還有一個問題,經過我實際測試,線光源的x、y、z為反向,即真正光線的向量方向為(-x,-y,-z)。當然此處可能是由于我對坐標系理解有誤或者實驗有誤,如果如此,歡迎批評指正。

2.3 點光源

點光源直接設置lightConfig的points屬性。

lightConfig.points = {diffuse: { // 散射光r: +light.dr,g: +light.dg,b: +light.db},specular: { // 反射光r: +light.sr,g: +light.sg,b: +light.sb},position: {x: +light.x,y: +light.y,z: +light.z}
};

其中diffuse表示散射光,specular表示散射光,position表示點光源的位置,此處位置為實際的光源點的位置。

2.4 環境光

設置lightConfig的ambient屬性。

lightConfig.ambient = {r: +ambient.r,g: +ambient.g,b: +ambient.b
};

環境光不需要設置位置,無論物體處在何處以及哪一面均會被射上此光。

2.5 另外一種寫法

采用上面的寫法的好處在于我們可以改變光線的值或者光線的位置,其方法如同在第二篇文章中講述的動畫,直接改變light的值即可。當然如果為固定我們還可以直接寫在PhiloGL的配置中,如下:

PhiloGL('test1', {scene: {lights: {directional: {color: {r: 1, g: 1, b: 1},direction: {x: 0, y: 0, z: 0}}}},
})

這是線光源的設置方法,可以看出兩種方式寫法實質相同。點光源寫法相同。

三、 總結

本文簡單介紹了如何設置光源。到這里PhiloGL的基礎以及WebGL的基礎我們已經基本全部掌握了,下一篇文章介紹一個案例,做一個自轉的地球及圍繞其公轉的地球。

轉載于:https://www.cnblogs.com/shoufengwei/p/7751691.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370789.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370789.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370789.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 彈出彈框2秒消失_基于HTML5 Canvas 實現彈出框

前言用戶鼠標移入時,有彈出框出現,這樣的需求很常見。這在處理 HTML 元素實現時簡單,但是如果是對 HTML5 Canvas 構成的圖形進行處理,這種方法不再適用,因為 Canvas 使用的是另外一套機制,無論在 Canvas 上…

【CSS】小妙招,各種問題總結方法處理

1.實現div文字溢出自動省略號截取 overflow:hidden; /*超過部分不顯示*/       text-overflow:ellipsis; /*超過部分用點點表示*/       white-space:nowrap;/*不換行*/ 2.規定行數的截取效果 text-overflow: ellipsis; /*有些示例里需要定義該屬性&#xff0c…

Java2Days 2012:Java EE

Java2Days會議是東歐的主要活動,目的是介紹Java開發的最新趨勢。 今年,該活動于10月25日至26日在保加利亞的索非亞舉行。 我在那里,并有機會與一些SAP的同事一起品嘗了一些最新的Java,云和移動內容,這些內容已直接發送…

html5布局總結,HTML5網頁布局的總結

可以通過 和 將 html 元素組合起來。html 塊元素大多數 html 元素被定義為塊級元素或內聯元素。編者注:“塊級元素”譯為 block level element,“內聯元素”譯為 inline element。塊級元素在顯示時,通常會以新行來開始(和結束)。例子&#x…

c++ 優先隊列_C/C++數據結構:隊列結構最全解析!帶你零基礎入門隊列結構

前言上一章節針對于C語言棧結構做了解析,不清楚的可以回顧一下。本章節主要針對于C語言的基礎數據結構隊列做以解析。數據結構之隊列隊列是一種特殊的 線性表 ,特殊之處在于它只允許在表的前端(front)進行刪除操作,而在…

bit-map再顯身手:test.txt中有42億個無符號整數, 求不存在于test.txt中的最小無符號整數。限制: 可用內存為600MB....

先看看這個題目:test.txt中有42億個無符號整數, 求不存在于test.txt中的最小無符號整數. 限制: 可用內存為600MB. 又是大數據。 看到42億, 有靈感沒? 要知道, 2的32次方就是42億多一點點啊。42億個無符號…

周期均方根和有效值的區別_黑豬肉和白豬肉有啥區別?

為啥散養黑豬肉的價格要比白豬貴很多?這其中的原因不看不知道!市面上的散養黑豬肉通常要比白豬肉貴很多,但是仍有不少人喜歡買黑豬肉回家吃,散養黑豬肉和白豬肉不僅僅是口感上有所差距,其價值差距體現在很多方面,接下來小編就和大…

BZOJ1734: [Usaco2005 Feb]Aggressive cows 憤怒的牛

【傳送門:BZOJ1734】 簡要題意: 約翰有N 間牛棚,這些牛棚坐落在一條直線上,第i 間牛棚位于坐標Xi 的位置。他要把C 頭 奶牛安排在這些牛棚里。每間牛棚最多可以放一頭奶牛,也可以空著。這些奶牛的脾氣都很暴燥&#xf…

CSS基礎范例

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>Title</title>6 <style>7 *{8 margin: 0; /*重置*/9 padding: 0…

測試環境搭建流程_前端構建 DevOps 搭建 DevOps 基礎平臺(中)

前言搭建基礎平臺搭建上篇的時候的時候&#xff0c;已經介紹過了項目流程設計、數據庫搭建、jwt 登錄等模塊。此篇我們介紹分支管理設計及其他的基礎模塊。后端模塊DevOps - Gitlab Api使用(已完成&#xff0c;點擊跳轉)DevOps - 搭建 DevOps 基礎平臺(已完成 50%)基礎平臺搭建…

什么是PermGen泄漏?

接下來是對Java應用程序中特定類型的內存問題的實用介紹。 即–我們將分析導致java.lang.OutOfMemoryError&#xff1a;PermGen空間的錯誤 堆棧跟蹤中的癥狀。 首先&#xff0c;我們將介紹理解該主題所需的核心概念&#xff0c;并說明什么是對象&#xff0c;類&#xff0c;類…

html浮動炫酷樣式,jQuery和CSS3炫酷表單浮動標簽特效

這是一款炫酷的jQuery和CSS3表單浮動標簽特效。浮動標簽是指輸入框中的文字或占位文本在輸入框聚焦的時候&#xff0c;以動畫的方式浮動到指定的地方。浮動標簽特效是一種新穎時尚的動畫特效&#xff0c;不僅效果很酷&#xff0c;而且能以明確的方式提示用戶該輸入框應該填寫上…

rto凈化效率計算公式_全面剖析 石油化工行業RTO蓄熱式焚燒爐的優勢要素

在我國的國民經濟發展中&#xff0c;石油化工產業是重要的能源基礎工業&#xff0c;但是廢氣的治理問題一直困擾著許多企業。直到RTO蓄熱式焚燒爐的面世&#xff0c;為石油化工行業的廢氣治理帶來了新希望。如今&#xff0c;有機廢氣治理工作越來越受到廣泛重視&#xff0c;傳統…

python作業:高級FTP程序

要求&#xff1a; 用戶加密認證允許同時多用戶登錄每個用戶有自己的家目錄 &#xff0c;且只能訪問自己的家目錄對用戶進行磁盤配額&#xff0c;每個用戶的可用空間不同允許用戶在ftp server上隨意切換目錄允許用戶查看當前目錄下文件允許上傳和下載文件&#xff0c;保證文件一…

webpack學習筆記 (一)

一、安裝nodejs&#xff1b; 點擊打開nodejs官方站點&#xff1b; 點擊下圖框住的按鈕&#xff0c;下周nodejs安裝包&#xff1b; 安裝下載好的安裝包。 安裝完畢之后&#xff0c;在cmd中輸入node -v查看是否已經安裝成功 如果有版本號顯示&#xff0c;則代表安裝成功&#xf…

將渦輪增壓器添加到JEE Apps

我扮演的關鍵角色之一是在本地社區中傳播Akka。 作為討論的一部分&#xff0c;人們通常會想到的問題/疑問是Akka如何針對編寫良好的Java / JEE應用程序提供更好的可伸縮性和并發性。 由于底層硬件/ JVM保持不變&#xff0c;因此參與者模型如何比傳統的JEE應用程序發揮更多的功…

python package_python之package定義

一.簡單說明 python是通過module組織代碼的&#xff0c;每一個module就是一個python文件&#xff0c;但是modules是通過package來組織的。我們平時在簡單測試的時候 一般就是幾個Python文件存放在同級的目錄下&#xff0c;但是當我們開始嘗試開發更為復雜的項目時&#xff0c;p…

html 手機端無法拖動地圖,關于騰訊地圖api的禁止地圖拖動問題

禁用滾動和拖動*{margin:0px;padding:0px;}body, button, input, select, textarea {font: 12px/16px Verdana, Helvetica, Arial, sans-serif;}p{width:603px;padding-top:3px;overflow:hidden;}.btn{width:142px;}#container{min-width:600px;min-height:767px;}//初始化函數…

《一起》個人進展——Day07

昨天做了些什么:實現登錄界面的美化 今天的計劃:還是準備進行與其他界面的融合 遇到的困難:代碼了解不夠&#xff0c;融合起來會出現bug轉載于:https://www.cnblogs.com/gxt-/p/6828131.html

epoll nio區別_【總結】兩種 NIO 實現:Selector 與 Epoll

我想用這個話題小結下最近這一階段的各種測試和開發。其實文章的內容主要還是想總結一下NIO Socket&#xff0c;以及兩種不同操作系統實現NIO的方式&#xff0c;selector和epoll。問題應該從服務器端開始說起。我們都寫過net包下的socket&#xff0c;用socket的accept方法來等待…