BabylonJS系列:方向?qū)Ш胶?1.創(chuàng)建盒子模型

這一節(jié)主要編寫生成導(dǎo)航盒模型的代碼,將以創(chuàng)造自定義模型為中心進行講解。想閱覽相關(guān)官方文檔的小伙伴可以自行前往(https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/custom/custom
說到自定義生成模型棺耍,我們很難離開VertexData,VertexData對Mesh的各項基礎(chǔ)buffer的設(shè)置和獲取提供了一層封裝螟蝙,我們可以使用VertexData去讀取/修改/設(shè)置Mesh的基本Buffer源武。它常用的幾個字段如下

class VertexData{
  position:number[];     //頂點數(shù)組 頂點數(shù)*3
  colors:number[];       //顏色數(shù)組 頂點數(shù)*3或4
  indices:number[];      //索引數(shù)組 面數(shù)*3
  normals:number[];      //法線數(shù)組 頂點數(shù)*3
  uvs:number[]           //uv0數(shù)組 頂點數(shù)*2
  ......
  uvs6:number[]          //uv6數(shù)組 頂點數(shù)*2
}

我們在實例化Mesh之前,我們需要準備好需要用到的基礎(chǔ)數(shù)據(jù)的數(shù)組舱污,normals法線一般使用VertexData.ComputeNormals直接計算得出呀舔。
在這個案例中,我們需要準備positions, indices和uvs,然后通過計算獲取normals媚赖。下為創(chuàng)建Mesh過程的步驟代碼霜瘪,對準備頂點數(shù)據(jù)的過程有興趣的小伙伴可以前往PG。

//自定義數(shù)據(jù)接口
interface ICustomVertexData {
    positions: number[],
    indices: number[],
    uvs: number[]
}
class DirectBoxCreator {
    //創(chuàng)建盒子
    static create(scene: BABYLON.Scene, size: number, edgePercent: number) {
        const front = B.Vector3.Forward();
        const back = B.Vector3.Backward();
        const right = B.Vector3.Right();
        const left = B.Vector3.Left();
        const up = B.Vector3.Up();
        const down = B.Vector3.Down();
        const data: ICustomVertexData = {
            positions: [],
            indices: [],
            uvs: [],
        }
        //創(chuàng)建6個面
        //創(chuàng)建正面
        this.createFace(size,edgePercent,back, up, right, new B.Vector2(0, 0), data);
        ......
        //創(chuàng)建8個角
        // 創(chuàng)建左上前角
        this.createEdge(size,edgePercent,new B.Vector3(-size, size, -size), right, down, front, data);
        ......
        //準備VertexData
        const vertexData = new B.VertexData();
        vertexData.positions = data.positions;
        vertexData.indices = data.indices;
        vertexData.uvs = data.uvs;
        const normals: number[] = [];
        B.VertexData.ComputeNormals(data.positions, data.indices, normals);
        vertexData.normals = normals;

        //創(chuàng)建Mesh
        const mesh = new B.Mesh("DirectBox", scene);
        //創(chuàng)建材質(zhì)
        const material = new B.StandardMaterial("DirectBoxMat", scene);
        mesh.material = material;
        material.disableLighting = true;
        material.emissiveTexture = new BABYLON.Texture("https://moriyer.github.io/BabylonTexture/JianShu/Texture/DirectBox.jpg", scene, undefined, false);
        //將vertexData數(shù)據(jù)應(yīng)用進Mesh
        vertexData.applyToMesh(mesh);

        return {
            mesh,
            material,
        };
    }
    private static createFace(size: number, edgePercent: number, origin: BABYLON.Vector3, up: BABYLON.Vector3, right: BABYLON.Vector3, uvOffset: BABYLON.Vector2, data: ICustomVertexData) {
        //計算過程,uvOffset參數(shù)是因為貼圖問題手動配置偏置
    }
    private static createEdge(size: number, edgePercent: number, origin: BABYLON.Vector3, dir1: BABYLON.Vector3, dir2: BABYLON.Vector3, dir3: BABYLON.Vector3, data: ICustomVertexData) {
        //計算過程
    }
}
(https://playground.babylonjs.com/?#ENABP9#6)

此時的盒子已經(jīng)完成惧磺,美中不足的是棱角不夠明顯颖对,我們可以給Mesh加上Edge讓棱角突出

        mesh.enableEdgesRendering(0.99);  //激活Edge
        mesh.edgesWidth = 6;              //設(shè)置Edge寬度
        mesh.edgesColor.set(0, 0, 0, 1);  //設(shè)置黑色
        (https://playground.babylonjs.com/?#ENABP9#7)
image.png

添加Edge后,棱角有明顯的線條磨隘,但是會發(fā)現(xiàn)棱角粗細不一缤底,旋轉(zhuǎn)的時候棱角閃爍,這是一個典型的z-fight問題番捂,深度距離接近導(dǎo)致有些角度Edge被盒子遮住个唧,從而產(chǎn)生閃爍。對于這種問題设预,我們可以讓盒子沿著法線的z軸縮放一點點徙歼。

mesh.material.zOffset = 1;


PS:最終的PG:https://playground.babylonjs.com/?#ENABP9#8

下一節(jié):BabylonJS系列:方向?qū)Ш胶?2.創(chuàng)建導(dǎo)航盒場景

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鳖枕,隨后出現(xiàn)的幾起案子魄梯,更是在濱河造成了極大的恐慌,老刑警劉巖耕魄,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件画恰,死亡現(xiàn)場離奇詭異,居然都是意外死亡吸奴,警方通過查閱死者的電腦和手機允扇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來则奥,“玉大人考润,你說我怎么就攤上這事《链Γ” “怎么了糊治?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長罚舱。 經(jīng)常有香客問我井辜,道長,這世上最難降的妖魔是什么管闷? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任粥脚,我火速辦了婚禮,結(jié)果婚禮上包个,老公的妹妹穿的比我還像新娘刷允。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布树灶。 她就那樣靜靜地躺著纤怒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪天通。 梳的紋絲不亂的頭發(fā)上泊窘,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音土砂,去河邊找鬼州既。 笑死,一個胖子當(dāng)著我的面吹牛萝映,可吹牛的內(nèi)容都是我干的吴叶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼序臂,長吁一口氣:“原來是場噩夢啊……” “哼蚌卤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奥秆,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤逊彭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后构订,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侮叮,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年悼瘾,在試婚紗的時候發(fā)現(xiàn)自己被綠了囊榜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡亥宿,死狀恐怖卸勺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烫扼,我是刑警寧澤曙求,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站映企,受9級特大地震影響悟狱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堰氓,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一挤渐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豆赏,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抚岗,卻和暖如春或杠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宣蔚。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工向抢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胚委。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓挟鸠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亩冬。 傳聞我的和親對象是個殘疾皇子艘希,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容