當檢測到過渡:
在給出的示例中,鼠標事件都給出。通過調整相機的fov
屬性在onDocumentMouseWheel
中處理縮放。 「放大」縮小了fov
,「縮小」增加了它。檢測fov
何時達到最小/最大值,這將觸發您轉換到新場景,這將是微不足道的。
檢測符合轉型:
下一個步驟是確定成新的場景,你會轉型。你可以做一些類似熱點的事情,從相機拍攝光線,看它是否碰到某個特定的地方(例如,你有戰略定位的THREE.Sphere
)。但是爲了簡單起見,我們假設你只有6個方向,並且仍然使用示例的鼠標控件。
通過更新lat
和lon
變量(顯示爲度數)來處理攝像機移動onDocumentMouseMove
。 (注:看起來lon
增加無界限,所以爲了清晰起見,它可能是一個很好的給它一個復位值,所以它只能在0.0-359.99之間)你可以讓所有的數學-y檢查角落更好的,或者你可以簡單地檢查你45級的:
if(lat > 45){
// you're looking up
}
else if(lat < -45){
// you're looking down
}
else{
// you're looking at a side, check "lon" instead
}
你的樣子方向決定到現場,你會轉型,你應該遇到你的最大變焦。
過渡
有很多方法可以做到這一點。您可以簡單地替換構成全景的立方體上的紋理。你可以換一個完全不同的THREE.Scene
。您可以重置相機 - 或不。在轉換髮生時,您可以使用調光輸出/輸入的燈光。您可以應用一些後期處理來模糊過渡效果。這部分是全部的風格,完全取決於你。
尋址@ Marquizzo的關注:
照明僅僅是一個過渡的建議。該示例不使用光源,因爲材料是MeshBasicMaterial
(不需要照明)。該示例也不使用scene.background
,但將紋理應用於倒置的球體。如果你不能影響紋理的「亮度」(比如CSS轉換),還可以使用其他方法。
我在示例中添加了以下代碼,使其淡入淡出,就如同一個例子。
// These are in the global scope, defined just before the call to init();
// I moved "mesh" to the global scope to access its material during the animation loop.
var mesh = null,
colorChange = -0.01;
// This code is inside the "update" function, just before the call to renderer.render(...);
// It causes the color of the material to vary between white/black, giving the fading effect.
mesh.material.color.addScalar(colorChange);
if(mesh.material.color.r + colorChange < 0 || mesh.material.color.r + colorChange > 1){ // not going full epsilon checking for an example...
colorChange = -colorChange;
}
人們甚至可能會影響材料的不透明度值,使一個球體消失,另一個球體消失。
我的主要觀點是,可以通過各種方式完成轉換,並且由@Vad決定使用哪種效果。
我發現了一個沒有回答的重複:https://stackoverflow.com/questions/27566155/transitions-between-panoramas-in-three-js?rq=1 – Vad
谷歌地圖實際上有一個3D世界的代表。這不僅僅是全景圖。它使用該3D數據將全景圖的各個部分映射到簡化(低多邊形)模型,使用該3D模型滑動相機,交叉淡入淡出到新的全景。如果沒有3D數據,你將無法進行有效回收 – gman
一種方法是使用簡單的3D世界,例如gman說。在這種情況下,你可以走在任何箭頭。換句話說,如果你想要全景方法,你需要以某種方式準備好3D視頻。全景使用紋理,您需要記錄所有相機移動的位置,以便在您的應用程序中進行導航。使用兩個開關幾何(在你的情況下的立方體)一個總是當前和秒是未來(視頻紋理)。使用不透明度淡入淡出效果。在箭頭鍵盤上,只需加載當前全景視頻紋理的下一個序列。僅在運動線的開始或結束時啓用箭頭。 –