https://threejs.org/examples/?q=panorama#webgl_panorama_equirectangular
我想知道如何在最大缩放级别下,将用户转移到另一个全景立方体(具有不同的图像源),并将其映射到该特定立方体部分。因此,我会打开下一个场景,让用户进入旅程的下一阶段。
这几乎就是Google街景在您单击箭头向前移动时所做的。
我没有看到很多相关的例子。我研究了一下,发现可能需要创建两个场景?如果您有任何使其功能正常的想法,我将不胜感激。
https://threejs.org/examples/?q=panorama#webgl_panorama_equirectangular
我想知道如何在最大缩放级别下,将用户转移到另一个全景立方体(具有不同的图像源),并将其映射到该特定立方体部分。因此,我会打开下一个场景,让用户进入旅程的下一阶段。
这几乎就是Google街景在您单击箭头向前移动时所做的。
我没有看到很多相关的例子。我研究了一下,发现可能需要创建两个场景?如果您有任何使其功能正常的想法,我将不胜感激。
检测何时进行过渡:
在给出的示例中,所有鼠标事件都已提供。通过调整相机的fov
属性,在onDocumentMouseWheel
中处理缩放。 "放大"减小fov
,而"缩小"增加fov
。很容易检测到fov
是否已达到最小/最大值,这将触发您转换到新场景的过渡。
检测何处进行过渡:
下一步是确定您将过渡到哪个新场景。您可以执行类似热点的操作,从相机射出光线,看它是否击中了特定位置(例如您 strategically 定位的THREE.Sphere
)。但为简单起见,假设您只有您提到的6个方向,并且仍在使用示例的鼠标控件。
摄像机运动在 onDocumentMouseMove
中通过更新 lat
和 lon
变量(似乎是以度数表示)来处理。(注意:看起来 lon
会无限增长,所以为了清晰起见,最好给它一个重置值,使其只能在0.0-359.99之间。)你可以进行数学计算来更好地检查角落,或者你也可以简单地检查你的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。