1.three.js世界的4大要素

一、三大組件

在Three.js中,要渲染物體到網頁中,我們需要3個組建:場景(scene)、相機(camera)和渲染器(renderer)。有了這三樣東西,才能將物體渲染到網頁中去。

記住關建語句:有了這三樣東西,我們才能夠使用相機將場景渲染到網頁上去。

創建這三要素的代碼如下:

var scene = new THREE.Scene();  // 場景
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);// 透視相機
var renderer = new THREE.WebGLRenderer();   // 渲染器
renderer.setSize(window.innerWidth, window.innerHeight);    // 設置渲染器的大小為窗口的內寬度,也就是內容區的寬度
document.body.appendChild(renderer.domElement);

1、場景

在Threejs中場景就只有一種,用THREE.Scene來表示,要構件一個場景也很簡單,只要new一個對象就可以了,代碼如下:

var scene = new THREE.Scene();
var scene = new THREE.Scene();

場景是所有物體的容器,如果要顯示一個蘋果,就需要將蘋果對象加入場景中。

2、相機

另一個組建是相機,相機決定了場景中那個角度的景色會顯示出來。相機就像人的眼睛一樣,人站在不同位置,抬頭或者低頭都能夠看到不同的景色。

場景只有一種,但是相機卻又很多種。和現實中一樣,不同的相機確定了呈相的各個方面。比如有的相機適合人像,有的相機適合風景,專業的攝影師根據實際用途不一樣,選擇不同的相機。對程序員來說,只要設置不同的相機參數,就能夠讓相機產生不一樣的效果。

在Threejs中有多種相機,這里介紹兩種,它們是:

透視相機(THREE.PerspectiveCamera)、這里我們使用一個透視相機,透視相機的參數很多,這里先不詳細講解。后面關于相機的那一章,我們會花大力氣來講。定義一個相機的代碼如下所示:(已經迫不及待想看看相機的參數了,點這里)

var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);

3、渲染器

最后一步就是設置渲染器,渲染器決定了渲染的結果應該畫在頁面的什么元素上面,并且以怎樣的方式來繪制。這里我們定義了一個WebRenderer渲染器,代碼如下所示:

var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

注意,渲染器renderer的domElement元素,表示渲染器中的畫布,所有的渲染都是畫在domElement上的,所以這里的appendChild表示將這個domElement掛接在body下面,這樣渲染的結果就能夠在頁面中顯示了。

4、添加物體到場景中

那現在,我們將一個物體添加到場景中:

var geometry = new THREE.CubeGeometry(1,1,1); 
var material = new THREE.MeshBasicMaterial({color: 0x00ff00});
var cube = new THREE.Mesh(geometry, material); 
scene.add(cube);

代碼中出現了THREE.CubeGeometry,THREE.CubeGeometry是什么東東,他是一個幾何體,幾何體由什么組成,已經不是本課的主要內容了,后面的課程我們會詳細的學到。不過這里你只需要知道CubeGeometry是一個正方體或者長方體,究竟是什么,由它的3個參數所決定,cubeGeometry的原型如下代碼所示:

CubeGeometry(width, height, depth, segmentsWidth, segmentsHeight, segmentsDepth, materials, sides)
width:立方體x軸的長度height:立方體y軸的長度depth:立方體z軸的深度,也就是長度

想一想大家就明白,以上3個參數就能夠確定一個立方體。

剩下的幾個參數就要費解和復雜一些了,不過后面我們會自己來寫一個立方體,到時候,你會更明白這些參數的意義,這里你可以將這些參數省略。

5、渲染

終于到了最后一步,這一步做完后,就可以該干嘛干嘛去了。

渲染應該使用渲染器,結合相機和場景來得到結果畫面。實現這個功能的函數是

renderer.render(scene, camera);

渲染函數的原型如下:

render( scene, camera, renderTarget, forceClear )

各個參數的意義是:

scene:前面定義的場景camera:前面定義的相機renderTarget:渲染的目標,默認是渲染到前面定義的render變量中forceClear:每次繪制之前都將畫布的內容給清除,即使自動清除標志autoClear為false,也會清除。

6、渲染循環

渲染有兩種方式:實時渲染和離線渲染 。

先看看離線渲染,想想《西游降魔篇》中最后的佛主,他肯定不是真的,是電腦渲染出來的,其畫面質量是很高的,它是事先渲染好一幀一幀的圖片,然后再把圖片拼接成電影的。這就是離線渲染。如果不事先處理好一幀一幀的圖片,那么電影播放得會很卡。CPU和GPU根本沒有能力在播放的時候渲染出這種高質量的圖片。

實時渲染:就是需要不停的對畫面進行渲染,即使畫面中什么也沒有改變,也需要重新渲染。下面就是一個渲染循環:

function render() {cube.rotation.x += 0.1;cube.rotation.y += 0.1;renderer.render(scene, camera);requestAnimationFrame(render);
}

其中一個重要的函數是requestAnimationFrame,這個函數就是讓瀏覽器去執行一次參數中的函數,這樣通過上面render中調用requestAnimationFrame()函數,requestAnimationFrame()函數又讓rander()再執行一次,就形成了我們通常所說的游戲循環了。

如不能理解游戲循環,請在這里提問。

場景,相機,渲染器之間的關系

Three.js中的場景是一個物體的容器,開發者可以將需要的角色放入場景中,例如蘋果,葡萄。同時,角色自身也管理著其在場景中的位置。

相機的作用就是面對場景,在場景中取一個合適的景,把它拍下來。

渲染器的作用就是將相機拍攝下來的圖片,放到瀏覽器中去顯示。他們三者的關系如下圖所示:

關系

轉載于:https://www.cnblogs.com/zj-kingder/p/7380996.html

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

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

相關文章

架構設計 例子和實踐

系統設計說明書(架構、概要、詳細)目錄結構 雖然這些文檔一般來說公司都是有模板的,但我寫這些文檔以來基本上是每寫一次就把目錄結構給改一次,應該說這是因為自己對這些文檔的理解開始加深,慢慢的越來越明白這些文檔的作用和其中需要闡述的東…

activiti 批量 mysql_Activiti6系列(3)- 快速體驗

一、部署啟動activiti####1、部署,將兩個war包拷貝到Tomcat下即可。![](https://img2018.cnblogs.com/blog/1755845/201908/1755845-20190802010532367-2002399291.png)2、啟動tomcat,訪問http://127.0.0.1:8080/activiti-app默認賬號密碼:ad…

【啟動】Windows上啟動圖形化軟件,報錯: 無法啟動此程序,因為計算機中丟失api-ms-win-crt-runtime-1-1-0.dll...

今天在安裝了jetbrains官網上的ToolBox軟件后,沒有辦法啟動起來,報錯如下: 無法啟動此程序,因為計算機中丟失api-ms-win-crt-runtime-1-1-0.dll 嘗試重新安裝了并沒有什么用,現在來解決方法: 直接找到官方的…

論文: YOLO9000-Better,Faster,Stronger

論文閱讀: YOLO9000-Better,Faster,Stronger YOLOv2 是經過改造之后的YOLO Batch Normalization:在所有的conv layer后加了BN之后提高了2% mAP,BN可以幫助regularize模型,這樣的話就可以放棄 dropout。 High Resolution Classifi…

怎么ie取消要打開或保存來自_取消認證后,發票抵扣就這么簡單!

點擊標題下「中財訊集團」可快速關注3月1日起,取消增值稅發票認證的納稅人范圍擴大至全部一般納稅人。一般納稅人可以自愿使用增值稅發票選擇確認平臺查詢、選擇用于申報抵扣、出口退稅或者代辦退稅的增值稅發票信息。具體如何操作呢?掌握以下步驟&#…

Google發布文檔數據庫Firestore

Google發布了Cloud Firestore,它是用于移動、網絡和服務器應用程序的文檔數據庫。\\去年我們曾報道過Google Firebase,它是一種用于移動和網絡開發的數據庫,提供實時的和離線的數據訪問,與許多Google服務相集成。他們現在推出了一…

好的軟件架構設計

什么是架構 前言:軟體設計師中有一些技術水平較高、經驗較為豐富的人,他們需要承擔軟件系統的架構設計,也就是需要設計系統的元件如何劃分、元件之間如何發生相互作用,以及系統中邏輯的、物理的、系統的重要決定的作出。在很多公…

HihoCoder 1323 回文字符串

回文字符串 思路 動態規劃&#xff1a; 可以有三種修改決策 將開頭和結尾字符改成一樣在開頭加一個和末尾相同的字符在末尾加一個和開頭形同的字符代碼&#xff1a; #include <stdio.h> #include <iostream> #include <string.h> using namespace std; char …

python線程狀態_Python線程

1. 線程基礎1.1. 線程狀態線程有5種狀態&#xff0c;狀態轉換的過程如下圖所示&#xff1a;1.2. 線程同步(鎖)多線程的優勢在于可以同時運行多個任務(至少感覺起來是這樣)。但是當線程需要共享數據時&#xff0c;可能存在數據不同步的問題。考慮這樣一種情況&#xff1a;一個列…

JavaScript中錯誤正確處理方式,你用對了嗎?

JavaScript的事件驅動范式增添了豐富的語言&#xff0c;也是讓使用JavaScript編程變得更加多樣化。如果將瀏覽器設想為JavaScript的事件驅動工具&#xff0c;那么當錯誤發生時&#xff0c;某個事件就會被拋出。理論上可以認為這些發生的錯誤只是JavaScript中的簡單事件。 本文將…

文件分割機

文件分割與合并 要求&#xff1a;實現對大文件的分割與合并。 按指定個數切&#xff08;如把一個文件切成10份&#xff09;或按指定大小切&#xff08;如每份最大不超過10M&#xff09;&#xff0c;這兩種方式都能夠。 程序說明&#xff1a; 文件分割&#xff1a;把一個文件分割…

mysql pow函數怎么用_pow函數怎么用

PHP pow函數表示指數表達式。pow函數怎么用&#xff1f;php pow()函數 語法作用&#xff1a;pow()函數的作用是將一個數進行n次方計算后返回語法&#xff1a;pow(X,Y);參數&#xff1a;X表示要做處理的數字Y表示指定n次方中的n數值說明&#xff1a;返回X的Y次方冪&#xff0c;如…

【IntelliJ IDEA】添加一個新的tomcat,tomcat啟動無法訪問歡迎頁面,空白頁,404

第一部分&#xff0c;添加一個tomcat 1.先把Toolbar 和 Tool Buttons顯示出來 2.選擇Edit Configurations 3.添加一個新的tomcat server進來 解決no artifacts configured問題&#xff0c;就是沒有項目加入里面 先添加一個沒有的項目 啟動之后找不到 頁面 第二部分&#xff0c…

回文數-時間變換-判斷郵箱

class huiwenshu public class huiwenshu {public static void main(String[] args) {System.out.println("輸入...");Scanner in new Scanner(System.in);String number in.next();boolean flag true;for(int i0;i<number.trim().length()/2;i){if(!String.va…

mac eclipse tomcat mysql_mac下使用eclipse+tomcat+mysql開發 j2ee(一)

在這里是使用eclipse&#xff0b;tomcat&#xff0b;mysql的方式。1、軟件下載(1) eclipse我使用的是mac&#xff0c;因為本人是蘋果客戶端開發者&#xff0c;所以目前只有蘋果機器了。首先下載eclipse for mac&#xff0c;選擇mac 64位&#xff0c;下載eclipse-jee-kepler-SR1…

社交系統ThinkSNS-plus(TS+)V1.0發布!

2019獨角獸企業重金招聘Python工程師標準>>> 需要購買源碼的同志們&#xff0c;依然隨時可以聯系我們手機&#xff1a;18108035545&#xff08;同微信&#xff09;&#xff1b;電話&#xff1a;028-82884828 &#xff1b;QQ&#xff1a;3298713109&#xff1b; 從決…

《軟件架構設計》一書目錄

第一部分 軟件架構概念與思想篇 1 第1章 解析軟件架構概念 3 1.1 軟件架構概念的分類 3 1.1.1 組成派 4 1.1.2 決策派 5 1.2 軟件架構概念大觀 5 1.2.1 Booch、Rumbaugh和Jacobson的定義 5 1.2.2 Woods的觀點 6 1.2.3 Garlan和Shaw的定義 6 1.2.4 Perry和Wolf的定義 …

.net 讀取mysql數據庫配置文件_.NETCore添加及讀取默認配置文件信息

這里的默認配置文件指的是項目中的appsettings.json文件&#xff0c;我們可以把一些配置信息保存在里面&#xff0c;比如數據庫連接信息。來吧&#xff0c;看例子&#xff1a;1、先在appsettings.json文件中寫入數據庫的連接信息&#xff1a;{"Logging": {"LogL…

年齡層統計SQL

-- 處理名單丟失SELECT u.user_id u_userid,o.user_id o_userid,o.* FROMtb_gh_orders o LEFT JOIN tb_gh_user u ON o.user_id u.user_id WHERE o.course_id 128 AND o.order_state 1 ;-- 年齡段統計SELECT T1.*,CONCAT(LEFT (T1.C1 / T2.C2 * 100, 5), %) P FROM(SELECT C…

h5 img js 點擊圖片放大_H5實現移動端圖片預覽:手勢縮放, 手勢拖動,雙擊放大......

查看示例效果&#xff1a;一、功能介紹圖片預覽主要有以下幾個功能點組成&#xff1a;監聽圖片點擊事件&#xff0c;進入圖片預覽模式自定義手勢事件, (雙指縮放&#xff0c;滑動&#xff0c;雙擊。。。)監聽圖片手勢事件&#xff0c;通過 transform-matrix 實現圖片的各種變換…