外国一位小哥耗时16个月打造的3D版赛车游戏,这两天忽然火了起来。

太强了!外国小哥花16个月用Three.JS打造了一个无缝切地图的3D开车游戏

只需一个浏览器,就能驾车从森林、海滩,“无缝切换”到广袤的沙漠乃至平原。乃至还能够挑选春夏秋冬或者白天黑夜的环境风格。

太强了!外国小哥花16个月用Three.JS打造了一个无缝切地图的3D开车游戏

在不想自己开车的时分,竟然还能够开启自动驾驶形式,感触一波“AI飙车”的快乐。

网友们也是嗨得不行:此情此景怎能少得了经典BGM逮虾户(Deja Vu)

下面咱们来看看它究竟是怎样完成的。

他是怎样完成的!

这个游戏彻底运用Three.js来开发,经大帅测试,这个游戏能够在大部分网页浏览器中运转,乃至在移动端上也有着十分优秀的表现。

此外,开发者还给出了不同级别的烘托设置来保证功用,玩家能够自由挑选适合自己设备的装备。是【含糊粗糙】还是【细节丰厚】,丰俭由君哦~

除了开头说到的随意切换地点、季节和气候以外,这个赛车游戏也能够随意切换各种车型和视角。

太强了!外国小哥花16个月用Three.JS打造了一个无缝切地图的3D开车游戏

那么这个赛车游戏中“恣意变幻”的环境到底是如何生成的?

生成高度图

  • 运用类似于PerlinNoise的算法生成无限平铺的高度图,并加以修改以完成更为传神的山景。
  • 运用Alea这个库来生成伪随机数。www.npmjs.com/package/ale…

规划路途

  • 公路的起点要挑选整个地形国际中不太陡峭,也不能太深的某个当地。将这儿作为路途中线的第一个点。
  • 挑选一个方历来测试周围的高度图用以评估横向和纵向的梯度。
  • 然后,使中线向一个坡度最小的方向移动10米。这个点的信息被写一个双向链表中,每个点位信息都包含坡度,路途宽度,曲率等元数据。
  • 完成一个永无止境的路途,以间隔车辆方位15KM的地平线为界,这是开发过程中耗时最久,让小哥掉了最多头发的一个问题。
  • 运用二次贝塞尔曲线以1m的单位做路线的滑润处理。

太强了!外国小哥花16个月用Three.JS打造了一个无缝切地图的3D开车游戏

地上环境

  • 为了进一步提升功用,靠近路途和远离路途的地块运用了不同网格密度来处理。
  • 路途被烘托为一个简略的矩形网格,由3个高细节块和9个低细节块组成,每个长100m,跟着车辆的前进而循环。

太强了!外国小哥花16个月用Three.JS打造了一个无缝切地图的3D开车游戏

图形

  • 地上纹路选用国际坐标UV,并混合PerlinNoise以改动植被的颜色。
  • 基于坡度混合山崖面纹路和极点位移。
  • 小哥一开始想完成动态暗影贴图,但过于复杂从而抛弃后挑选选用一种更简略的方案,就是在树木的下方应用深色纹路,造成有暗影的视觉假象。
  • 所有树叶都由简略的精灵图和几何体组成,将多种改变存储在一个纹路图中,该纹路运用极点着色器中的噪声采样。

太强了!外国小哥花16个月用Three.JS打造了一个无缝切地图的3D开车游戏

物理系统

  • 每个轮子都单独结合重力,摩擦力和地上法线来独立核算物理上动力学的特性。以此来处理车辆底盘的方位问题。
  • 路途两边的围挡没有真正的选用物理磕碰算法,而是运用间隔检查来处理。
  • 物理特性的核算极端消耗功用,为此小哥去除了树木,指示牌等其他东西物理特性的核算。

优化

  • 通过兼并附近网格的几何图形,十分细致的管理实例化目标从而节约提升烘托效率。
  • 车辆在路途中的进行情况会被不断追寻核算,并根据远景能见度来开释不行见的元素并使其重复运用。
  • 供给一系列和质量有关的设定以满意不同设备上的烘托。

开源了吗?

目前这款游戏还没有开源。不过小哥表示,虽然没有开源整个项目的方案,但后续可能会开源部分子系统,如图形MOD接口等。

太强了!外国小哥花16个月用Three.JS打造了一个无缝切地图的3D开车游戏

关于这款游戏的未来,小哥也立下了几个flag,包含在环境上,开发更多的越野地点、参加更多环境细节,包含修建、动物、植物暗影、灯光效果等;

赛车上,参加更多的赛车皮肤和车辆类型;气候上,细化气候类型(下雨、下雪、刮风等),也进一步改善已有气候的效果;

功用上,将来会参加竞争形式和全球排行榜(包含限时竞速、比拼间隔等),一起对系统进一步进行优化,未来适配手柄、赛车模拟器等。

码上体会

和往期分享的threejs项目相同,这个赛车游戏的本地项目代码大帅也现已备份到AwesomeSites仓库中的pack02里了。

github.com/ezshine/Awe…

虽然不是源码,但依然具有学习和参阅的价值~


  • 我是大帅老猿,微信公众号同名。
  • 加自己微信沟通,个人微信:dashuailaoyuan
  • :觉得有收成请点个赞鼓舞一下!
  • :收藏文章,便利回看哦!
  • :谈论沟通,互相前进!