最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Three.js中實現一個OBBHelper實例詳解

 更新時間:2023年09月22日 08:54:35   作者:當時明月在曾照彩云歸  
這篇文章主要介紹了Three.js中實現一個OBBHelper,本文參考Box3Helper源碼,并寫出一個OBBHelper,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下

本文參考Box3Helper源碼,并寫出一個OBBHelper

1. 引言

Three.js中,Box3對象指的是AABB式的包圍盒,這種包圍盒會隨物體的旋轉而變換大小,精度較差

Three.js中還有OBB對象,這是一種能表現物體主要特征的、不隨物體的旋轉而變換大小的包圍盒

兩者如下圖所示:

Three.js中雖然有OBB,卻沒有OBB Helper,即OBB包圍盒線框對象

本文參考Box3Helper源碼,并寫出一個OBBHelper

2. Box3Helper

以下是Three.js源碼中的Box3Helper:

import { LineSegments } from '../objects/LineSegments.js';
import { LineBasicMaterial } from '../materials/LineBasicMaterial.js';
import { BufferAttribute, Float32BufferAttribute } from '../core/BufferAttribute.js';
import { BufferGeometry } from '../core/BufferGeometry.js';
class Box3Helper extends LineSegments {
	constructor( box, color = 0xffff00 ) {
		const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );
		const positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];
		const geometry = new BufferGeometry();
		geometry.setIndex( new BufferAttribute( indices, 1 ) );
		geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
		super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
		this.box = box;
		this.type = 'Box3Helper';
		this.geometry.computeBoundingSphere();
	}
	updateMatrixWorld( force ) {
		const box = this.box;
		if ( box.isEmpty() ) return;
		box.getCenter( this.position );
		box.getSize( this.scale );
		this.scale.multiplyScalar( 0.5 );
		super.updateMatrixWorld( force );
	}
	dispose() {
		this.geometry.dispose();
		this.material.dispose();
	}
}
export { Box3Helper };
 

這段代碼是一個名為 Box3Helper 的類的定義,它繼承自 LineSegments 類。 Box3Helper 類用于創(chuàng)建一個輔助框,用來可視化 Box3 對象的邊界框。

代碼中首先導入了一些依賴的模塊,包括 LineSegments LineBasicMaterial 、 BufferAttribute Float32BufferAttribute BufferGeometry 。

Box3Helper 類的構造函數中,首先創(chuàng)建了一個表示邊界框的索引數組 indices ,然后創(chuàng)建了一個表示邊界框的頂點坐標數組 positions 。

接下來,創(chuàng)建了一個 BufferGeometry 對象,并使用 indices 數組創(chuàng)建了一個 BufferAttribute 對象來表示索引,使用 positions 數組創(chuàng)建了一個 Float32BufferAttribute 對象來表示頂點坐標。然后將這兩個屬性設置到 geometry 對象中。

然后調用父類 LineSegments 的構造函數,傳入 geometry 和一個 LineBasicMaterial 對象作為參數,來創(chuàng)建一個可視化邊界框的線段對象。

接著,將傳入構造函數的 box 參數賦值給 this.box 屬性。

然后設置 this.type 屬性為 'Box3Helper'

最后調用 geometry 對象的 computeBoundingSphere 方法來計算邊界球。

Box3Helper 類還定義了一個 updateMatrixWorld 方法,用于更新輔助框的世界矩陣。在該方法中,首先獲取 this.box 的中心點和尺寸,然后根據尺寸縮放輔助框的比例,并調用父類的 updateMatrixWorld 方法來更新世界矩陣。

最后,定義了一個 dispose 方法,用于釋放資源,包括釋放 geometry material 對象。

最后通過 export 語句將 Box3Helper 類導出,以便在其他地方使用。

3. OBBHelper

參考上面的代碼。給出OBBHelper的代碼如下:

import {
	Vector3, LineSegments, LineBasicMaterial,
	BufferAttribute, Float32BufferAttribute, BufferGeometry
} from 'three';
class OBBHelper extends LineSegments {
	constructor(obb, object, color = 0xffff00) {
		const indices = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7, 0, 2, 1, 3, 4, 6, 5, 7]);
		const positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];
		const geometry = new BufferGeometry();
		geometry.setIndex(new BufferAttribute(indices, 1));
		geometry.setAttribute('position', new Float32BufferAttribute(positions, 3));
		super(geometry, new LineBasicMaterial({ color: color, toneMapped: false }));
		this.obb = obb;
		this.object = object;
		this.type = 'OBBHelper';
		this.lastMatrix4 = object.matrixWorld.clone();
	}
	updateMatrixWorld(force) {
		this.obb.applyMatrix4(this.lastMatrix4.invert())
		this.obb.applyMatrix4(this.object.matrixWorld);
		this.lastMatrix4 = this.object.matrixWorld.clone();
		const positions = this.geometry.attributes.position.array;
		const halfSize = this.obb.halfSize;
		const center = this.obb.center;
		const rotation = this.obb.rotation;
		const corners = [];
		for (let i = 0; i < 8; i++) {
			const corner = new Vector3();
			corner.x = (i & 1) ? center.x + halfSize.x : center.x - halfSize.x;
			corner.y = (i & 2) ? center.y + halfSize.y : center.y - halfSize.y;
			corner.z = (i & 4) ? center.z + halfSize.z : center.z - halfSize.z;
			corner.applyMatrix3(rotation);
			corners.push(corner);
		}
		for (let i = 0; i < corners.length; i++) {
			const corner = corners[i];
			positions[i * 3] = corner.x;
			positions[i * 3 + 1] = corner.y;
			positions[i * 3 + 2] = corner.z;
		}
		this.geometry.attributes.position.needsUpdate = true;
		super.updateMatrixWorld(force);
	}
	dispose() {
		this.geometry.dispose();
		this.material.dispose();
	}
}
export { OBBHelper };

這段代碼是一個自定義的 OBBHelper 類,用于創(chuàng)建一個輔助對象來顯示一個方向包圍盒(OBB)的邊界框。以下是代碼的解釋:

導入了所需的 Three.js 模塊和類。這些模塊和類包括 Vector3 、 LineSegments LineBasicMaterial 、 BufferAttribute 、 Float32BufferAttribute BufferGeometry 。

OBBHelper 類繼承自 LineSegments 類,因此它是一個線段對象。

OBBHelper 構造函數接收三個參數: obb 、 object color obb 是一個方向包圍盒對象, object 是一個 Three.js 對象, color 是邊界框的顏色,默認為黃色(0xffff00)。

  • 創(chuàng)建一個 indices 數組,其中包含了邊界框的頂點索引。這些索引指定了邊界框的邊的連接關系。
  • 創(chuàng)建一個 positions 數組,其中包含了邊界框的頂點位置。這些位置定義了邊界框的形狀。
  • 創(chuàng)建一個 BufferGeometry 對象,用于存儲幾何數據。
  • 使用 geometry.setIndex 方法將索引數據分配給幾何體的索引屬性。
  • 使用 geometry.setAttribute 方法將頂點位置數據分配給幾何體的位置屬性。
  • 調用父類 LineSegments 的構造函數,傳遞幾何體和材質作為參數,創(chuàng)建一個線段對象。
  • 設置 OBBHelper 對象的屬性,包括 obb 、 object type 。
  • updateMatrixWorld 方法中,更新輔助對象的世界矩陣。首先,將上一次的世界矩陣的逆矩陣應用于 obb 對象,然后將當前的世界矩陣應用于 obb 對象。接著,根據 obb 對象的屬性計算出邊界框的頂點位置,并更新幾何體的位置屬性。
  • 最后,調用父類的 updateMatrixWorld 方法,更新輔助對象的世界矩陣。
  • dispose 方法用于釋放幾何體和材質的內存。
  • 導出 OBBHelper 類供其他模塊使用。

通過使用這個 OBBHelper 類,可以創(chuàng)建一個輔助對象來顯示一個方向包圍盒的邊界框,并將其添加到場景中以進行渲染和顯示。

實現的效果如下(黃色為Box3Helper,紅色為OBBHelper):

4. 參考資料

[1] OBB – three.js docs (three3d.cn)

[2] three.js/src/helpers/Box3Helper.js at master · mrdoob/three.js (github.com)

[3] three.js examples (three3d.cn)

[4] three.js/examples/jsm/math/OBB.js at master · mrdoob/three.js (github.com)

[5] BufferGeometry.boundingBox的應用:BoxHelper的實現 

[6] 113 Three.js的obb (OrientedboundingBox)方向包圍盒的使用

到此這篇關于Three.js中實現一個OBBHelper的文章就介紹到這了,更多相關Three.js實現OBBHelper內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 微信小程序去除左上角返回鍵的實現方法

    微信小程序去除左上角返回鍵的實現方法

    這篇文章主要介紹了微信小程序去除左上角返回鍵的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • 基于pdf.js實現文本劃詞高亮效果

    基于pdf.js實現文本劃詞高亮效果

    最近有一個需求,需要對于pdf文本進行操作,對接ai大模型對pdf文檔進行高效解讀,其中一個功能就是對于pdf的文本進行劃詞高亮,用戶可進行閱讀標記,本文給大家介紹了如何基于pdf.js實現文本劃詞高亮效果,需要的朋友可以參考下
    2024-05-05
  • JS帶你深入領略Proxy的世界

    JS帶你深入領略Proxy的世界

    Proxy是es2015 標準規(guī)范加入的語法,很可能你只是聽說過,但并沒有用過,畢竟考慮到兼容的問題,不能輕易地使用Proxy特性。但現在隨著各個瀏覽器的更新迭代,Proxy的支持度也越來越高:而且使用Proxy進行代理和劫持,也漸漸成為了趨勢。
    2021-05-05
  • 一個不錯的字符串轉碼解碼函數(自寫)

    一個不錯的字符串轉碼解碼函數(自寫)

    一個不錯的字符串轉碼解碼函數,自己寫的,有需要的朋友可以參考下
    2014-07-07
  • js以對象為索引的關聯數組

    js以對象為索引的關聯數組

    在代碼邏輯中更多的是用關聯數組的方式。但即使是這樣我們也很少使用對象類型作為鍵值對的鍵名。
    2010-07-07
  • JavaScript高級程序設計 讀書筆記之十一 內置對象Global

    JavaScript高級程序設計 讀書筆記之十一 內置對象Global

    由ECMAScript實現提供的、獨立于宿主環(huán)境的所有對象,在ECMAScript程序開始執(zhí)行時出現
    2012-03-03
  • 微信瀏覽器左上角返回按鈕監(jiān)聽的實現

    微信瀏覽器左上角返回按鈕監(jiān)聽的實現

    這篇文章主要介紹了微信瀏覽器左上角返回按鈕監(jiān)聽的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • js 利用image對象實現圖片的預加載提高訪問速度

    js 利用image對象實現圖片的預加載提高訪問速度

    我們來學習一種名為圖像預裝載(image preloading)的小技巧來提高圖像訪問速度,一些瀏覽器試圖通過在本地緩存中保存這些圖片來解決此問題,感興趣的朋友可以了解下
    2013-03-03
  • JavaScript游戲之是男人就下100層代碼打包

    JavaScript游戲之是男人就下100層代碼打包

    不知不覺,就到了11月份了,其實我為啥要寫js游戲,覺得游戲更能引起共鳴。11月份開篇之作:是男人就下100層,相信大家都玩過。
    2010-11-11
  • JS中offset和勻速動畫詳解

    JS中offset和勻速動畫詳解

    這篇文章主要介紹了JavaScript動畫:offset和勻速動畫詳解(含輪播圖的實現),并把實現代碼做了分享,有興趣的朋友參考下。
    2018-02-02

最新評論

盐城市| 丹寨县| 靖宇县| 张家口市| 包头市| 清镇市| 乌鲁木齐县| 巫溪县| 海丰县| 蓬溪县| 静海县| 喀喇沁旗| 东光县| 桦南县| 曲周县| 页游| 庐江县| 柯坪县| 禹城市| 东光县| 马公市| 华池县| 宜昌市| 乾安县| 璧山县| 南皮县| 广德县| 凤城市| 独山县| 无为县| 宜章县| 吉木萨尔县| 广西| 镇远县| 肥城市| 澜沧| 鄂尔多斯市| 苍梧县| 建水县| 沾益县| 班戈县|