元宇宙是什么?
最近”元宇宙“的概念在各种平台上大火起来。
很多人,也包括我在内,一开始并不清楚”元宇宙“是什么,作为一个从未接触过的词汇突然爆火,我相信大部分都和我一样是存在一定的疑问的。我用北京大学陈刚教授、董浩宇博士的话来简单描述一下,那就是:“元宇宙是利用科技手段进行链接与创造的,与现实世界映射与交互的虚拟世界,具备新型社会体系的数字生活空间。”
《头号玩家》的虚拟空间移动
从我的角度来看,我第一反应便是之前看过的一部电影《头号玩家》,电影讲述了一个现实生活中无所寄托、沉迷游戏的大男孩,凭着对虚拟游戏设计者的深入剖析,历经磨难,在虚拟世界中找到隐藏在关卡里的三把钥匙,成功通关游戏 (这部电影我强烈推荐大家去看)。虚拟世界作为一种在小说、电影等等中经常出现的科技,凭借”元宇宙“概念的爆火,可能真的要借此登上现实的舞台了。
《头号玩家》中,主角登录”绿洲“(可以认为是电影中的”元宇宙“的名字)采用的可以简单认为是vr设备。其中的移动方式,是在一个可多方向变化的传送带上,进行“原地踏步”——每往一个方向移动,传送带便反方向移动,就像跑步机一样,虽然体感上完成了向前移动的形式,但是位置却没有发生变化。当时我在观影中就在思考,我们在代码中,经常以什么方式实现移动?
代码中的二维平面移动
我们考虑简单的形式,二维平面上的移动。
假设一个点可以往上下左右四个方向移动,每次移动一个单位距离。为了方便起见,我们先定义平面直角坐标系。设点 a 的位置为(0,0)。则它可以移动到(-1,0),(1,0),(0,-1),(0,1)四个位置,也就是:(c++语言)。

那如果是八方向移动呢?即可以移动到(-1,0),(1,0),(0,-1),(0,1),(-1,1),(1,1),(-1,-1),(1,-1)。我们每次移动需要去考虑八个变量和ifelse?那如果方向更多呢,像《头号玩家》中可以360°无死角移动呢?
显然,这种单一的每次模拟一个方向操作是比较繁琐的,和不够普适的。如何优化?这就需要借助到数组和循环。请看如下操作:

其实简单来说,就是事先把方向移动导致的坐标变化利用数组存储。这样利用一次循环遍历数组内的每个内容就非常的方便的求解出多方向移动后的位置了。相应的,如果方向变得更加多样化,那只需要利用循环和三角函数维护 fx 与 fy 数组即可(如下代码)。这也是在算法竞赛中,特别是搜索和图论方面经常使用的技巧,可以很简单的就处理多方向移动问题。

当然移动方式的处理还有很多种,甚至虚拟世界里应该是三维移动,即还存在高度的概念,当然因为涉及到的东西比较复杂,这边不过多赘述。