xBIM 基礎12 WeXplorer xViewer的導航、相機、剖切、隱藏等操作
- 2019 年 10 月 4 日
- 筆記
本篇將學習xViewer的導航,剪切和隱藏。這應該足以使用戶能夠通過所有縮放,平移,軌道運行和隱藏可能的障礙物來檢查建築物內部。點擊這裡可以看到完整的實例。

一、相機的位置和目標
可以根據產品ID輕鬆設置攝像機目標。可能最常見的方法是根據由用戶選擇或按下滑鼠事件所標識的操作來設置目標。示例如下:
viewer.on('pick', function (args) { var id = args.id; viewer.setCameraTarget(id); pickedId = id; });使用 setCameraPosition()方法設置攝像機位置也很容易。以下示例使用HTML輸入來設置值,但您肯定會使用一些智慧邏輯來實現直觀和流暢的用戶體驗。
<input type="text" id="camX" value="-15000" /> <input type="text" id="camY" value="-15000" /> <input type="text" id="camZ" value="15000" /> <button onclick="SetCamera()">Set camera</button> <script type="text/javascript"> function SetCamera() { if (viewer) { var iX = document.getElementById('camX'); var iY = document.getElementById('camY'); var iZ = document.getElementById('camZ'); viewer.setCameraPosition([iX.value, iY.value, iZ.value]); } } </script>能夠向模型或其零件顯示默認軸對齊視圖始終很重要。這是xViewer的內置功能。它始終對setCameraTarget()方法設置的原點和距離進行操作。在示例中,每次用戶選擇上面列出的元素時,都會設置相機目標。
<button onclick="if (viewer) viewer.show('front');">Front</button> <button onclick="if (viewer) viewer.show('back');">Back</button> <button onclick="if (viewer) viewer.show('top');">Top</button> <button onclick="if (viewer) viewer.show('bottom');">Bottom</button> <button onclick="if (viewer) viewer.show('left');">Left</button> <button onclick="if (viewer) viewer.show('right');">Right</button>xViewer 只使用了瀏覽器的默認導航功能,這些功能在滑鼠左鍵軌道上運行,在中間按鈕上平移並放大滾動按鈕。這應該是直觀的。請注意,瀏覽器的最佳做法是將其放在沒有垂直滾動條的單個頁面上。因為縮放模型並同時滾動網站,縮放很難。如果您希望這樣做,可以使用以下程式碼更改左按鈕的默認行為:
<button onclick="if (viewer) viewer.navigationMode = 'orbit';">Orbit</button> <button onclick="if (viewer) viewer.navigationMode = 'free-orbit';">Free orbit</button> <button onclick="if (viewer) viewer.navigationMode = 'pan';">Pan</button> <button onclick="if (viewer) viewer.navigationMode = 'zoom';">Zoom</button> <button onclick="if (viewer) viewer.navigationMode = 'none';">Disable default navigation completely</button>
當模型繞其Z軸旋轉時,默認軌道模式是固定軌道。您還可以使用圍繞實際軸旋轉模型的自由軌道,因此更自由。您可以使用它從不尋常的角度查看模型。就像一個提示 - 如果有必要的話,畫圓圈來調整水平線。您還可以完全禁用默認導航,如示例最後一行所示,並自行實現不同的導航。API現在沒有為此做好準備,但計劃在下一個版本中進行。
二、剖切
很多時候,用戶想要在建築物內部看到一些東西。建築物內部的導航可能很容易變得複雜,但如果你可以切割建築物並看到裡面的東西,那麼用戶的生活將變得更加容易。默認情況下,它也內置在查看器中。如果將平面上的點和平面的法線傳遞給方法,則可以使用clip()方法自行設置剪切平面,或者如果調用不帶參數的方法,則可以讓用戶以交互方式定義剪切平面。使用unclip()方法取消剪切。
<button onclick="if (viewer) viewer.clip();">Interactive clipping</button> <button onclick="if (viewer) viewer.unclip();">Unclip</button> <input type="text" id="clipOrigX" value="0" /> <input type="text" id="clipOrigY" value="0" /> <input type="text" id="clipOrigZ" value="0" /> <input type="text" id="clipNormX" value="-1" /> <input type="text" id="clipNormY" value="0" /> <input type="text" id="clipNormZ" value="0" /> <button onclick="Clip()">Clip</button> <script type="text/javascript"> function Clip() { var oX = document.getElementById('clipOrigX').value; var oY = document.getElementById('clipOrigY').value; var oZ = document.getElementById('clipOrigZ').value; var nX = document.getElementById('clipNormX').value; var nY = document.getElementById('clipNormY').value; var nZ = document.getElementById('clipNormZ').value; if (viewer) viewer.clip([oX, oY, oZ], [nX, nY, nZ]); } </script>三、隱藏
有時也需要隱藏一個元素或一種類型的元素,比如所有的牆壁。這可以通過使用setState()方法設置產品的狀態來實現。使用resetStates()方法將所有狀態重置為默認值。此方法有一個可選參數,您可以使用該參數顯示空格。默認情況下隱藏它們,除非您手動顯示它們。
<select id="cmbHide"> <option value="noAction">No action</option> <option value="hideProduct">Hide product</option> <option value="hideType">Hide type</option> <option value="highlight">Highlight</option> </select> <button onclick="if (viewer) viewer.resetStates()">Show all</button> <script type="text/javascript"> function initHiding() { viewer.on('pick', function (args) { var cmb = document.getElementById('cmbHide'); var option = cmb.value; switch (option) { case 'hideProduct': viewer.setState(xState.HIDDEN, [args.id]); break; case 'hideType': var type = viewer.getProductType(args.id); viewer.setState(xState.HIDDEN, type); break; case 'highlight': viewer.setState(xState.HIGHLIGHTED, [args.id]); break; default: break; } }); }; </script> 四、X-Ray渲染模式
xViewwe還有一個選項,那就是突出顯示。它內置於引擎的核心,如果您需要在視覺上突出顯示或隔離模型中的某些對象,它非常有用。它與X-Ray渲染模式結合使用時特別有用,其中所有內容都以半透明淺藍色呈現,除了具有狀態xState.HIGHLIGHTED或xState.XRAYVISIBLE的產品。要在普通和X射線渲染模式之間切換,只需設置xViewer的renderingMode屬性即可。
<div> Rendering mode <label> <input type="radio" name="rRenderingMode" checked="checked" onchange="if (viewer) viewer.renderingMode = 'normal';"/> Normal </label> <label> <input type="radio" name="rRenderingMode" onchange="if (viewer) viewer.renderingMode = 'x-ray';" /> X-Ray </label> </div>