Three.js无限3D时空穿梭特效

news/2024/10/18 7:57:49/

可能每个人的童年都有个时空穿梭梦,印象深刻的是第一次看《机器猫》,主角康夫卧室的抽屉就是时空隧道的入口,跳进隧道的那一刻,时间浮光掠影般从身边流过,仿佛进入了异世界。

这次我们用three.js实现一个3d隧道穿梭效果,打开异世界的大门。 它也可以是一个跑酷游戏原型,又或者是3D空间导航,具体怎么应用由你来决定,先来看下效果。

无限循环时空隧道

 

 

无限循环的隧道实际上是一个首尾无缝相连的管道,你可以将它的形状想象成一个甜甜圈。我们只要将摄像机放置在这个管道内部,并沿着管道路径运动就能实现这种穿越效果。

实现无限循环隧道

首先要实现这样一个管道我们可以借助three.js中TubeGeometry对象,TubeGeometry能够沿着一条3D曲线创建管道。我们要做的是先创建一条曲线,曲线是用坐标函数建立的,我们先拿TubeGeometry的官方示例试一下。

CustomSinCurve.prototype.getPoint = function ( t ) {var tx = t * 3 - 1.5var ty = Math.sin( 2 * Math.PI * t )var tz = 0return new THREE.Vector3( tx, ty, tz ).multiplyScalar( this.scale )
}

官方示例的getPoint函数绘制了一个烟斗状的曲线管道,看起来平淡无奇,别着急我们来逐步完善。

用官方示例绘制出的漏斗状曲线
用官方示例绘制出的漏斗状曲线

 

 

改变下getPonit函数中的公式,我们马上得到了一个封闭的圆环管道。

CustomSinCurve.prototype.getPoint = function (t) {const tx = Math.cos(2 * Math.PI * t)const ty = Math.sin(2 * Math.PI * t)const tz = 0return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale)
}

 

标题封闭圆环隧道

 

为了让路径有更多变化,我们在z轴上也应用正弦函数,生成起伏状的圆环模型。

const tz = 0.1 * Math.sin(8 * Math.PI * t)
波浪状圆环隧道

 

为隧道添加材质

贴图是这个效果的灵魂,准备一张1024×1024尺寸的材质贴图,它会重复地显示在管道模型表面,注意贴图中明暗交替的线条,这是实现背景光线效果的关键。

 

隧道的材质贴图

 

设置材质的贴图方式和重复次数,使材质沿曲线方向重复延展,我们得到了一个贴好图的隧道模型。

material.map.wrapS = THREE.RepeatWrapping
material.map.wrapT= THREE.RepeatWrapping
material.map.repeat.set(10, 1)
贴图后的隧道

 

设置摄像机路径

要实现穿越效果,我们要将摄像机放在模型内部,并沿着隧道路径运动。官方的案例中也有一个相机沿曲线运动的例子,但经过试验效果并不理想,所以这里使用另外一种方法,这种方法考虑了隧道路径的法向量,使转弯处过渡效果更加自然。由于代码较长,就不贴在这里了,具体可以参考本篇教程的源文件。

沿路径添加物体

为了在隧道路径上添加物体,先要在管道路径上通过getPointAt方法上获得坐标点,然后将物体设置在坐标点处,这里的物体是一个个透明贴图的平面对象。

for(let i = 0; i < 20; i++) {const plane = mesh.clone()const pos = this.tubeGeometry.parameters.path.getPointAt(i * 0.04)plane.position.copy(pos)this.scene.add(plane)
}

最后,将这些平面对象旋转朝向摄像机,可以通过设置四元数属性和相机相同轻松搞定。四元数是3D空间旋转常用的数学方法,可以避免使用矩阵旋转时产生的万向锁问题,由于它数学原理比较复杂,这里就不做介绍了,有兴趣可以找相关资料学习。

this.planes.forEach(plane => {plane.quaternion.copy(this.camera.quaternion)
})

总结

我们已经掌握了如何使相机沿着自定义曲线运动,并实现了一个炫酷的空间隧道效果。接下来请发挥你的想象,做出更有趣的应用。

这里是一些建议:可以用three.js的postprocessing加入后期效果,使它更有科技感;可以加入鼠标交互,使摄像机根据鼠标滚轮向前移动;可以和cannon.js物理库结合,加入碰撞检测等等。

 

教程源文件:

https://github.com/imokya/threejs-tunnel-effect

 

原文地址:

https://dev.xingway.com/threejs-infinite-tunnel/

 

关注


http://www.ppmy.cn/news/662890.html

相关文章

java学习笔记: 基础知识: day11  对象也可以比较大小、集合、List集合、常见的数据结构、集合的工具类Collections

day11 java学习笔记: 基础知识: day11 对象也可以比较大小、集合、List集合、常见的数据结构、集合的工具类Collections 一、对象也可以比较大小 如果想比较两个对象的大小&#xff0c;可以通过实现Comparable接口&#xff0c;重写compareTo方法。 接口&#xff0c;比较器&…

python爬虫爬取豆瓣电影为啥内容有缺失-Python爬虫之抓取豆瓣影评数据

----------写excel开始---------- ----------获取第1个影评开始----------标题: 《权力的游戏》S5E8:凛冬已至,凡人皆死 作者: 地瓜 影片: 权力的游戏 第五季 影评: 本篇多剧透、多推测、少评论 看过这一集的人,一定会被画风的急转直下惊得目瞪口呆。习惯了HBO《权…

日本研发iPS细胞治疗新冠

据京都新闻报道&#xff0c;日本京都大学医疗创新企业Rebirthel和日本藤田医科大学宣布&#xff0c;将共同开发利用诱导性多能干细胞&#xff08;iPS细胞&#xff09;技术治疗新冠病毒感染。 该疗法是诱导iPS细胞分化为NKT细胞(Natural killer T cell)&#xff0c;以攻击感染了…

日本首次利用iPS视细胞治疗视网膜色素变性

推荐阅读&#xff1a; 1.2020年ips细胞治疗糖尿病研究进展综述 2.iPS细胞重编程实验相关实验材料 10月16日&#xff0c;日本神户市立神户眼科中心医院宣布&#xff0c;利用他人的iPS细胞制作出了在眼中感受光线的视细胞&#xff0c;并首次移植到了疑难眼病“视网膜色素变性”的…

RAM原理与分类

目录 01、ROM 02、非易失性RAM 2.1原理 2.2发展 2.3 摩尔定律 03、易失性RAM 3.1原理 3.2发展 3.3总结 04、总结 储器类型有很多&#xff0c;常见的有ROM&#xff08;Read-onlymemory只读的&#xff09;&#xff0c;RAM&#xff08;Random-accessmemory可读可写的&am…

计算机百科丨芯片发展历经五次变革,下一个十年属于 AI

2019 年 11 月&#xff0c;在中国香港市郊的一所大学校园里&#xff0c;一群工程师正在设计特别的电脑芯片&#xff0c;他们希望这些芯片可以被用于下一代中国制造的智能手机之中。 他们设计的是光通信芯片&#xff0c;利用光而不是电信号来传输信息&#xff0c;这是 5G 手机和…

cdc工具 postgresql_使用 Debezium、Postgres 和 Kafka 更改数据捕获体系结构

相关的配置文件在 GitHub 存储库中可用在 Azure 上设置 PostgreSQL 和 Kafka 本节将提供有关如何为 PostgreSQL 配置 Azure 事件中心和 Azure DB 的指针。所有你需要的是一个微软 Azure帐户 –继续前进&#xff0c; 并注册一个免费的&#xff01; 邮政的 Azure DB PostgreSQL 的…

创建型设计模模式---建造者模式

设计模式 序号内容链接地址1设计模式七大原则https://blog.csdn.net/qq_39668819/article/details/1153906152创建型设计模式–工厂模式https://blog.csdn.net/qq_39668819/article/details/1153759283创建型设计模式–抽象工厂模式https://blog.csdn.net/qq_39668819/article…