摘要:但是對(duì)于的世界,僅僅依靠自己的眼睛還是不夠,因?yàn)槠渲写嬖诘拿媸菬o(wú)窮無(wú)盡的,所以我們需要一只特殊的眼睛照相機(jī),來(lái)幫助我們?yōu)g覽世界。
3D世界中的“眼睛”(1) ---照相機(jī)
相信很多人都看過(guò)微軟2015開(kāi)發(fā)者大會(huì),其中有一段講解window holographic讓我覺(jué)得特別驚訝,我一直以為虛擬投影暫時(shí)還是人們幻想中的一種技術(shù),現(xiàn)在確實(shí)是展示在我面前,也讓我有一種想要弄懂其中奧秘的激情。從2D到3D的視覺(jué)轉(zhuǎn)換到底有什么不同呢?作為一名菜鳥(niǎo)級(jí)別的前端開(kāi)發(fā)者,我決定從Three.js方面入手,去理解3D世界的構(gòu)成。
相對(duì)于2D的網(wǎng)頁(yè),我們可以僅僅依靠我們自己的眼睛來(lái)瀏覽頁(yè)面。但是對(duì)于3D的世界,僅僅依靠自己的眼睛還是不夠,因?yàn)槠渲写嬖诘摹懊妗笔菬o(wú)窮無(wú)盡的,所以我們需要一只特殊的眼睛“照相機(jī)”,來(lái)幫助我們?yōu)g覽3D世界。
在講解相機(jī)之前,我們需要給3D的世界來(lái)一個(gè)定位,在2D頁(yè)面中,我們一般會(huì)將頁(yè)面的左上角作為一個(gè)原點(diǎn),這樣一來(lái),整個(gè)頁(yè)面都可以通過(guò)X、Y來(lái)定位,同樣的3D也是這樣,下圖為3D世界的坐標(biāo)定位。
正交投影照相機(jī)以下內(nèi)容會(huì)涉及到具體代碼的實(shí)現(xiàn),如果有讀者只想了解相機(jī)的原理,那么可以直接跳到最后一段的總結(jié)上面。
正交投影相機(jī)的效果比較直觀,相當(dāng)于三視圖中的主(正)視圖,由6個(gè)參數(shù)和相機(jī)定位決定相機(jī)的位置和可視區(qū)域,其中(right-left)代表相機(jī)的寬度,(top-bottom)代表相機(jī)的高度,near代表相機(jī)的最近點(diǎn),far代表相機(jī)的最遠(yuǎn)點(diǎn)。其代碼設(shè)置如下:
THREE.OrthographicCamera(left, right, top, bottom, near, far)
效果圖如下,其中灰色部分代表可視區(qū)域,可視區(qū)域代表你能看到的地方。
基本設(shè)置設(shè)置相機(jī)的基本屬性:
var camera = new THREE.OrthographicCamera(-2, 2, 1.5, -1.5, 1, 10); camera.position.set(0, 0, 5); scene.add(camera);
在原點(diǎn)位置創(chuàng)建邊長(zhǎng)為1的正方體,使用wireframe作為透視觀察。
var geometry = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshBasicMaterial({ color: 0xff0000, wireframe: true }) ); scene.add(geometry);
最后得到的效果如下,這里我們只看到一個(gè)矩形,是因?yàn)樯傻恼襟w默認(rèn)在于原點(diǎn),相機(jī)初始化的位置在(0,0,5),鏡頭默認(rèn)對(duì)向-Z軸,這樣一來(lái)的話,相當(dāng)于看到正方體的一個(gè)側(cè)面,也就是主視圖。
假如將相機(jī)的near屬性變?yōu)?,此時(shí)的正方體將超出相機(jī)的可視區(qū)域,效果如下
這里相機(jī)的寬度和高度分別是4和3,假如將寬度設(shè)置為2,即
var camera = new THREE.OrthographicCamera(-1, 1, 1.5, -1.5, 1, 10);
得到的效果圖如下:
可以看到水平方向被拉大
之前相機(jī)設(shè)置在(0,0,5)的位置,由于相機(jī)是默認(rèn)面向-Z軸,可以看到正方體,假如將相機(jī)往右平移1個(gè)單位,得到效果如下:
var camera = new THREE.OrthographicCamera(-2, 2, 1.5, -1.5, 1, 10); camera.position.set(1,0,5);
可以看到物體向左平移了,其實(shí)這個(gè)也不難理解,就好像一個(gè)相對(duì)運(yùn)動(dòng)的原理一樣,你往右走,對(duì)于物體來(lái)講,實(shí)際是往左移動(dòng)。
同樣的我們可以將相機(jī)默認(rèn)的6個(gè)參數(shù)(-2, 2, 1.5, -1.5, 1, 10)改變?yōu)?strong>(-1, 3, 1.5, -1.5, 1, 10),通過(guò)觀察,可以發(fā)現(xiàn)和上圖的效果是一樣的。也說(shuō)明了left、right和top、bottom的數(shù)值只決定相機(jī)的寬度和高度,一般寬度和高度的比例和渲染區(qū)域的寬高比例是一致的,不然會(huì)出現(xiàn)壓縮或者拉伸的現(xiàn)象。
改變觀察角度為了能觀察到整個(gè)立方體的結(jié)構(gòu),將相機(jī)的位置設(shè)為(4, -3, 5),由于相機(jī)默認(rèn)拍攝的方向是Z的負(fù)軸,此時(shí)是觀察不到立方體,我們可以設(shè)置相機(jī),讓它指定原點(diǎn)進(jìn)行拍攝
camera.position.set(4, -3, 5); camera.lookAt(new THREE.Vector3(0, 0, 0));
效果如下:
需要注意的是lookAt接受的是THREE.Vector3的實(shí)例,不能直接設(shè)置camera.lookAt(0, 0, 0),不然無(wú)法得到理想中的結(jié)果。
創(chuàng)建代碼如下:
THREE.PerspectiveCamera(fov, aspect, near, far)
fov,代表豎直方向的張角(角度制)。
aspect,代表水平長(zhǎng)度和豎直長(zhǎng)度的比值(一般是渲染區(qū)域的長(zhǎng)和寬)。
near,代表拍攝的最近距離。
far,代表拍攝的最遠(yuǎn)距離。
創(chuàng)建透視投影照相機(jī)代碼:
var camera = new THREE.PerspectiveCamera(45, 400 / 300, 1, 10); camera.position.set(0, 0, 5); scene.add(camera);
創(chuàng)建邊長(zhǎng)為1的正方體:
var cube = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshBasicMaterial({ color: 0xff0000, wireframe: true }) ); scene.add(cube);
得到的效果:
將原來(lái)相機(jī)豎直張角45改成60,得到的效果圖如下:
可以看到,得到的物體變小,原因是因?yàn)槠鋸埥亲兇?,?dǎo)致可視區(qū)域變大,相對(duì)于物體來(lái)說(shuō)就變小。
位置影響將相機(jī)所在的位置向右平移一位,代碼設(shè)置和效果圖如下,為了結(jié)果更加清晰,取消透視。
var camera = new THREE.PerspectiveCamera(45, 1000 / 1000, 1, 10); camera.position.set(1, 0, 5); scene.add(camera); var cube = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshBasicMaterial({ color: 0xff0000, wireframe: false }) );
可以從結(jié)果上面看出,物體向左平移了,原理和正交相機(jī)一樣,不同的就是,物體旋轉(zhuǎn)了一定的角度,但是正交投影相機(jī)并沒(méi)有旋轉(zhuǎn)。原因是因?yàn)檎煌队跋鄼C(jī)“觀察”物體的原理其實(shí)就是平行投影,而透視投影照相機(jī)的成像原理是透視投影。
由于筆者文筆水平有限,可能有人看到這里還是不明白相機(jī)的作用,舉個(gè)簡(jiǎn)單的例子,假如你面前有一個(gè)立方體,那么無(wú)論你怎么去旋轉(zhuǎn)這個(gè)立方體,你最多就只能看到3個(gè)面,而無(wú)法看到背面,這時(shí)候我們就需要一個(gè)特殊的“眼睛”,來(lái)幫助我們觀察立方體的背面,而相機(jī)就是用來(lái)做這種事情的。下面有一些筆者自己寫(xiě)的demo演示,沒(méi)有什么特別酷炫的效果:)。
http://ol.weixin.qq.com/protect/users/shijiezou/three/spreads.html
http://ol.weixin.qq.com/protect/users/shijiezou/three/earth.html
http://ol.weixin.qq.com/protect/users/shijiezou/three/audio.html
(上傳音頻文件,基本功能實(shí)現(xiàn)了,但是還沒(méi)做優(yōu)化)
相關(guān)資料:
官方文檔
中文資料
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85918.html
摘要:透視即是以現(xiàn)實(shí)的視角來(lái)看屏幕上的事物,從而展現(xiàn)的效果。旋轉(zhuǎn)則不再是平面上的旋轉(zhuǎn),而是三維坐標(biāo)系的旋轉(zhuǎn),就包括軸,軸,軸旋轉(zhuǎn)。必須與屬性一同使用,而且只影響轉(zhuǎn)換元素??勺杂赊D(zhuǎn)載引用,但需署名作者且注明文章出處。 showImg(https://segmentfault.com/img/bVzJoZ); 話不多說(shuō),先上demo 酷炫css3走馬燈/正方體動(dòng)畫(huà): https://bupt-...
摘要:透視即是以現(xiàn)實(shí)的視角來(lái)看屏幕上的事物,從而展現(xiàn)的效果。旋轉(zhuǎn)則不再是平面上的旋轉(zhuǎn),而是三維坐標(biāo)系的旋轉(zhuǎn),就包括軸,軸,軸旋轉(zhuǎn)。必須與屬性一同使用,而且只影響轉(zhuǎn)換元素??勺杂赊D(zhuǎn)載引用,但需署名作者且注明文章出處。 showImg(https://segmentfault.com/img/bVzJoZ); 話不多說(shuō),先上demo 酷炫css3走馬燈/正方體動(dòng)畫(huà): https://bupt-...
摘要:雙活體,依然是前最可靠的防攻擊段之。詳解云識(shí)客活體檢測(cè)技術(shù)以下,我們分析一種多重人臉區(qū)域共享的深度學(xué)習(xí)算法。光流法輔助單目活體判斷最后,針對(duì)單目活體,云識(shí)客也采用光流法輔助活體判斷的校驗(yàn)機(jī)制。 以下這張照?,是真?實(shí)拍還是對(duì)著照?翻拍的? showImg(https://segmentfault.com/img/bVbuoHD); 如果告訴你,這張照?,是對(duì)著照?翻拍的照?,你會(huì)不會(huì)驚...
摘要:我們來(lái)看下做一個(gè)動(dòng)畫(huà)需要哪些東西。說(shuō)明各個(gè)屬性的作用代表物體距離瀏覽器是。下面我們做一個(gè)向下翻頁(yè)的數(shù)字,和一個(gè)向做翻頁(yè)的數(shù)字。 我們來(lái)看下做一個(gè)css3 3D動(dòng)畫(huà)需要哪些東西。前面我們已經(jīng)使用transition和transform做了一些簡(jiǎn)單的操作。 設(shè)置3D場(chǎng)景 做3D動(dòng)畫(huà),我們首先要設(shè)置3D場(chǎng)景。3D場(chǎng)景我們通常用perspective和perspective-origin兩個(gè)屬...
閱讀 2900·2021-11-23 09:51
閱讀 3419·2021-11-22 09:34
閱讀 3319·2021-10-27 14:14
閱讀 1519·2019-08-30 15:55
閱讀 3352·2019-08-30 15:54
閱讀 1078·2019-08-30 15:52
閱讀 1897·2019-08-30 12:46
閱讀 2856·2019-08-29 16:11