日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

如何通过一张图片给BoxBufferGeometry的6个面贴图

發布時間:2023/12/13 综合教程 43 生活家
生活随笔 收集整理的這篇文章主要介紹了 如何通过一张图片给BoxBufferGeometry的6个面贴图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

threejs所用版本為114dev

為每個面貼相同的圖片

這個簡單,幾句話就搞定。

var geometry = new THREE.BoxBufferGeometry( 1, 1, 1 );
var texture = new THREE.TextureLoader().load( '**.jpg' );
// 立即使用紋理進行材質創建
var material = new THREE.MeshBasicMaterial( { map: texture } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );

如何通過一張圖片為6個面貼圖呢?

首先我們來了解下BoxBufferGeometry中的點。

點保存在attributes的position中,但是array中的數據個數怎么是72個呢?一個正方體8個頂點,一個頂點3個數據(x,y,z)應該是24個數據才對。其實并不是這么理解,在這組數據中不僅包含了點的信息還包含了面的信息,Threejs中的幾何體是有三角面片組成的,一個三角面片需要3個點,所以一個正方體有6個面,這6個面又是由12個三角形組成,那數據個數應該是 12(三角面個數)*3(一個三角面的點個數)*3(一個點的數據個數)=108,通過這個推測出的數據還是和得到的數據不符。

通過這個推斷: 數據個數=6(正方形面的個數)*4(一個正方形面由兩個三角形面組成,需要4個點)*3(一個點的數據個數)=72,這個時候數據對上了。結論12個數據描述一個正方形面。

再來聊聊BoxBufferGeometry中的UV

至于UV映射的原理可以參考博客:https://www.cnblogs.com/yanan-boke/p/7815018.html

有了上面對頂點了解的基礎,這里可以得出數據個數=6(正方形面的個數)*4(一個正方形面由兩個三角形面組成,需要4個點)*2(一個點的數據個數)=48。注意:在面里說的點是三維里面的點有x,y,z三個數據,uv里面的點是二維里面的點只有x,y兩個數據。

理解了這些,就可以動手了

這里借用一下博友的圖片(圖片出處)

代碼如下

var vertices = new Float32Array([
                0, 0.33, 0.5, 0.33, 0, 0, 0.5, 0, //  圖片的左下
                0.5, 0.33, 1, 0.33, 0.5, 0, 1, 0, // 圖片右下
                0, 0.66, 0.5, 0.66, 0, 0.33, 0.5, 0.33, // 圖片中左
                0.5, 0.66, 1, 0.66, 0.5, 0.33, 1, 0.33, // 圖片中右
                0, 1, 0.5, 1, 0, 0.66, 0.5, 0.66, //圖片左上
                0.5, 1, 1, 1, 0.5, 0.66, 1, 0.66 // 圖片右上
            ]);
            
            var box = new THREE.BoxBufferGeometry(1, 1, 1);
            box.setAttribute('uv', new THREE.Float32BufferAttribute(vertices, 2));
            var map = new THREE.TextureLoader().load('images/texture-atlas.jpg');
            var boxMaterial = new THREE.MeshBasicMaterial({ map: map });
            var boxMesh = new THREE.Mesh(box, boxMaterial);
            scene.add(boxMesh);

運行結果

總結

以上是生活随笔為你收集整理的如何通过一张图片给BoxBufferGeometry的6个面贴图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。