このタイトル、すでに分からない人の方が多そうだな。
急に思い出話。
まだ僕が大学1年生だったころのこと。
PCルームがあって、放課後は入り浸っていた。
その場にいる人の多くは、僕も所属していたコンピューターサークルのメンバー。
でも、そうではない常連の人もいて、学科もサークルも違うのに知人、という人もいた。
そのうちの一人…同じく1年生で、簡単なプログラムは組めるが本格的なゲームなどは作れない、というくらいの知人が、ゲームによくある、ジャンプの動きを作ろうと頑張っていた。
その知人は「ジャンプは放物線なのだから」と、何かの二乗を使って書こうとしてたんだ。
(二乗のグラフとして描かれる線を、放物線と呼ぶ)
でも、そうじゃない。ゲームならジャンプは次のように書く。
(当時は BASIC を使っていたので、BASIC 風に)
10 X=X+1
20 IF INKEY$=" " THEN JUMP=1:Y1=-5
30 IF JUMP=1 THEN Y=Y+Y1:Y1=Y1+1
40 IF Y1>5 THEN JUMP=0
50 PUT SPRITE 0,(X,Y),8,0
60 GOTO 10
このプログラムはサンプルなので、初期設定を省いているので、雰囲気で読んで欲しい。
ともかく、こんな感じのプログラムを作って、こうやるんだよ、と見せてあげた。
そうしたら、返ってきた反応は、「なんかずるい」だったんだ。
動きを見ると放物線っぽく見えるけど、プログラム中には二乗どころか、掛け算もない。
それは放物線ではない、というのだ。
いや、別にずるくないよ、と言い返したが、その時の自分には「ずる」ではないという明確な根拠を示せなかった。
今なら明確に示せる。
これは、放物線の式に対し、一階微分した導関数を導き出し、その導関数を再び積分することで放物線を再構築しているんだ。
なぜ微分するかというと、ゲームは時間によって微分された世界で動いているから。
テレビ画面は、連続した「時間」を、1/60 秒ごとに区切って表示する。
このわずかな時間の動きは、時間で微分されている、ということになる。
そして、その微分したものを積み重ねていく。
テレビで言えば、一連の「コマ」を連続させて動かすことが、積分にあたる。
…厳密にいえば、微分ではなく差分だし、積分ではなく積算なのだけど。
これを言い出すと離散数学というややこしい数学の話になるので、今は微分積分という呼び名で話を進める。
僕のプログラムを見た知人は、「プログラム中に二乗がないので、放物線ではない」と言った。
しかし、プログラム上は微分したことで二乗が消えている。
そして、プログラムを動かすと時間変化によって積分され、正しい放物線が描かれる。
これを「ずる」だというのは、微分積分を理解していない残念な人間だというのを、自ら明かしたに過ぎない。
(もっとも、すぐに言い返せなかった自分も、その時には十分理解できていなかったわけだけど)
本当に足し算だけで二乗になるのか、まだ疑う人がいるかもしれないので、わかりやすい例を挙げよう。
まずは、単純なルールで作りだせる、次の数値の表を示そう。
0 | 1 | 4 | 9 | 16 | 25 | 36 | 49 | 64 | 81 |
1 | 3 | 5 | 7 | 9 | 11 | 13 | 15 | 17 | 19 |
この表のルールはこうだ。
・上に書かれた数値は、その左側の列の上下の数値を足したもの。
・下に書かれた数値は、その左側の列の下の数値に、2を足したもの。
足し算しか使っていない、非常に単純なルールだ。
おかしいところがないか検算してもらってもよい。
ここで、上の数値は、もう一つの意味を持つ。
0,1,2…と続く数値の「二乗」になっているのだ。
日本人なら 9*9=81 まではわかるだろうから、上の表は 81 で止めてある。
でも、もっと長く続けても大丈夫。これも試してもらってよい。
「ずる」と言われたのが悔しくて、根拠を考えていたら、数日後にはこの答えに行きついた。
でも、サークルも違うし学科も違ったので会う機会はそれほどなく、言い返すタイミングは永久に失われた。
それを思い出して急にここに書いたのは、ネットで「微分積分なんて実生活でどう役に立つのか」なんていう…まぁ、よくありがちな学生の愚痴を見たから。
微分積分、生活で超役立つ。
上に書いたように、テレビゲームは微分積分の世界の中にある。
そもそもテレビが微分積分の世界だし、デジタルテレビなんかフーリエ変換(微分積分の親玉みたいなやつ)を駆使して作られている。
ただし、役立てられるかどうかは、自分次第。
ゲームやテレビの中に微分積分が駆使されている、なんていうのは知らない人は全く気付かない世界だ。
それでも生活はできるのだから、知らずに生活している限りは、高校で習った微分積分は「役立てられていない」。
役に立たないのではなく、役立てられないのだ。
なんでかといえば、勉強が浅かったから。「どうせ役立たない」なんて思ってるから。
世界最初のコンピューター、と呼ばれる ENIAC は、実のところ「ひたすら足し算する機械」にすぎない。
それでも、数学的に正しい…どころか、空気抵抗なども考慮した「弾道計算」ができた。
先に書いたように、足し算だけで数学的に正しい放物線は求まる。
しかし、それは空気抵抗や風などがない理想状態での弾道にすぎない。
ENIAC では時間で「微分」した方程式を使い、繰り返し計算して「積分」することで、弾の速度の関数となる空気抵抗や、風の影響なども考慮に入れ、物理現象としての「弾道」を描き出すことができた。
空気抵抗が弾の速度の関数になる、なんていうのは、瞬間ごとの速度を見ながら抵抗を導き、それによって速度を調整する、というのを繰り返しながら積分する方法でないと計算できない。
そうした計算が複雑すぎて人の手に負えないから、ENIAC を建造したわけだけど。
ともかく、ここで重要なのは、どんなに複雑な数式であっても、微分を繰り返せばただの足し算になるということだ。
そして、足し算をひたすら繰り返せば、元の複雑な数式の答えを導き出せる。
(ここでいう答えとは数値演算であり、式の変形ではない)
ENIAC は弾道計算よりももっと複雑な、水爆の内部圧力の計算なども行っている。
使われた計算は全部足し算のみだ。それが微分積分の威力だ。
今回、この話を書こうと思ってネットを調べていたら、以下のようなことを書いている人がいた。
(一連のツイートだが、特定人物を批判したいわけではないため、検索されないよう文面は変えている。)
・ファミコンで三角関数を使うと遅くなるので、スーパーマリオのジャンプは掛け算だけで作られている。
・掛け算だけなので本当は放物線ではないのだが、ゲームを作るうえでのうまいごまかし方だと言える
…まぁ、プログラマーでない人がうろ覚えの知識を披露しただけだと思う。
しかし、どこから突っ込んでよいかわからないほど違っている。
まず、ジャンプを表現する放物線に、三角関数は必要ない。掛け算だけでよい。
そして、ファミコンは掛け算すら遅いので、足し算だけで作られている。
さらにいえば、先に書いたように足し算だけで書いてもごまかしではなく、数学的に正しい放物線が描ける。
ただ、スーパーマリオのジャンプは、放物線ですらない。
放物線にすると、操作が難しくてゲームにならないから。
それでも放物線っぽく感じられるようにしている。
これが「うまいごまかし方」だというのは同意だが、計算できなかったからではなく、ゲームを面白くするためだ。
背景が全く違う。
同じテーマの日記(最近の一覧)
関連ページ
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |