使用ThreeJS制作门户

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ThreeJS制作门户相关的知识,希望对你有一定的参考价值。

我试图用ThreeJS制作门户网站。我发现这个页面Mini-Portals解释了如何使用OpenGL制作门户。所以我试图在TJS中复制门户视图功能。现在这是我的结果:

Left is normal camera, right is the portalviewfunction

左侧门户(右侧摄像头)是普通摄像头,右侧门户(左侧摄像头)是从教程中获取的视图矩阵。正如您所看到的,右侧的门户视图非常奇怪。

这里的主要问题是图像的缩放是完全错误的,并且我在门户中看到图像的角度是错误的。目前它的平面和显示我指向相机的地方,但我想要的是缩放正确的门户(门户网站上的图像与世界本身相同)并且在门户网站中看到的内容取决于我观看的角度。

我做错了什么,我该怎么做才能解决它?

答案

有一阵子了。但我找到了一种方法来做我需要的。第四个参数不需要。基本上我发送相机,我的2个门户对象(网格)到我的功能。而不是使用矩阵乘法方式(在ThreeJS中不起作用,因为ThreeJS用它做了一些奇怪的东西)我将矩阵分成几部分。然后手动计算新位置和旋转并从中构造新矩阵。我将这个新矩阵设置为我的相机worldMatrix。 Voila是一个工作门户网站。下一步是斜视图fusrum,因为我们希望我们的近平面成为门户,否则我们可以在摄像机和门户之间有一些对象。

渲染过程本身使用模板缓冲区来正确渲染门户。如果有人需要,这将有助于你:https://th0mas.nl/2013/05/19/rendering-recursive-portals-with-opengl/

function portal_view(camera, src_portal, dst_portal, kordaja) {
                src_portal.updateMatrixWorld()
                dst_portal.updateMatrixWorld()
                camera.updateMatrixWorld()

                var camerapos = new THREE.Vector3();
                var camerarot = new THREE.Quaternion();
                var camerascale = new THREE.Vector3();
                camera.matrix.decompose(camerapos,camerarot,camerascale);

                var srcpos = new THREE.Vector3();
                var srcquat = new THREE.Quaternion();
                var srcscale = new THREE.Vector3();
                src_portal.matrix.decompose(srcpos, srcquat, srcscale);

                var destquat = new THREE.Quaternion();
                var destpos = new THREE.Vector3();
                var destscale = new THREE.Vector3();
                dst_portal.matrix.decompose(destpos,destquat,destscale);

                var diff = camerapos.clone().sub(srcpos);

                var ydiff = src_portal.rotation.y - dst_portal.rotation.y - Math.PI;
                diff.applyAxisAngle(new THREE.Vector3(0,1,0),-ydiff);
                var newcampos = diff.add(destpos);
                var yrotvec = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0,1,0),-ydiff);
                console.log(yrotvec)
                srcquat = srcquat.multiply(destquat.inverse());

                camerarot = camerarot.multiply(yrotvec);

                var inverse_view_to_source = new THREE.Matrix4();
                inverse_view_to_source.compose(newcampos,camerarot,camerascale);

                return inverse_view_to_source;
            }

注意:我将答案移到了答案上,所以我可以标记答案。

另一答案

对于想要一个具有Three.js的伟大Portal系统的人:https://github.com/markotaht/Portals

以上是关于使用ThreeJS制作门户的主要内容,如果未能解决你的问题,请参考以下文章

解决方案ThreeJS制作3D机房

用threejs制作一款简单的赛车游戏

ThreeJs 实例教学 -- 3D全景

使用JSONLoader在threejs上导入3d对象

H5 实例教学 -- 3D 全景( ThreeJs 全景 Demo )

ThreeJS四步制作一个简易魔方