首页 > Mathematica > 【调教向】Mathematica第一人称视角模拟

【调教向】Mathematica第一人称视角模拟

2014年6月29日 发表评论 阅读评论
预警:多gif,流量党慎入!!

此文起源于前几天脑海中闪过的一个无聊的念头,然后昨天下午实验室开完组会,晚上在办公室无所事事就拿来“调教”了一下。。

是这样的,之前有一天忘了在哪看到一个中二的外国人做的超人视频,比较好玩之处在于它是超人第一视角的【传送门】,脑洞一开,就在想像我这种运动渣要怎么体验跑酷运动者的那种酷爽的视角感受呢?再然后。。想到Mathematica或者Matlab画3D图都可以设置视角相关参数,然后就。。。花了个晚上,磨出这么个没什么用的东西来玩玩。。【所以还是再说一句,此文还是没什么营养,我觉得这句话是我用的最多的“免责声明”

对于我,Matlab和Mathematica中首选必然Mathematica啦;

要模仿这个东西首先我们需要设计地形,啊啊啊啊地形什么的最烦了,我们就用长方体来代替高楼好了,然后模拟跑酷者在高楼之间跑动。。。

Mma设置3D视角有很多参数,但是我们只用两个:ViewVectorViewAngle

前者可以指定两个点,表示视角是站在A点往B点方向看过去;

后者是模拟相机的半角,可以直接理解成视角大小,效果上等价于缩放;因为我们绘图的窗口是恒定大小的,现在看的位置和方向也指定好了,那么这个角度越小,说明显示在绘图窗口的东西只是在3D世界中很小的一点,但是这一点却要放满整个窗口(我们的眼睛),换言之我们可以看到更多细节,也就是放大效果;【其实这个跟我们想模拟的没什么关联,毕竟跑酷运动员眼睛是不可能任意改变视野角度的是吧,但是Mma比较烦一点就是,你不设置这个,它就自己“自适应”地变化,无奈之下只好手动把这个参数定死】

所以先写个创建矩形的函数,我们需要设置位置,大小,颜色,旋转角度之类的,然后为了表明视角什么的,我们还是写几个画箭头的函数什么的以备之后用吧:
2

然后设置一下矩形的尺寸参数就可以构建出一群立方体来了:
31

说明一下,上边代码中的playerH设置成5,本来想表示运动员身高的,但是设置一米多的话,由于上面说的那个视野角度也适用于上下方向,结果就是你可以透过长方体看到内部,没办法就把它设大一点。。

结果如下:
1403962649941

形状啊高度啊比例啊什么的就别在意了。。。如果觉得高低起伏很(bù)魔(kē)法(xuè),那就假设运动运可以轻轻松松一蹦几百米好了,如果还觉得不合理,作为一个严谨的搬砖工,我必须说服你!!请跟我想象,运动员起跳,接着。。。马上左脚蹬右脚。。。。再然后。。马上右脚蹬左脚,左脚蹬右脚,右脚蹬左脚。。不断上升。。。牛顿哭晕在厕所系列

接下来我们想要模拟人在上面跑动,就需要计算出运动曲线,在顶层跑自然是水平前进,但是跨楼之间走的是抛物线【理论上】,本来应该好好计算这条抛物线什么的,但是时间有限,不想搞那么复杂,就随便三点定一条抛物线好了,首先,我们需要获得起跳的起点和终点的位置,就是当前楼最前方和下一栋楼的最后方坐标:
4

然后算出抛物线来,为了多(néng)样(tōu)性(lǎn),我这里就简单设置两楼之间中点为最高点,高度根据是低往高跳还是高往低跳有极其细微的区别:
5

然后就可以获得这些点了【直线上匀速】:
6

路径画出来大概是这个样子的:
7

然后就可以模拟沿着这条路线前进了,由于gif图太大,所以我就画少几栋建筑演示一下【帧率没调对别在意~】:
pingshi

对应代码


上图中有一点比较不自然,就是视线一直平视前方;

据我说知,世界上有两种人会无缘无故摔跤,第一种人就是走路不看地的,另一种人现在大部分在巴西。

人跑步的视线是怎么样的呢?没想明白,然后就找实验室的小伙伴们参谋了一下,最后没得出什么结论,想想觉得还是省事点好,水平跑的时候目视前方,跳的时候看着落点【下图蓝箭头所示】;

于是乎就变成下面这个状况了:
dongtaishijiao

对应代码


其实我还是觉得不自然,因为在落地瞬间前后,你的视线角度是一个突变的过程,前一瞬间你还盯着地面看下一瞬间马上看着前方;

据我所知电影里面主角和反派发生房顶追逐战,反派一般有两种死法,一种死于话多,另一种就是跨楼的时候朝着边缘跳而不是朝着下一栋楼的中间跳。。

所以我就给所有视角的变换增加了个缓和过程,下图其实看不出来什么。。。
huanbian

对应代码


好像合理很多了,但是还是觉得和现实有些出入,想了想,终于想到了,人跑步的时候身体怎么可能不抖动呢?

据我所知,下半身运动时脑袋可以保持不动的生物有两种,一种是鸡,另一种是男人。。。【据说某霍姓物理学家表示他正好相反!】

所以图又被我改成这个样子了:
zaosheng

对应代码

虽然和我想要的还差很远,但是我发现了一件事。。。。。。很重要的事。。。。那就是。。。。我该回宿舍了。。。所以这事就此打住吧。。【标准结局】


之前在微博看到有外国人用processing做了很多简洁的动画来证明“数学之美”,其中看了这幅图【图太大了,不敢往自己主机传。。】:
【调教向】Mathematica第一人称视角模拟

看了之后觉得很好玩,当即用Mathematica也玩了一份,代码也是很简洁:

12

结果如下:
aa

然后突然想到,如果在跑步过程中遇到这个东西,那个视觉效果会怎么样?【其实不咋滴】

所以花了点时间做了一段长的,但是由于做成gif的话实在太大了,所以就录成录像好了:

不过必须牢骚一下,你说B站那些Up要战渣浪渣库就算了,我只是想随便写篇短一点的博客,尼马很优酷整整逗了N个回合终于搞出高清的来了【其实我是忘了编码和码率要怎么设置了。。】

以上


虽然我一开始觉得调教第一视角会挺好玩的,但是写了半天发现还是很没劲,博客写了半天发现还是吐槽好玩~算了,这个东西就玩到这里吧~

不过有种冲动拿Mathematica那些交互控件,比如LocatorPane这个定位器面板之类的,还有ClickPane这些,去做一个超级简易版本的Mathematica第一人称3D射击游戏!!我大概又想多了。。

先让我构思构思。。。待到明年春暖花开日月同辉祖国统一世界和平之时我再来填坑。。

别在意,我就是这么无聊。。

东西在Github,有需自取;

收工睡觉!


【完】

本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com

分类: Mathematica 标签:
  • Yu

    额。。。脑洞有点大...

    • 这种东西既不耗时间,又能水博文,还能开发脑洞,实乃休闲娱乐必备品。。

      • Yu

        好吧...最近私下在做的一下子拿不出手,为实验室写的又没法拿出来...唉...此外,你的留言板真的没问题么?是我这儿网坏了么....

        • 我不怎么写光子学的东西一方面是别人不愿意看,一方面实验室项目偏军工向。。已修复。。莫名其妙的,原文里面有一段html的注释,结果“-->”这个东西两横变成乱码,然后就把整个页面注释了。。。

  • 各种意义上给跪

    • 各种意义不知道你为什么跪?这种东西就是搞笑的。。

      • 各种意义上也包括脑洞大到一定境界

  • yuki

    23333,你到底拿Mma当什么啊,好好拿来工作好不好!

    • 亲儿子呀!平时没事就想起来的是亲儿子,要工作了才想起来的那是充话费送的!

  • 看旋转看的眼睛都花了。、

  • 最后竟然来了个超人飞翔……我还以为会跳到金字塔的最下层乱转 O_o||

    • 我把金自然当固体。。算了,脑洞作品,别纠结。。

      • 呜,我要补数学……

        • 我最近也要再恶补算法了。。。话说你博客还活着的么?

          • 换了个 blank 子域名,最近整个人都好消沉……目标丧失,意志丧失 Orz

            • 整句话都是满满的负能量。。。。

  • 行啊,够有研究的心态呀,继续努力

  • 我写过一个第一人称视角的迷宫,不过当时用的那个生成迷宫的算法实在是太糟糕了……

    • 哈哈,真巧,我在想模拟这个的时候也想到走迷宫,还想加一些机关啊或者子弹之类的,后来也是觉得迷宫太难所以没弄。。

    • 找了一下您那个代码,好玩!!比我这个有趣多了!!

  • 菊苣一直是脑洞大开=w=

    • 应该说偶尔。。真的。。绝对不是“一直”!!绝对!!!!。。。。。。。。大概吧。。

  • 为何这么叼,脑洞无尽大?

    • 所以我要给这篇东西的tag加个“脑洞”?

  • 这都是些什么东西=、= (明明很认真的看了

  • 看着 都很牛逼

  • Qa

    标题看成minecarft。。。

  • 大神的每一篇博文都如此牛逼啊

  • 看着就是有点强大的数据流?

  • “据我说知,世界上有两种人会无缘无故摔跤,第一种人就是走路不看地的,另一种人现在大部分在巴西。”这是什么梗?

  • 默默的关注了