3

无缝切地图的3D赛车游戏火了,小哥花16个月用JS打造,浏览器免费就能玩

 1 year ago
source link: https://www.qbitai.com/2022/11/39236.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

无缝切地图的3D赛车游戏火了,小哥花16个月用JS打造,浏览器免费就能玩

head.jpg萧箫 2022-11-05 18:35:46 来源:量子位

车外风景无限生成

萧箫 发自 凹非寺

量子位 | 公众号 QbitAI

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

只需一个浏览器,就能驾车从森林、海滩,“无缝切换”到广袤的沙漠甚至平原:

b7049e95329743d1806125cdb9d06787~noop.image?_iz=58558&from=article.pc_detail&x-expires=1668249218&x-signature=3oucz1cqlRh9vLLmNUiME6nG5%2BA%3D

无论春夏秋冬还是白天黑夜,也无论你用的是电动汽车、自行车(?)还是公共汽车:

甚至不想开的时候,还可以开启自动驾驶模式,感受一波“AI飙车”的快乐。

126a0bada7774dabb7053c738a031f68~noop.image?_iz=58558&from=article.pc_detail&x-expires=1668249218&x-signature=4e%2B7BjjbBzC%2FFKkVg01ZGekOVo0%3D

△甚至有“自”行车&自动驾驶小巴

据小哥表示,这个名叫Slow Road的3D赛车游戏没有用到任何传统引擎,而是基于JavaScript编写的,无需登录就能直接在浏览器上运行。

要是电脑发出了吃力的声音,稍微更改一下渲染配置就能搞定。

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

36799203fdec411982eceb31afbdb538~noop.image?_iz=58558&from=article.pc_detail&x-expires=1668249218&x-signature=bjpenAoiaFOfN3BgiEgPOpyGSu8%3D

△作者回复:我写代码时听的是10小时沉浸版

还有网友回忆起了自己几十年前做过的3D赛车游戏,这波属实“爷青回”了:

5e089ccc20c04a4f96d768b47f8f9ac2~noop.image?_iz=58558&from=article.pc_detail&x-expires=1668249218&x-signature=TzSy0kMpEjhFjPO1Jb4TbL9XPq4%3D

来看看它究竟是怎么实现的。

基于Javascript而非传统引擎搭建

与大多数3D赛车游戏采用Unity3D、UE等传统引擎不同,Slow Roads是基于JavaScript编写的。

具体来说,它采用了一个名叫Three.js的开源框架,相当于一个能实现3D效果的JavaScript库,基于原生WebGL运行,可以在大部分网页浏览器中搞定交互式2D/3D图形。

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

347e50c04da847bfb55fa360df1b62c1~noop.image?_iz=58558&from=article.pc_detail&x-expires=1668249218&x-signature=I0%2B7%2Bcsn6XZZsbxPmzdsWl91MGo%3D

此外,考虑到不同电脑对浏览器的适配,这款赛车游戏还给出了不同级别的渲染设置,从“粗糙大色块”到更精细的树木和围栏都能生成。

要是有电脑显卡的话,还可以更改一下浏览器设置,给图形渲染加加速。

所以,这个赛车游戏中“任意变幻”的环境是如何生成的?

首先是生成环境地形

小哥采用了类似柏林噪声(Perlin noise)的自定义算法,来生成环境高度图(Heightmap,用于生成三维地形的图像),随后进行简单修改让山景看起来更逼真。

柏林噪声,Ken Perlin发明的自然噪声生成算法,经常用于在游戏和特效中生成随机内容,包括火焰、云彩、奇形怪状的岩石以及树木和大理石表面等。

09ba2e567d43448c86c70670458adfdb~noop.image?_iz=58558&from=article.pc_detail&x-expires=1668249218&x-signature=suJo0xidkrk6Bg4MxW1N%2BDJySO8%3D

△高度图,图源维基百科

随后是制作赛道

选择地图上一个不太陡峭/凹陷的地方作为起点后,选择一个方向并测量周围高度图,以坡度最缓的路线作为道路中线,并给每个点注释上元数据,包括道路宽度、曲率等。

值得注意的是,如果赛道铺到一半出现“打结”的情况,也就是铺到一半撞到了一起,一定要想办法解决。这也是道路铺设最难的地方之一:

f589960292304f5c9ae5b1f3538eb184~noop.image?_iz=58558&from=article.pc_detail&x-expires=1668249218&x-signature=lDJWGBlFvBLFBzjVzJzSvX3gySw%3D

△车在岛上狂转

接下来就是渲染环境了。

从图中来看,整体环境被分成了很多个分辨率10m的大型网格,最大视距1km²;靠近道路时,每个网格又会被分成5×5的较小网格。

越接近道路中线,渲染越精细,最终道路高度和底层环境高度之间会进行插值,尽量让它保持“无缝衔接”。

当然小哥表示,这种衔接并不是“真·无缝”的,但通常看不出来。

9db796edc66f4630a38563d78e3b4afa~noop.image?_iz=58558&from=article.pc_detail&x-expires=1668249218&x-signature=lEXv0i4l04kN%2BIZHjAeIGPIXV6E%3D

最后就是整个环境的渲染了,这里面也有一些小细节:

包括地面和悬崖纹理、基于柏林噪音做草色变化,以及给树木等植被加上简单阴影、在湖泊周围渲染更多树等。

14beaa793704496faa6459b5c5ee81d8~noop.image?_iz=58558&from=article.pc_detail&x-expires=1668249218&x-signature=FLHVt%2FJPCIScmfXP384RE8EHSSA%3D

除了环境之外,就是一些基础物理学的配置了,包括重力、表面摩擦力和动力学计算等。

不过为了节省性能,小哥忽略了提示牌和树木的碰撞。

此外,他也采用了更“平和”的电动汽车作为核心赛车手,因为这样一来就不需要考虑齿轮或RPM等部件,而音频和物理特性也更容易编写了。(小哥称:内燃机正逐渐过时!)

当然,随着这款游戏的关注度上升,他表示后续还会进行更多优化。

未来支持手柄和汽车模拟器

随着人们对这款游戏的好奇度提升,小哥也着重解答了几个热点问题。

例如,采用JavaScript编写游戏的原因,是因为小哥想改变人们对浏览器的“刻板印象”,它可以做到比查资料更广泛的事情,甚至还能更好地对游戏性能进行优化。

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

594d90cbe3a04f86adb7825c61b17db2~noop.image?_iz=58558&from=article.pc_detail&x-expires=1668249218&x-signature=D%2B7uySW5L9IULJso1fqucotYIvc%3D

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

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

功能上,将来会加入竞争模式和全球排行榜(包括限时竞速、比拼距离等),同时对系统进一步进行优化,未来适配手柄、赛车模拟器等。

你做好上班摸鱼的准备了吗?(手动狗头)

玩耍地址:
https://slowroads.io/

参考链接:
[1]https://twitter.com/anslogen
[2]https://news.ycombinator.com/item?id=33305234
[3]https://anslo.medium.com/slow-roads-tl-dr-a664ac6bce40
[4]10小时版逮虾户:https://www.youtube.com/watch?v=9ILQNSgE7mw

版权所有,未经授权不得以任何形式转载及使用,违者必究。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK