three.js demo詳解

一、three.js是什麼

在介紹three.js demo之前,我們先來了解一下three.js是什麼。three.js是一個用於開發WebGL的JavaScript庫,它可以讓你輕鬆創建3D場景和應用。只需要引入庫,即可通過JavaScript和一系列簡潔而易懂的API來操作3D對象,實現3D渲染。

three.js代碼庫是自由軟件和開源軟件,使用MIT許可證發佈。three.js庫由Ricardo Cabello在2010年首次發佈,以前被稱為mrdoob,是一個著名的WebGL開發者和設計師。

二、three.js demo分類

根據不同的應用場景和功能需求,我們可以將three.js demo分為以下幾類:

  1. 場景展示類demo:這類demo通過創建各種3D對象,將它們放置在場景中,形成一個3D場景展示,常見的有立體幾何體、3D地球、太陽系等。
  2. 交互類demo:這類demo在場景展示的基礎上,加入了交互功能,常見的有可以操作的立方體、物理引擎、人物模型等。
  3. 遊戲類demo:這類demo在交互的基礎上,添加了遊戲元素,常見的有射擊遊戲、飛行遊戲、跑酷遊戲等。

三、three.js demo代碼解析

以下我們以three.js官方提供的地球demo為例,來詳細解析代碼。

var camera, scene, renderer;
var geometry, material, mesh;

init();
animate();

function init() {

	// Camera
	camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.01, 10 );
	camera.position.z = 1;

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

	// Geometry
	geometry = new THREE.SphereGeometry( 0.5, 32, 32 );

	// Material (texture)
	material = new THREE.MeshBasicMaterial();
	material.map = new THREE.TextureLoader().load( 'textures/earth.jpg' );

	// Mesh (geometry + material)
	mesh = new THREE.Mesh( geometry, material );
	scene.add( mesh );

	// Renderer
	renderer = new THREE.WebGLRenderer( { antialias: true } );
	renderer.setSize( window.innerWidth, window.innerHeight );
	document.body.appendChild( renderer.domElement );

	// Events
	window.addEventListener( 'resize', onWindowResize, false );

}

function onWindowResize() {

	camera.aspect = window.innerWidth / window.innerHeight;
	camera.updateProjectionMatrix();

	renderer.setSize( window.innerWidth, window.innerHeight );

}

function animate() {

	requestAnimationFrame( animate );

	mesh.rotation.x += 0.002;
	mesh.rotation.y += 0.005;

	renderer.render( scene, camera );

}

四、代碼解析

1. 初始化

代碼從函數init()開始執行,初始化了場景、相機、幾何體、材質 和渲染器等元素。相機默認放在z軸為1的位置,使場景內的元素可以在屏幕上看到。

// Camera
camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.01, 10 );
camera.position.z = 1;

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

// Geometry
geometry = new THREE.SphereGeometry( 0.5, 32, 32 );

// Material (texture)
material = new THREE.MeshBasicMaterial();
material.map = new THREE.TextureLoader().load( 'textures/earth.jpg' );

// Mesh (geometry + material)
mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );

// Renderer
renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );

2. 地球材質

代碼中為地球創建了一個MeshBasicMaterial材質,這種材質會為模型提供最基本的着色方法,只考慮光照對模型顏色的影響,性能較好。

material = new THREE.MeshBasicMaterial();
material.map = new THREE.TextureLoader().load( 'textures/earth.jpg' );

3. 動畫循環

通過requestAnimationFrame函數來實現動畫循環,首先調用animate()函數,然後在每個幀中將地球網格沿x軸和y軸旋轉。

function animate() {

  requestAnimationFrame( animate );

  mesh.rotation.x += 0.002;
  mesh.rotation.y += 0.005;

  renderer.render( scene, camera );

}

五、總結

three.js是一個強大的WebGL庫,通過代碼實現了類似於Unity和Unreal Engine等3D引擎的功能。通過上面的地球demo,我們可以對three.js的渲染流程及應用有一個初步的了解。同時,基於three.js的開源社區,在GitHub上有海量的demo和插件,可以為開發者提供更多的可復用組件,加快開發效率。

原創文章,作者:FYFIN,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/333160.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FYFIN的頭像FYFIN
上一篇 2025-01-27 13:34
下一篇 2025-01-27 13:35

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • 解析js base64並轉成unit

    本文將從多個方面詳細介紹js中如何解析base64編碼並轉成unit格式。 一、base64編碼解析 在JavaScript中解析base64編碼可以使用atob()函數,它會將b…

    編程 2025-04-29
  • Node.js使用Body-Parser處理HTTP POST請求時,特殊字符無法返回的解決方法

    本文將解決Node.js使用Body-Parser處理HTTP POST請求時,特殊字符無法返回的問題。同時,給出一些相關示例代碼,以幫助讀者更好的理解並處理這個問題。 一、問題解…

    編程 2025-04-29
  • t3.js:一個全能的JavaScript動態文本替換工具

    t3.js是一個非常流行的JavaScript動態文本替換工具,它是一個輕量級庫,能夠很容易地實現文本內容的遞增、遞減、替換、切換以及其他各種操作。在本文中,我們將從多個方面探討t…

    編程 2025-04-28
  • JS圖片沿着SVG路徑移動實現方法

    本文將為大家詳細介紹如何使用JS實現圖片沿着SVG路徑移動的效果,包括路徑製作、路徑效果、以及實現代碼等內容。 一、路徑製作 路徑的製作,我們需要使用到SVG,SVG是可縮放矢量圖…

    編程 2025-04-27
  • 如何使用JS調用Python腳本

    本文將詳細介紹通過JS調用Python腳本的方法,包括使用Node.js、Python shell、child_process等三種方法,以及在Web應用中的應用。 一、使用Nod…

    編程 2025-04-27
  • 如何反混淆美團slider.js

    本文將從多個方面詳細闡述如何反混淆美團slider.js。在開始之前,需要明確的是,混淆是一種保護JavaScript代碼的方法,其目的是使代碼難以理解和修改。因此,在進行反混淆操…

    編程 2025-04-27
  • Python要學JS嗎?

    Python和JavaScript都是非常受歡迎的編程語言。然而,你可能會問,既然我已經學了Python,是不是也需要學一下JS呢?在本文中,我們將圍繞這個問題進行討論,並從多個角…

    編程 2025-04-27
  • 解決js ajax post 419問題

    對於使用ajax post請求時出現的419問題,我們需要進行以下幾個方面的闡述,包括返回碼的含義、可能出現的情況、解決方案等內容。 一、解析419返回碼 419返回碼錶示用戶超時…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25

發表回復

登錄後才能評論