物聯網3D場景開發就如同一場舞臺劇,舞臺就是虛擬空間中的3D場景,演員就是場景中的各類模型,它們有著各自相應的位置和角色功能,而在舞臺中擺放著的道具就是3D場景中各個模型的配飾,當“舞臺搭建、演員、道具、API劇本”準備就緒了,這出3D劇目就拉開了序幕……
而這出舞臺劇的“幕后操控者”(導演)其實就是我們“眾星捧月”的3D開發工程師!他們不僅負責舞臺劇的排練和演出,同時還要負責甄別相應的“演出事故”原因!而在UINO也有一位專注懸疑舞臺劇的“大導”,UINO研發中心負責ART-可視引擎的3D開發工程師翔哥,在七夕佳節之際就破解了大型舞臺系列懸疑劇之《Proxima模型閃爍案》,下面我們一起來看看翔哥“破案”的一天!
Proxima模型閃爍案
演出事故
Proxima 3.2版本里,場景中的一些模型會不由自主的閃爍,給場景添加了無限的“活力”,給實施人員添加了無限的惆悵,給翔哥添加了無限的幺蛾子!
看到這種情況,翔哥不禁有點焦頭爛額,隱約覺得這“演出事故”背后的原因可能不是什么善茬。但翔哥的直覺告訴他,這估計是渲染的問題,所以首先就懷疑了instance渲染(模型批量渲染)。于是,翔哥開始了操作,在配置里把模型批量渲染先關掉。
果然,奇跡出現了,關閉模型批量渲染后就不閃了。手起刀落,為了坐實是instance的問題,咱得有理有據。于是,翔哥用ThingJS在線開發完美的復現了問題,給ThingJS API 提了個工單。不一會,工單就有了反饋。
事故原因
簡單說就是場景中的模型縮放(scale)出現了負數,導致instance處理出現了問題。但是問題到這兒就結束了嗎?翔哥和這位查看instance問題工單的研發同學有著同樣的疑問:為什么物體的scale會有負值呢?
于是,翔哥開始“刨根問底”查找“演出事故”的“幕后黑手”!
破案過程
翔哥在ThingJS在線開發上,通過代碼打印出來所有Thing對象的縮放值(scale),確實有一些對象的縮放出現了負數。
然后又打開原始的tjs文件,進行核對,發現原始輸出的tjs文件中就記錄了負數的縮放值。
而tjs的來源是CampusBuilder,真相進一步接近了,肯定是CampusBuilder中的某個操作導致了模型的縮放有負數!
CampusBuilder,查他!
翔哥打開了CampusBuilder,拖了個模型,發現這里面有個鏡像的功能,直覺告訴翔哥,這個操作很可疑很危險。
于是翔哥點擊了這個神奇的鏡像按鈕,然后導出tjs,果然tjs里記錄的為負數的scale值。
那么下一個問題接踵而至:這個為負數的scale值合理嗎?
從3D原理的角度看,是合理的。
因為模型的鏡像就是通過縮放變化實現的,當縮放系數為負時,即發生了鏡像變化。
var app = new THING.App();
var url = ‘https://model.3dmomoda.com/models/0598C1562DDB48A69C36E58A1DC46E52/0/gltf/’; // 模型地址
var obj = app.create({
type: 'Thing',
id: '模型01',
url: url,
position: [0, 0, 0], //
complete: function (ev) {
app.camera.position = [2.5924633695754356, 4.103642737800483, 1.796776548145628];
app.camera.target = [0.5508564735224164, 1.2163745763678693, -0.24483034790739644];
new THING.widget.Button('創建鏡像模型', function () {
var obj = app.create({
type: 'Thing',
id: '模型01-鏡像',
url: url,
position: [1, 0, 0], //
complete: function (ev) {
// 設置縮放動畫
ev.object.scaleTo({
scale: [1,1,-1], // 縮放倍數
time: 2000, // 動畫時間
loopType: THING.LoopType.PingPong // 循環類型 設置循環后 無回調函數
})
}
});
})
}
});
但這樣鏡像后的模型,肯定是“反”的啊?
比如:原本在左側的門,鏡像后就是在右側了。
從這一點,也能看出數字孿生的世界里,虛擬空間的“舞臺劇”可沒我們想象的那么簡單。
首先咱UINO是做DCV數據中心可視化起家的,如果實施工程師以前都這么實施的話,開關機柜門肯定早就發現問題了。
難道是因為這個項目的實施工程師不知道?為了“偷懶”,想把模型批量旋轉就用了鏡像?
取證環節
于是,翔哥又開始調查起了實施人員。由于天色已晚,七夕又要將至,翔哥只能找盼杰(UINO項目經理)這種經驗豐富的老實施人員取證了。
從盼杰的信息中,翔哥敏銳的觀察到了,“以前”二字。說明,以前實施操作肯定是對的。此時公司已經沒人能對證了,只有等第二天再查案了。
第二天,翔哥一早就來到了公司,看到佳琦(UINO項目經理)在,趕緊逮住讓他在CampusBuilder操作鏡像功能。一番操作后,發現機柜門確實是不太對,并且反復確認佳琦以前的操作和現象確實和今天的不一樣了。
于是,翔哥覺得馬上就能破案找到“事故真兇”了。應該是CampusBuilder在某次版本升級后,導致“鏡像”這個功能發生了變更。于是,翔哥找到ThingJS研發組長張琪,在老版本的CampusBuilder和CampusBuilder2020里確實發現了,“鏡像”這個功能有所變更。
老版本的CampusBuilder中的“鏡像”功能只是將模型旋轉了180度,而非真正的鏡像。
從導出的tjs來看,確實也記錄了旋轉值。
所以之前實施工程師在用此“鏡像”功能時,現象是對的,又能滿足“一鍵”將模型“翻轉”180度的能力,實施當然要這么用了。
調查結果
而新版本CampusBuilder2020中其實是將原來“鏡像”非正鏡像的bug給改正確了,因此在CampusBuilder2020版本中的鏡像才是真正的鏡像!
總結起來就是“懷舊服”CampusBuilder和“體驗服”CampusBuilder2020交替時修復了之前的bug,導致各工具間的“信息感知”不對稱。
看完這場“懸疑舞臺劇”之后,我們能切實感受到數字孿生的技術棧和工具鏈是一套復雜的體系,各個組件之間有著大量需要相互配合的技術細節。當“懸疑舞臺劇”中的“演出事故”模型閃爍案發生時,也是耗費了翔哥一天多的時間才找出真相!
可見,數字孿生引擎技術并非一蹴而就,作為引擎技術棧的提供商,必須通過大量工程實踐來構建和完善這套復雜的體系。在日常工作中,猶如翔哥一樣的數字孿生技術領域的從業者可能每天都在經歷著“無數次的破案”,但也正因為UINO想讓數字孿生技術變得簡單易用,讓大家都能體驗到數字孿生可視化跟我們每個人的連接,因此就要付出更多的努力、經過無數次的bug修復、項目工程實踐和積累來把各種復雜性屏蔽在底層。
比如,當你想要開發一個數字孿生應用場景時,雖然只需通過UINO提供的CampusBuilder、CityBuilder等工具鏈實現3D模型位置的擺放、增加配飾、設置參數、標簽等信息,之后通過ThingJS、Proxima等平臺進行虛擬空間中相應的孿生體集合的業務數據配置、關聯邏輯等,就可實現數字孿生可視化場景的應用了。但這看起來易上手的操作背后是UINO規避了無數數字孿生技術底座的復雜性,從而實現了從建模到實施所有環節的簡單應用。
UINO近10年都在致力于數字孿生領域的業務探索和技術積累,而在面對實際業務操作過程中出現的“懸疑案”其實也是激發我們持續改進的源動力。未來UINO將努力打造更加完善的數字孿生工具鏈和標準化平臺,更好地支撐數字孿生可視化業務的普及。



