👨??? 主頁: gis分享者
👨??? 感謝各位大佬 點贊👍 收藏? 留言📝 加關注?!
👨??? 收錄于專欄:threejs gis工程師
文章目錄
- 一、🍀前言
- 1.1 ??THREE.Sprite
- 1.1.1 ??代碼示例
- 1.1.2 ??構造函數
- 1.1.3 ??屬性
- 1.1.4 ??方法
- 1.2 ??THREE.Sprite
- 1.2.1 ??代碼示例
- 1.2.2 ??構造函數
- 1.2.3 ??屬性
- 1.2.4 ??方法
- 二、🍀使用Sprite精靈、SpriteMaterial精靈材質
- 1. ??實現思路
- 2. ??代碼樣例
一、🍀前言
本文詳細介紹如何基于threejs在三維場景中使用Sprite精靈、SpriteMaterial精靈材質,親測可用。希望能幫助到您。一起學習,加油!加油!
1.1 ??THREE.Sprite
THREE.Sprite精靈是一個總是面朝著攝像機的平面,通常含有使用一個半透明的紋理。
精靈不會投射任何陰影,即使設置了
castShadow = true
也將不會有任何效果。
1.1.1 ??代碼示例
代碼示例
const map = new THREE.TextureLoader().load( "sprite.png" );
const material = new THREE.SpriteMaterial( { map: map } );const sprite = new THREE.Sprite( material );
scene.add( sprite );
1.1.2 ??構造函數
Sprite( material : Material )
material - (可選值)是SpriteMaterial的一個實例。 默認值是一個白色的SpriteMaterial。
創建一個新的Sprite。
1.1.3 ??屬性
共有屬性請參見其基類Object3D。
.isSprite : Boolean
只讀標志,用于檢查給定對象是否為 Sprite 類型。
.material : SpriteMaterial
SpriteMaterial的一個實例,定義了這個對象的外觀。默認值是一個白色的SpriteMaterial。
.center : Vector2
這個精靈的錨點,也就是精靈旋轉時,圍繞著旋轉的點。當值為(0.5,0.5)時,對應著這個精靈的中心點;當值為(0,0)時,對應著這個精靈左下角的點。其默認值是(0.5,0.5)。
1.1.4 ??方法
共有方法請參見其基類Object3D。
.clone () : Sprite
返回當前Sprite對象的一個克隆及其任何后代。
.copy ( sprite : Sprite ) : this
將前一個Sprite對象的屬性復制給當前的這個對象。
.raycast ( raycaster : Raycaster, intersects : Array ) : undefined
在投射的光線和精靈之前產生交互。Raycaster.intersectObject將會調用這個方法。 在對sprite進行射線投射之前,射線投射必須通過調用Raycaster.setFromCamera()來初始化。
1.2 ??THREE.Sprite
一種使用Sprite的材質。
1.2.1 ??代碼示例
代碼示例
const map = new THREE.TextureLoader().load( 'textures/sprite.png' );
const material = new THREE.SpriteMaterial( { map: map, color: 0xffffff } );const sprite = new THREE.Sprite( material );
sprite.scale.set(200, 200, 1)
scene.add( sprite );
1.2.2 ??構造函數
SpriteMaterial( parameters : Object )
parameters - (可選)用于定義材質外觀的對象,具有一個或多個屬性。 材質的任何屬性都可以從此處傳入(包括從Material 和 ShaderMaterial繼承的任何屬性)。
屬性color例外,其可以作為十六進制字符串傳遞,默認情況下為 0xffffff(白色), 內部調用Color.set(color)。 SpriteMaterials不會被Material.clippingPlanes裁剪。
1.2.3 ??屬性
共有屬性請參見其基類Material。
.alphaMap : Texture
alpha貼圖是一張灰度紋理,用于控制整個表面的不透明度。(黑色:完全透明;白色:完全不透明)。 默認值為null。
僅使用紋理的顏色,忽略alpha通道(如果存在)。 對于RGB和RGBA紋理,WebGL渲染器在采樣此紋理時將使用綠色通道, 因為在DXT壓縮和未壓縮RGB 565格式中為綠色提供了額外的精度。 Luminance-only以及luminance/alpha紋理也仍然有效。
.color : Color
材質的顏色(Color),默認值為白色 (0xffffff)。 .map會和 color 相乘。
.fog : Boolean
材質是否受霧影響。默認為true。
.isSpriteMaterial : Boolean
只讀標志,用于檢查給定對象是否屬于 SpriteMaterial 類型。
.map : Texture
顏色貼圖。可以選擇包括一個alpha通道,通常與.transparent 或.alphaTest。默認為null。
.rotation : Radians
sprite的轉動,以弧度為單位。默認值為0。
.sizeAttenuation : Boolean
精靈的大小是否會被相機深度衰減。(僅限透視攝像頭。)默認為true。
.transparent : Boolean
定義此材質是否透明。默認值為 true。
1.2.4 ??方法
共有方法請參見其基類Material。
二、🍀使用Sprite精靈、SpriteMaterial精靈材質
1. ??實現思路
- 1、初始化renderer渲染器。
- 2、初始化Scene三維場景scene。
- 3、初始化camera相機,定義相機位置 camera.position.set。
- 4、加載幾何模型:定義createSprites方法,創建10行10列THREE.Sprite精靈對象(使用THREE.SpriteMaterial材質)sprite,場景scene添加sprite。調用createSprites方法。具體代碼參考下面代碼樣例。
- 5、加入stats監控器,監控幀數信息。
2. ??代碼樣例
<!DOCTYPE html>
<html>
<head><title>學習threejs,使用Sprite精靈、SpriteMaterial精靈材質</title><script type="text/javascript" src="../libs/three.js"></script><script type="text/javascript" src="../libs/stats.js"></script><script type="text/javascript" src="../libs/dat.gui.js"></script><style>body {margin: 0;overflow: hidden;background-color: #000000;}</style>
</head>
<body><div id="Stats-output">
</div>
<div id="WebGL-output">
</div><!-- Js代碼塊 -->
<script type="text/javascript">// 初始化function init() {var stats = initStats();// 創建三維場景scenevar scene = new THREE.Scene();// 創建相機cameravar camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);// 創建渲染器canvasRenderer,設置canvasRenderer顏色和大小var canvasRenderer = new THREE.WebGLRenderer();canvasRenderer.setClearColor(new THREE.Color(0x000000, 1.0));canvasRenderer.setSize(window.innerWidth, window.innerHeight);// 設置相機的位置camera.position.x = 0;camera.position.y = 0;camera.position.z = 150;// 渲染器canvasRenderer綁定html要素document.getElementById("WebGL-output").appendChild(canvasRenderer.domElement);createSprites();render();function createSprites() {var material = new THREE.SpriteMaterial();for (var x = -5; x < 5; x++) {for (var y = -5; y < 5; y++) {var sprite = new THREE.Sprite(material);sprite.position.set(x * 10, y * 10, 0);scene.add(sprite);}}}function render() {stats.update();requestAnimationFrame(render);canvasRenderer.render(scene, camera);}function initStats() {var stats = new Stats();stats.setMode(0);stats.domElement.style.position = 'absolute';stats.domElement.style.left = '0px';stats.domElement.style.top = '0px';document.getElementById("Stats-output").appendChild(stats.domElement);return stats;}}window.onload = init;
</script>
</body>
</html>
效果如下:
