張競波 孔婭妮 肖華亮 凌榛
摘要:目前,計算機虛擬現實(VR) 技術主要應用在高危行業和醫療行業的虛擬仿真化工作中,其沉浸式體驗感和真實還原現場的特點極大降低了高危行業和醫療行業在生產和技術培訓方面的風險。在職業病防治領域VR技術暫未涉及。本項目通過計算機虛擬現實(VR) 技術與職業病防治工作的結合,把原本需要花費大量人力、物力才能開展的現場開展的職業病防治培訓、防治設備演示等工作利用VR技術虛擬仿真化。在經濟上降低了職業病防治的成本,更可以利用互聯網+技術打破地域空間的限制,提高職業病防治的覆蓋面、規范化和工作效率。
關鍵詞:計算機虛擬現實技術;職業病防治;計算機平臺設計;VR技術
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2024)07-0110-04
開放科學(資源服務)標識碼(OSID)
1 背景
職業病危害涉及各行各業,其危害因素繁多,多種健康影響因素交織,各行業職業人群健康面臨多重疾病威脅。傳統的職業病防治工作中需要通過相關單位不定期組織專業人員到現場開展職業病防治相關培訓,需要耗費大量人力、財力、不利于監督和落實情況的自查自糾。同時,職業病防治培訓過程中職業病防護器具穿戴展示、職業病危害宣傳、職業病防治過程考核、職業病防治規范培訓等相關工作知識技能覆蓋面廣,對處于工作狀態的企業而言也面臨巨大負擔。
課題團隊通過調研發現,在職業病防治宣傳和培訓過程中,相關職業病防治法律法規、職業病防護器具穿戴展示等可以通過短視頻的形式進行演示,職業病防治場所布置、設備使用體驗可以通過計算機虛擬現實(VR) 技術實現。行政監督部門和相關職業病防治實施企業可以在現有的軟硬件基礎上,定制職業病防護器具VR體驗系統、定制基于WEB的VR職業病防治網絡體驗館、定制職業病防治宣傳視頻等,以提高職業病防治的工作效率,并協助培養基層職業健康監管人員和專業技術人員,有效提高其專業知識和技能水平,提升職業病危害治理能力。
為實現計算機虛擬現實技術(VR) 在職業病防治工作中的應用,課題團隊擬開發職業病防治虛擬現實系統,采用包括3DMAX、MAYA等三維軟件構建相關三維模型。采用Unity3D中進行三維注冊,編寫C#、C++腳本語言實現交互,結合數據頭盔、立體眼鏡、數據手套等硬件,使參與者在空間上能夠自由移動、旋轉、實現六自由度體驗。同時采用外置力反饋輸出設備,在體驗中感知力度的存在。考慮到行政監督部門的統一宣傳和管理,課題團隊擬采用全景拍攝技術把實景環境制作成可交互的虛擬現實VR視頻,結合WEB服務器可實現多平臺進行全面管理和推廣。
2 系統整體設計
課題組團隊通過對職業病防治虛擬現實系統的調研,擬從三維建模、Unity3D三維注冊、全景視頻拍攝、虛擬現實WEB系統設計、WEB服務器搭建等方面進行系統建設。
3 系統功能設計
職業病防治虛擬現實系統包括虛擬場景搭建和真實場景虛擬化兩個部分。
3.1 虛擬場景搭建
虛擬場景搭建是為了把具有高危險性和高成本的演示環節,通過虛擬現實技術的沉浸式體驗讓體驗者在保證安全的前提下,更加真切地感受到實際生產中導致職業病產生的原因,同時,利用虛擬場景中的交互技術,讓體驗者通過使用數據頭盔、立體眼鏡、數據手套等硬件正確的穿戴防護用品。該項功能不僅可以用作體驗和技能培訓,還可以作為上崗安全培訓的模擬實操環節,進一步降低企業的生產風險和保障培訓員工的工作安全。
3.1.1 三維模型設計
職業病防治中需要建立三維模型的對象是根據具體的應用場景來建立,如:防毒面罩是在員工需要接觸到吸入型有毒物質時使用。在具有光污染的工作環境時,則需要使用護目鏡。因此,為保障不同工種在不同環境使用的具體需求,課題團隊將包括:降噪耳塞、防噪耳罩、防毒面罩、護目鏡、防護服、防護手套、防塵口罩等專業防護設備在3Dmax軟件中進行了建模(如圖2所示)。
完成三維建模以后,還需要對模型進行三維渲染。三維渲染是一種將虛擬場景轉化為二維圖像的過程,其中光的應用起到了至關重要的作用。其原理是通過模擬光線在虛擬場景中的傳播和交互來創建逼真的圖像。過程涉及多個關鍵步驟,包括場景建模、光照計算、材質表現和最終圖像生成。其中,光照計算是實現真實感的關鍵步驟之一,它決定了場景中各個物體的明暗、陰影和反射效果[1]。
3.1.2 使用3D引擎實現交互
建好的三維模型是只能觀看不能利用硬件進行交互的,因此,需要使用3D引擎實現交互。3D引擎是虛擬現實軟件系統開發的核心工具,負責場景搭建、交互程序設計、業務邏輯控制、前后端數據通信等功能的實現,主流的常用軟件為Unity3D、UE4,這兩款3D引擎軟件最初主要用于三維游戲的設計、開發,其中Unity3D具有跨平臺部署、多種編程語言的程序庫支持、物理屬性模擬、粒子特效等技術優勢,且匹配有豐富的第三方資源庫和多種第三方軟件工具的通信接口,使其在虛擬現實技術領域也快速得到了廣泛應用,此外針對數據通信,Unity3D還提供了MySQL與SQLite兩類數據庫接口[2]。在此使用到了Unity3D中的input類和手勢控制的相關函數,實現對模型的平移、旋轉、放大和縮小等功能。
通過在Unity3D中使用C#腳本綁定模型可以實現電腦鼠標對模型的控制,但是,沉浸式體驗中需要使用到VR眼鏡、控制手柄等VR設備,在此,需要使用Unity3D中添加Actions動作來連接手柄等硬件。如:需要使用手柄控制模型的移動和選擇,則需要新建并綁定“move”和“rotate”兩個動作。具體代碼如下:
Vector move;
Vector rotate;
void Awake()
}
controls =new PlayerControls();
controls.Gameplay.Grow.performed +=ctx >Grow();
controls.Gameplay.Reduce.performed +=ctx =>Reduce();
controls.Gameplay.Move.performed +=ctx =>move =ctx.ReadValue
controls.Gameplay.Move.canceled +=ctx =>move =Vector2.zero;
controls.Gameplay.Rotate.performed+=ctx =>rotate =ctx.ReadValue
controls.Gameplay.Rotate.canceled +=ctx =>rotate =Vector2.zero;
}
3.2 真實場景虛擬化
根據課題團隊的前期調查發現,地方行政執法監督部門一般設置有專門的職業衛生監督實訓基地,該基地的主要功能包括:職業病防治法律法規宣傳欄、職業病防治設備使用展示空間、具體職業病防治措施圖文介紹、具體職業病防護用品展示視頻展播、現場模擬執法教學、執法文書培訓等。該基地占地面積不大,若要定期開展企業員工和兄弟單位執法人員開展培訓,一次性接納人數有限,且參培人員需要前往基地才可開展。另外,地方行政執法監督部門一般會設置具有代表性的企業作為職業病防治科普基地,該科普基地一般為在生成的規模級以上企業,前往企業進行科普培訓也在一定程度上影響企業生產和安全。
因此,課題團隊擬采用虛擬全景視頻技術,把真實的培訓、生產、執法環境通過全景視頻技術制作后通過自主搭建的全景WEB服務器在互聯網上進行實景還原。
3.2.1 全景視頻制作
全景視頻制作是把具體空間利用720度全景圖片拍攝,再利用全景WEB系統形成可交互的全景視頻。
720度全景圖制作有別于360度全景圖,它包含頂部和底部空間展示,需要使用到全景相機或全景云臺進行拍攝。其基本原理是根據使用相機的鏡頭角度拍攝能夠覆蓋被攝空間的照片。拍攝的可以使用大疆如影系列的穩定器中的全景拍攝功能配合超廣角鏡頭進行拍攝,一般選用10-16mm鏡頭最佳,視鏡頭視角可拍攝8-16張不等的照片用于后期合成。該拍攝方案拍攝精度高、銜接度好,但是其設備使用較高,不利于后續系統使用企業自主更新。根據這一情況,課題團隊使用手動拍攝云臺加華為手機進行拍攝同樣可以達到制作效果。其優點是拍攝成本低,設備上手難度低。但使用手動云臺加華為手機拍攝會因為廣角不夠大的原因,導致需要拍24-48張照片進行后期合成,合成難度相對較高。
拍攝完成后的多張照片需要利用全景合成軟件PTGui合成為一張完整的全景圖片。PTGui軟件可以根據單張照片中的銜接點自動對齊照片拼接為一張全景圖,但是,在拼接過程中經常會出現自動識別錯誤導致的畫面錯誤,因此需要使用PTGui軟件中的控制點工具,手動精準地把2張拼接圖中的控制點對齊。同時,PTGui還支持通過對對比度、曝光補償、白平衡等調節對不同曝光量照片在拼接時的自動曝光調整。
通過PTGui導出的720度全景圖可能存在如:污點、鬼影、虛影等失真情況,還需要再經過photoshop等軟件的精修和調色才可以完成靜態的720度全景圖片制作。
3.2.2 全景WEB服務器搭建
根據課題團隊前期調研,擬結合相關部門現有網絡環境,采用B/S模式,利用PHP+MYSQL開發相應的全景WEB系統,可以實現用戶管理及訪問權限管理、720度全景圖上傳、全景圖編輯、圖像視頻素材上傳、下載權限設置、分享二維碼生成等主要功能。
(1) 服務器端功能描述
服務器端的功能設計包括資源管理、全景生成、圖形處理與數據庫服務等模塊。資源管理模塊主要負責管理端對全景照片、素材文件、視頻文件、音頻文件等資源的上傳。全景生成模塊負責對全景圖片進行格式轉換與信息解析等。在圖形處理模塊中,可以實現圖片信息編輯、鏈接熱點生成等。數據庫服務模塊則負責服務器與數據庫的通信、數據庫的備份與恢復,當服務器解析的任務請求涉及數據庫操作時,由服務器對數據庫進行讀寫訪問,并將最終結果返回至客戶端[3]。
(2) 部分系統功能
①上傳全景照片
前期拍攝的全景照片需要根據展播順序上傳全景WEB系統。具體代碼如下:
$act = Common::sfilter($_REQUEST['act']);
if ($act == 'list') {
$page = intval($_REQUEST['page']);
$page = $page<1?1:$page;
$size =? 27;
$list = get_ring_projects($page,$size);
echo $Json->encode($list);
exit;
}else{
}
$tp->assign('host',$_lang['cdn_host']);
function get_ring_projects($page,$size){
$sql = "select * from ".$GLOBALS['Base']->table('ring_around')." order by id desc limit ".($page-1)*$size.",".$size;
$res = $GLOBALS['Db']->query($sql);
foreach ($res as $k => $v) {
if(empty($list[$k]['img_path'])){
$list[$k]['img_path'] = $GLOBALS['Db']->query("SELECT img_path FROM ".$GLOBALS['Base']->table('ring_around_img')." WHERE rid=".$v['id'],"One");
$list[$k]['img_path'] = $list[$k]['host'].'/'.$list[$k]['img_path'];
}}
return $res;
}
②生成全景視頻
拍攝形成的720度全景圖是一張靜態的jpg圖片,在線下本地訪問只能通過左右拖動觀看,720度的全景觀看有很大的變形問題。因此必須利用程序代碼將其轉換為可拖動查看的720全景影像。具體代碼如下:
$act = Common::sfilter($_REQUEST['act']);
if ($act == 'list') {
$page = intval($_REQUEST['page']);
$page = $page<1?1:$page;
$size =? 24;
$recommend = isset($_REQUEST['recommend']) ? intval($_REQUEST['recommend']) : 1;
$list = get_video_projects($recommend,$page,$size);
echo $Json->encode($list);
exit;
}
$tp->assign('video_top_ad',Transaction::get_ad_by_postion(4));
function get_video_projects($recommend,$page,$size){
$sql = "select id,vname,thumb_path,browsing_num from ".$GLOBALS['Base']->table('video')." where 1 ";
if($recommend>0){
$sql .= "and recommend=1 ";
$GLOBALS['tp']->assign('recommend',1);
}
$sql.=' limit '.($page-1)*$size.','.$size;
$res = $GLOBALS['Db']->query($sql);
return $res;
}
③提取全景圖片進行編輯
對需要進行編輯的全景照片系統可以實現照片尺寸、頁面層疊順序、標題、描述等信息的編輯。具體代碼如下:
if(!defined('IN_T')){
die('hacking attempt');
}
$act = Common::sfilter($_REQUEST['act']);
if ($act == 'list') {
$tag = intval($_REQUEST['tag']);
$page = intval($_REQUEST['page']);
$page = $page<1?1:$page;
$size =? 27;
$list = get_picture_projects($tag,$page,$size);
echo $Json->encode($list);
exit;
}else{
$tp->assign('picture_tags',get_picture_tags());
$tp->assign('picturs_top_ad',Transaction::get_ad_by_postion(3));
}
function get_picture_tags(){
$sql = "select * from ".$GLOBALS['Base']->table('tag')." where type=1 order by sort asc, id asc";
$res = $GLOBALS['Db']->query($sql);
return $res;
}
function get_picture_projects($tag,$page,$size){
$sql = "select w.name,w.thumb_path,w.view_uuid,w.profile,w.browsing_num ".
"from ".$GLOBALS['Base']->table('worksmain')." as w ";
if($tag>0){
$sql .= "right join (select works_id from ".$GLOBALS['Base']->table('tag_works')." where tag_id=$tag group by works_id) as t on t.works_id=w.pk_works_main ";
}
if($tag==-1){
$sql .= "where w.recommend=1 ";
}
$sql .= "order by w.pk_works_main desc limit ".($page-1)*$size.",".$size;;
$res = $GLOBALS['Db']->query($sql);
return $res;
}
④上傳的視頻在線播放
實際拍攝的全景視頻中往往會連接部分如:操作演示、政策解讀等內容的短視頻,瀏覽者通過全景WEB系統瀏覽全景視頻的同時,可以點擊在線播放相應的視頻文件實現在線瀏覽。具體代碼如下:
function GetQueryString(name)
{
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r!=null)return? unescape(r[2]); return null;
}
embedpano({swf:"tour.swf", xml:"/tour/tour_video.xml.php?vid="+GetQueryString('vid'), target:"pano", html5:"auto", mobilescale:1.0, passQueryParameters:true});
function get_time(cur_time,total_time,seekpos){
console.log("拖動之前:"+parseInt(cur_time));
console.log("拖動之后:"+parseInt(total_time*seekpos));
}
function update_title(title){
document.title = title;
}
⑤文件下載功能
若瀏覽者需要獲取全景WEB系統中的相關文件、圖片、視頻等,可以通過下載功能獲得。具體代碼如下:
define('IN_T',true);
require_once " ";
$act = Common::sfilter($_REQUEST['act']);
if ($act=='project') {
$filename = Common::sfilter($_REQUEST['filename']);
$filename = str_replace('.','',$filename).'.zip';
$url = ROOT_PATH.'temp/down/'.$filename;
if (!file_exists($url)) {
die('找不到該文件');
}
createDowanload($url,$filename);
exit;
}
function createDowanload($url,$filename,$isDelete=false){
@ini_set("max_execution_time", "1800");
ob_clean();
header('Cache-control: private');
header("Content-type:application/x-zip-compressed");
header('Content-Length: '.filesize($url));
header('Content-Disposition:attachment; filename='.$filename);
flush();
$fh = @fopen($url, 'r');
while(!feof($fh)){
print fread($fh, 1024);
flush();
}
@fclose($fh);
if($isDelete)
unlink($url);
}
4 職業病防治虛擬現實系統存在的不足
職業病防治虛擬現實系統采用VR技術讓使用者在職業病防治培訓過程中身臨其境,除了逼真的視覺效果,良好的觸覺反饋也是十分重要的[4]。這包括噪聲信息采集、氣體帶來的視覺、觸覺感受、軟硬物體對皮膚觸感的影響等均有待進一步的開發和研究。
其次,企業職業病產生的環境和因素較多,采用VR技術逐一實現也有教改的生產成本和技術難度要求。因此,目前比較可行的方案是將普識性的內容通過VR技術實現,將較為特殊的案例用傳統方式進行展現。
第三,有研究表明,VR設備會導致一系列精神神經癥狀如惡心、眩暈、幻視等[5]。對于不適宜使用VR設備的人員而言,強制要求通過職業病防治虛擬現實系統反而會適得其反。
職業病防治虛擬現實系統能夠模擬出真實的場景與真實的設備,能夠有效提升職業病產生場景的真實性與沉浸性。其推廣和應用能使得相關政府執法監督部分提高職業病防治宣傳、監督和培訓的效率,降低企業和相關單位的培訓經費,讓參培人員的培訓時間更加靈活,縮短了培訓周期,降低了參培人員在培訓過程中造成安全風險的可能性,為基層衛生執法工作提供了有力幫助,也為一線企業員工的身體健康和生產安全提供能支持。
參考文獻:
[1] 姚又龍.虛擬現實交互設計中光的應用研究[J].鞋類工藝與設計,2023,3(20):36-38.
[2] 高強.基于Unity3D虛擬空間交互系統[J].信息記錄材料,2023,24(9):176-178.
[3] 周葉平,汪有韜,蘭清生,等.基于VR技術的電梯限速器校驗培訓系統設計[J].機械管理開發,2023,38(10):134-136.
[4] 熊冉,黃華興,曹月洲.淺談虛擬現實技術在模擬醫學教育中的應用[J].科技風,2023(31):124-126.
[5] 周穎,石思潔.虛擬現實在實驗室建模設計中的應用[J].集成電路應用,2023,40(10):419-421.
【通聯編輯:光文玲】