摘要:前言基于架構的可視化平臺平面圖導航一中已經完成了面板與我們的場景的簡單交互,下面我們繼續完善并給頁加上鼠標懸停事件讓頁的標簽和我們場景中的一起動起來。
前言
基于WebGL架構的3D可視化平臺—平面圖導航(一)中已經完成了iframe面板與我們的3D場景的簡單交互,下面我們繼續完善并給iframe頁加上鼠標懸停事件讓iframe頁的img標簽和我們場景中的obj一起動起來。
實現
第一步,還是使用之前的場景接著上次的繼續,先編寫iframe頁。給每一個img標簽都加上onmouseover、onmouseout 事件。
Document
function onClick(viewPoint,target){ window.parent.onClick(viewPoint,target); } function onMouseOver(targetObj,viewPoint){ window.parent.onMouseOver(targetObj,viewPoint); } function onMouseOut(targetObj){ window.parent.onMouseOut(targetObj); } function initViewPoint(){ window.parent.initViewPoint(); }
第二步,房間里的物體不要要讓他“飛起來”,還要給他加一個“底座”。這里叫他SurveillanceCamera類,在自己編寫類的時候一定要注意,想要當前類生效一定要繼承THING.Thing,并且THING.factory.registerClass(‘ClassName’, ClassName);
class SurveillanceCamera extends THING.Thing {
constructor(app) { super(app); this.app = app; this.isFrustum = true; this.opacity = 1; this.color = 0xff00ff; this.vertices = []; this.near = 0.1; this.camera = null; this.node = new THREE.Object3D(); this._frustum = new THREE.Frustum(); this._projScreenMatrix = new THREE.Matrix4(); } setup(param) { super.setup(param); this.fov = param["fov"]; this.aspect = param["aspect"]; this.far = param["far"]; this.alpha = param["alpha"]; this.lineAlpha = param["lineAlpha"]; this.setupComplete(param); } setupComplete(param) { super.setupComplete(param); this.build(); } build() { if (this.node.children.length > 0) { this.node.children = []; } if (this.camera != null) { this.camera = null; } var h = this.far * Math.tan(this.fov * 0.5 * 0.017453293); var w = this.aspect * h; var geometry = new THREE.Geometry(); this.vertices = [new THREE.Vector3(0, 0, 0), new THREE.Vector3(w, -h, -this.far), new THREE.Vector3(w, h, -this.far), new THREE.Vector3(-w, h, -this.far), new THREE.Vector3(-w, -h, -this.far)]; var faces = [new THREE.Face3(0, 1, 2), new THREE.Face3(0, 2, 3), new THREE.Face3(0, 3, 4), new THREE.Face3(0, 4, 1), new THREE.Face3(3, 4, 1), new THREE.Face3(3, 1, 2)]; geometry.vertices = this.vertices; var line_mat = new THREE.LineBasicMaterial({ color: "#b4f5f8", opacity: this.lineAlpha || 0.5, }) var texture = THREE.ImageUtils.loadTexture("images/light2.png"); texture.wrapS = THREE.RepeatWrapping; texture.wrapT = THREE.RepeatWrapping; var frustum_mat = new THREE.MeshBasicMaterial({ color: "#0aa5ff", opacity: this.alpha || 0.5, transparent: true, side: THREE.DoubleSide, }); var line_mesh = new THREE.Line(geometry, line_mat); var frustum_mesh = new THREE.Mesh(geometry, frustum_mat); geometry.faces = faces; this.node.add(frustum_mesh, line_mesh); this.camera = new THREE.PerspectiveCamera(this.fov, this.aspect, this.near, this.far); this.camera.position.set(this.position[0], this.position[1], this.position[2]); this.camera.rotation.copy(this.node.rotation); this.camera.updateMatrixWorld(true); this._updateFrustum(); } setPosition() { this.camera.position.set(this.position[0], this.position[1], this.position[2]); this.camera.updateMatrixWorld(true); this._updateFrustum(); } _updateFrustum() { if (this.camera) { this._projScreenMatrix.multiplyMatrices(this.camera.projectionMatrix, this.camera.matrixWorldInverse); this._frustum.setFromMatrix(this._projScreenMatrix); } } intersectsObject(object) { this._updateFrustum(); return this._frustum.intersectsObject(object); } intersectsBox(box) { this._updateFrustum(); return this._frustum.intersectsBox(box); } intersectsSphere(sphere) { this._updateFrustum(); return this._frustum.intersectsSphere(sphere); } intersectsSprite(sprite) { this._updateFrustum(); return this._frustum.intersectsSprite(sprite); }
}
THING.factory.registerClass("SurveillanceCamera", SurveillanceCamera);
第三步,鼠標懸浮事件和鼠標離開事件,這里我們使用了之前創建的SurveillanceCamera類為obj加上了一個“底座”。
//鼠標懸浮事件
function onMouseOver(targetObj,viewPoint) {
if (currentModule != null) return; overModule = app.query(targetObj)[0]; overModule.style.boundingBox = true; overModule.moveTo({ "offset": [0, 6, 0], "time": 80, }); sCamera = app.create({ type: "SurveillanceCamera", name: "SurveillanceCamera_", position:app.query(viewPoint)[0].position, fov: 65, aspect: 1.3, far: 6, }); sCamera.angleX = 90; sCamera.style.opacity = 0.1;
}
//鼠標離開事件
function onMouseOut(targetObj) {
if (currentModule != null) return; if (sCamera) { sCamera.destroy(); sCamera = null; } outModule = overModule; outModule.style.boundingBox = false; outModule.stopMoving(); outModule.position = [0, 0, 0]; outModule = null;
}
演示地址:EXAMPLE
總結
利用iframe與ThingJS進行交互完成了平面圖導航功能,通過自制的HTML界面,嵌入ThingJS的面板中,形成一個可自定義的導航界面,通過偏移實現相應的視覺效果。
制作一個視錐,達到投放影像的效果,這里運用面向對象的方式是為了,能夠更快捷的創建視錐,起到復用的作用。
在制作過程中,將物體懸浮的過程時出現了問題,發現如果快速的操作鼠標,物體不會達到預期的視覺效果,例如,鼠標快速的在兩個導航圖之間切換時,對應的兩個物體會不斷的上升,盡管將上升與還原的速度加快,也依然無法解決問題。最后解決的辦法是:新添加一個變量,將上一次懸浮的物體記錄下來,就是文中的 outModule,通過對 outModule 多帶帶操作來解決影響問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100949.html
摘要:接下來我們就用平面導航圖來解決這一問題。第二部分我會給頁加上鼠標懸停事件讓頁的標簽和我們場景中的一起動起來完整代碼加載場景代碼場景地址場景相關面板相關平面圖導航事件相關點擊事件返回事件 前言 利用CampusBuilder來搭建自己的虛擬世界過程有這樣一個問題:如何快速聚焦到虛擬場景的某一位置。當然我們可以創建幾個按鈕對應查找我們需要去的位置(參照物)并聚焦,但是按鈕并不是很炫酷也不能...
摘要:分析代碼如下標簽里包裹一個盒子里包裹兩個,為效果的前后面做準備。分析外觀定位代碼如下效果首先創造環境,保留空間在的時候,我們讓旋轉,正面面對我們的元素向上翻轉,下面有元素翻轉上來,并且在翻轉時有一個凸出來的效果。 效果預覽 showImg(https://segmentfault.com/img/bVqF6k);分析:可以看出hover的時候是有前后兩個面的翻轉,并且有一個凸出效果。 ...
摘要:方向向量與向量的向量積的方向與這兩個向量所在平面垂直,且遵守右手定則。向量解決方案三方案一的問題在于,向量到向量之間的線性插值是直線均勻的,但是不是角度均勻的。 記得幾年前,我的一個同事J需要做一個動畫功能,大概的需求是實現球面上一個點到另外一個點的動畫。當時他遇到了難度,在研究了一個上午無果的情況下,咨詢了我。我就告訴他說,你先嘗試一個簡化的版本,就是實現圓環上一個點到另外一個點的動...
摘要:未點擊的按鈕頂部的亮度略高于底部。我認為扁平化是未來的一種趨勢。這種限制是有好處的,這有助于簡化思想。同樣可以采取更深的一步。頂部的導航條有更多的空間。文字搜索音樂占了整個導航條高度的。 showImg(https://segmentfault.com/img/bVbn06c?w=1000&h=451); 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 簡介 首先...
閱讀 3574·2019-08-30 15:55
閱讀 1373·2019-08-29 16:20
閱讀 3656·2019-08-29 12:42
閱讀 2661·2019-08-26 10:35
閱讀 1010·2019-08-26 10:23
閱讀 3405·2019-08-23 18:32
閱讀 897·2019-08-23 18:32
閱讀 2892·2019-08-23 14:55