基於WebGL(ThingJS)的平面圖導航,室內導航,3D聚焦


前言
利用CampusBuilder來搭建自己的虛擬世界過程有這樣一個問題:如何快速聚焦到虛擬場景的某一位置。當然我們可以創建幾個按鈕對應查找我們需要去的位置(參照物)並聚焦,但是按鈕並不是很炫酷也不能很好的反饋給我們一些信息。接下來我們就用平面導航圖來解決這一問題。

實現
第一步,使用CampusBuilder搭建模擬場景,CampusBuilder操作簡單,分分鍾就可以上手。這里為每一個房間都創建一個小球作為視點參照物體並勾選預覽時隱藏,這樣不會對我們的場景造成影響,也便於我們聚焦到指定房間。注意:要將我們每個房間中的設備框選之后組合在一起,為下一階段的做准備。

 

第二步,把我們編輯好的場景加載到ThingJS中。

//加載場景代碼
var app = new THING.App({
	// 場景地址
	"url": "http://www.thingjs.com/./uploads/wechat/S2Vyd2lu/scene/Campus04",
});
//場景相關
//************************************************************************************/
app.on('load', function () {
    app.camera.flyTo({
        'position': [36.357131498969785, 61.953024217074265, 69.12160670337104],
        'target': [-1.3316924326803257, -4.9370371421622625, 33.619521849828544],
        'time': 2000,
    });
});

第三步,為平面圖創建一塊面板,並調整一下面板的位置以及大小。
圖片下載地址:
鏈接:https://pan.baidu.com/s/1gmNjIj2ekbw1rO3MoujHqQ 提取碼:i0c1

//面板相關
//************************************************************************************/
var panel = new THING.widget.Panel({
    closeIcon: false,
    dragable: false, 
    retractable: true,
    opacity: 0.9,
    hasTitle: true,
});
panel.width = 600;
panel.position = [0, 200];
var dataObj = {
    iframe: ''
};
var iframe = panel.addIframe(dataObj, 'iframe').caption('').setHeight("290px");

第四步,編寫iframe頁。寫完記得將這個頁面和圖片上傳到頁面資源,資源 => 頁面資源 => 按鈕(上傳) 。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
      	.total_image {
        	margin : 20px;
        }
        .total_image img{
            cursor: pointer;
            transition: all 0.6s;
            width: 50px;
        }
        .total_image img:hover{
            transform: scale(1.5);
            position:relative;
            z-index:100;
        }
    </style>
</head>
<body>
<div class="total_image" style="width: 500px;height: 280px;background-size: 100% auto">
    <img class="model_imag" src="發電室1.jpg" style="float: left;display: block;width: 85px;height: 84px" 
			onclick="onClick('PowerGenerationGroup_01','viewPoint_1')" >
              
    <img class="model_imag" src="發電室2.jpg" style="float: left;display: block;width: 78px;height: 84px" 
			onclick="onClick('PowerGenerationGroup_02','viewPoint_2')" >
              
    <img class="model_imag" src="發電室3.jpg" style="float: left;display: block;width:170px;height: 84px" 
			onclick="onClick('PowerGenerationGroup_03','viewPoint_3')" >
              
    <img class="model_imag" src="發電室4.jpg" style="float: left;display: block;width:167px;height: 84px" 
			onclick="onClick('PowerGenerationGroup_04','viewPoint_4')" >
              
    <div style="display: block;float: left;width: 100px;height: 145px;background-color:white">
        <img class="model_imag" src="辦公室1.jpg" style="float: left;display: block;width:100px;height: 60px" 
			onclick="onClick('Office','viewPoint_5')" >
        <img class="model_imag" src="返回.png" style="float: left;display: block;width:100px;height: 80px" onclick="initViewPoint()">
    </div>

    <img class="model_imag" src="發電室5.jpg" style="float: right;display: block;width:123px" 
			onclick="onClick('PowerGenerationGroup_05','viewPoint_8')" > 
              
    <img class="model_imag" src="會議室1.jpg" style="float: left;display: block;width: 138px;height: 145px"  alt="" 
			onclick="onClick('BoardRoom_01','viewPoint_6')">
              
    <img class="model_imag" src="會議室2.jpg" style="float: left;display: block;width: 138px;height: 145px"  alt="" 
			onclick="onClick('BoardRoom_02','viewPoint_7')" > 
</div>

<script>
    function onClick(viewPoint,target){
        window.parent.onClick(viewPoint,target);
    }
	function initViewPoint(){
        window.parent.initViewPoint();
    }
</script>
</body>
</html>

第五步,完成onClick()和initViewPoint()方法。

//事件相關
//************************************************************************************/
var currentModule = null;

//點擊事件
function onClick(targetObj, viewPoint) {
    currentModule = app.query(targetObj)[0];
    currentModule.position = [0, 0, 0];
    currentModule.style.opacity = 1;
    app.camera.flyTo({
        'object': app.query(viewPoint)[0],
        'offset': [0, 13, 7],
        'time': 1000,
        complete: function () {
            currentModule.brothers.style.opacity = 0.3;
        }
    });
}
//返回事件
function initViewPoint() {
    currentModule.brothers.style.opacity = 1;
    currentModule = null;
    app.camera.flyTo({
        'position': [36.357131498969785, 61.953024217074265, 69.12160670337104],
        'target': [-1.3316924326803257, -4.9370371421622625, 33.619521849828544],
        'time': 1000,
    });
}

小結
第一部分我們主要完成了iframe與我們的3D場景的簡單交互,這里也沒有做什么特效只是做了一個點擊事件。這里值得一提的是currentModule這個全局變量,開始我沒有創建這個變量只是將我當前點擊的物體obj.style.opacity = 1;obj.brothers.style.opacity = 0.3, 但是執行initViewPoint(){app.query(’.Thing’).style.opacity=1}無法將場景的opacity 屬性還原(自己可以試一下,或者有解決方案留言)。第二部分我會給iframe頁加上鼠標懸停事件讓iframe頁的img標簽和我們場景中的obj一起動起來!

完整代碼

	//加載場景代碼
var app = new THING.App({
	// 場景地址
	"url": "http://www.thingjs.com/./uploads/wechat/S2Vyd2lu/scene/Campus04",
});
//場景相關
//************************************************************************************/
app.on('load', function () {
    app.camera.flyTo({
        'position': [36.357131498969785, 61.953024217074265, 69.12160670337104],
        'target': [-1.3316924326803257, -4.9370371421622625, 33.619521849828544],
        'time': 2000,
    });
});
//面板相關
//************************************************************************************/
var panel = new THING.widget.Panel({
    closeIcon: false,
    dragable: false, 
    retractable: true,
    opacity: 0.9,
    hasTitle: true,
});
panel.width = 600;
panel.position = [0, 200];
var dataObj = {
    iframe: '/uploads/wechat/S2Vyd2lu/file/平面圖導航/ifram.html'
};
var iframe = panel.addIframe(dataObj, 'iframe').caption('').setHeight("290px");

//事件相關
//************************************************************************************/
var currentModule = null;

//點擊事件
function onClick(targetObj, viewPoint) {
    currentModule = app.query(targetObj)[0];
    currentModule.position = [0, 0, 0];
    currentModule.style.opacity = 1;
    app.camera.flyTo({
        'object': app.query(viewPoint)[0],
        'offset': [0, 13, 7],
        'time': 1000,
        complete: function () {
            currentModule.brothers.style.opacity = 0.3;
        }
    });
}
//返回事件
function initViewPoint() {
    currentModule.brothers.style.opacity = 1;
    currentModule = null;
    app.camera.flyTo({
        'position': [36.357131498969785, 61.953024217074265, 69.12160670337104],
        'target': [-1.3316924326803257, -4.9370371421622625, 33.619521849828544],
        'time': 1000,
    });
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM