基於WebGL架構的3D可視化平臺—平面圖導航(一)

前言html

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

實現ui

第一步,使用CampusBuilder搭建模擬場景,CampusBuilder操做簡單,分分鐘就能夠上手。這裏爲每個房間都建立一個小球做爲視點參照物體並勾選預覽時隱藏,這樣不會對咱們的場景形成影響,也便於咱們聚焦到指定房間。注意:要將咱們每一個房間中的設備框選以後組合在一塊兒,爲下一階段的作準備。
v2-09f14c34b61862a0abbfb0eb13306551_hd.pngurl

v2-0392c3b8198a8f6e83234ac7be630e97_hd.png

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

//加載場景代碼
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/1gmNj... 提取碼:i0c1code

//面板相關
//************************************************************************************/
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頁。寫完記得將這個頁面和圖片上傳到頁面資源,資源 => 頁面資源 => 按鈕(上傳) 。orm

<!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()方法。htm

//事件相關
//************************************************************************************/
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,
    });
}
相關文章
相關標籤/搜索