スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。
ゴンザレスからゲームクリエイターへの挑戦状
いよいよ3D
迷宮に
潜入したスクラッチキャット。あたりは
暗くなるように
実装したから、
暗闇に
隠れながら
奥に
進むことができる。でも、あれ?
遠くを
見ようとすると
空間がゆがんで、しっかり
距離感を
把握できなくなってしまった!それに、
壁がトゲトゲだから
顔に
刺さって
痛いwこれはなんとかしないとね!
今回の目標「ゆがみを補正してズームアウトも可能にする」
プレイヤーの
角度や
視野角、それに
距離などの
要素がからみあって、ズームアウトしても
空間がゆがんで
見えてしまったり、
壁がやたらギザギザに
見えてしまったり、
細かい
問題がまだまだ
残っている。
BEFORE
現状だと、
視野角を120にするとこんな
感じに
周辺がゆがんでみえる。
AFTER
↓
補正後は
周辺もまっすぐ
見える。
↓さらに、ズームアウトもできるから
遠くや
近くを
見るといった
演出も
可能になるぞ。
実装目標としては
以下の
通り!
- 壁のトゲトゲをスムーズにする
- 見た目に関する処理をプレイヤーを起点にまとめて、管理しやすくする
- ズームしても空間がゆがまないようにする
おっけぃ!
ok-scratch
u003cpu003e今回はこういった見た目のクオリティを洗練させることで、より美しい3D空間を実現していこう!またまた三角関数や逆三角関数なんていうブロックも使っていくけど、難しい計算はスクラッチがやってくれるから安心してね!u003c/pu003e
トゲトゲを滑らかにする
スプライト「レイキャスター」を
開く。
定義「_シングル・レイ」の
歩数を
変更しよう。
こうすると
壁がますますケバケバというかトゲトゲになる。
こっちの
歩数も
変える。
うん、ちょっとマシになったね。
とりあえず
今の
段階ではこのくらいでOKだ!
今回のチュートリアルでは、この
トゲトゲみたいに見た目のクオリティを洗練させていくぞ。
視点をプレイヤーで一元管理する
今は
色々実験しながら
作ってきたので、プレイヤーとレイキャスターで
処理が
入り
乱れている
状態なんだ。これからプロジェクトが
複雑になるから、
今のうちにもっとシステマティックな
管理体制というか、
強固な
管理体制を
作っておきたい。それが
一元管理と
呼ばれる
管理体制で、カンタンに
言うとゲームのメインループを1つのスプライトに
集約しておくやり
方なんだ。
今回はプレイヤーの「ずっとループ」から
色んなメッセージを
飛ばして、ゲームの
主だった
処理(3D
化の
処理)を
実行されるようにしていきたい。こうしておくと、3D
化にテコ
入れしたいときはプレイヤーから
調べればいい、っていうシンプルな
原則が
手に
入る。デバッグしていると「どこから
見たらいいんだっけ……」と
途方に
暮れることがあるけど、このシンプルな
原則「プレイヤーから
見始める」があれば、それだけデバッグが
楽になるんだよ。
具体的には
以下の
点をスプライト「プレイヤー」が
起点になるように
修正していく。
- ★視野角と★解像度といった見た目に関する変数(今はレイキャスターで管理してる)
- どの方向を向いているか、という角度(今はレイキャスターで管理してる)
★視野角と★解像度を移動する
視野角と
解像度の
変数を、プレイヤーに
移動しておいて。
レイキャスターの
方は2つのブロックを
消しておいて。
定義「_プレイヤーティック」を作る
スプライト「プレイヤー」を
開こう。
定義「_プレイヤーティック」を
作る。
ok-scratch
u003cpu003eティックというのは日本語だと「秒針がチクタク」みたいな意味なんだけど、分かりやすい訳がないからティックって書く。ティックはゲームクリエイターにはメジャーな単語だからチクタクってニュアンスで覚えるのがいいよ。u003c/pu003e
ずっとループの
中身をごっそり
移すよ。
移動元には
定義を
代わりに
置いておこう。
定義「_プレイヤーティック」の
最後についてるメッセージ「レイキャストする」は
取り
外しておこう。
代わりに、もともとの「ずっとループ」の
中でメッセージを
送るようにするよ。
戻すって
感じかな。
定義「_レイキャスターを初期化する」を作る
ずっとループの
中で
呼び
出そう。
カメラのゆがみを直してズームアウトできるようにする
レイキャスターで「
角度」っていう
変数を
作ったけど、
実はこのままだと
視野角によっては3D
化がうまくいかないことがある。
変数「★カメラの角度」を作って、変数「角度」と差し替える
このゆがみを
直す
最初の一
歩として
新しい
変数を
用意するよ。
レイキャスターを
初期化するところで
向きを
割り
当てる。
ok-scratch
u003cpu003eこのカメラの角度(プレイヤーの向き)を、今までレイキャスターで使ってた「角度」という変数の代わりに使っていくよ。u003c/pu003e
スプライト「レイキャスター」
スプライト「レイキャスター」を
開こう。
メッセージ「レイキャストする」を
受け
取ったタイミングで、プレイヤーの
向きに
向けていた
部分を、★カメラの
角度に
差し
替えよう。
動きに
違いはないよ。
そして
定義「_レイキャストする」にて、
角度という
変数に
向きを
割り
当ててたところは
消してOK。
定義「_シングル・レイ」で
使っていた
角度も、★カメラの
角度に
差し
替えよう。
うん、
動きに
違いがないはずだから
念のためテストしておいてね。
u003cpu003eどこを見ているかという角度や★視野角など見た目に関することをプレイヤーを起点に管理できるようになったu003c/pu003e
さて、このままだと
視野角を
変えたときに「ゆがみ」が
発生してしまうって
伝えていたね。↓このショート
動画をチェックしてみて。
目の
前の
壁はまっすぐ
見えるけど、
周囲の
壁がぐにょっと
曲がって
見えるよね。
魚眼レンズみたいな状態。これがなぜ
発生するのかっていうと、
実は
陰影のところで実装した変数「距離」の計算が原因なんだ。
目の
前の
壁よりも、
斜め
前にある
壁のほうが
暗く
見えるように、
三角関数を
使って
距離を
再計算したところだよ。↓これ。
これのせいで
魚眼レンズ
状態だけど、
陰影には
必要な
処理だった。だから
距離は
変えずに、
今度は★カメラの
角度を
再計算することでゆがみを
直していく。しかーし!ここで
再び
難解な
数式を
使うことになる。いやいや、
安心してほしい。
今回もスクラッチのブロックで
用意されているものを
使うだけだからね。
使うのはアークタンジェント、いわゆる
逆三角関数という
計算だ。
ok-scratch
u003cpu003e逆三角関数がどんな内容なのか、それは。。。よく分からないからウィキペディアで調べたってグリフパッチさんも動画で言ってたwu003c/pu003e
ok-scratch
u003cpu003e丸投げじゃんu003c/pu003e
ok-scratch
u003cpu003eい、いま大切なのは、逆三角関数で魚眼レンズ状態が直せるっていうことさ!u003c/pu003e
プレイヤー
スプライト「プレイヤー」を
開こう。
変数「★DV」を作る
DVっていうのは、
無理やり
和訳するなら
方向性とか。でもピンとこないからDVにしておいた。スクショだと★つけてないけど、この
後直したので
付けておいてね!
よぉし、ちょっと
複雑な
演算を
組むから
注意深くマネしてくれ。
矢印の
通りにはめていってね。
ok-scratch
u003cpu003etanはタンジェントって呼ばれてて、これは逆じゃなくて普通の三角関数。これも高校数学かな。まぁブロックを使うだけだから数学が苦手な人も、習ってない人も、問題なし。u003c/pu003e
最終的に↓こんな
演算を
組む。
これを
先ほど
作った
定義「_レイキャスターを
初期化する」で、★DVの
値としてセットするよ。
レイキャスター
スプライト「レイキャスター」を
開こう。
さっき
置いたばかりだけど、メッセージ「レイキャストする」を
受け
取ったときに★カメラの
角度に
向けていたところは
消そう。
さらに、
定義「_レイキャストする」で
使っている2つの
角度を
変えるブロックを
消そう。
新しく★DVを
使って
角度の
計算をしていく。ここで
登場するのが
atanだ。
大丈夫、atanの
計算自体はスクラッチがやってくれるから、
僕らは
正しい
式を
作ることに
集中しよう。↓これらのブロックを
用意して、
矢印に
沿ってブロックをはめていってほしい。
↓こういう
演算ができるはずだ。
これをループの
中で
向きに
割り
当てよう。
CHECK! 魚眼レンズ状態が直ったかテストする
やったぜ!アークタンジェント
様が
魚眼レンズを
直してくれたぜ。めちゃめちゃすっきりしたよね。
数学の
力ってスゲー!
u003cpu003eカメラのゆがみが直ったu003c/pu003e
ズームアウトを実現する
定義「_シングル・レイ」に
行って。
変数「
高さ」を
設定しているところを
見つけて、ここの
適当な
演算を
修正しよう。4,000っていう
数字を
最初は
適当に
設定してあったよね。
この
演算はいったん
外して、
新しい
演算を
作っていくよ。↓この
演算を
作って。
これを
高さに
割り
当てよう。
CHECK ズームアウトされるようになったかテストする
ちょっとショート
動画の
画素が
粗いけど、わかるかな。4000のときと
改善した
時を
比較してる。
ok-scratch
u003cpu003eこれでズームインもズームアウトも正しく描画されるようになった。たとえばスナイパーが敵を狙うときはズームインして視野角が狭くなる代わりに遠くまで見える、みたいな仕様を実装するときも安心して作れるようになったというわけだ。最高!u003c/pu003e
u003cpu003eズームアウトしたら距離も遠くなる演出が実現できたu003c/pu003e
まとめ
今回は
見た
目に
関する
改善ができた。ギザギザな3Dとはおさらばだぜ!って
言っても、このあともっと
改善していくから、
今以上のもとを
追求していこう。
今回は
以下のことができるようになったぞ。
- 散らばっていた見た目に関する処理を、プレイヤーを起点にすることができた
- トゲトゲになっていた壁を滑らかにした
- ズームすると歪んでいた角度を自然に見えるよう補正できた
この
処理によってよくあるスクラッチのレイキャスティングとは
一線を
画すクオリティになった。おめでとう!って、あれあれ、まだスクラッチキャットが
進めずにいるぞ!
次回もチェックしてみよう。
グリフパッチさんの動画を参考にしています
今回のチュートリアルは
世界No.1スクラッチャーとして
名高いグリフパッチさんの
動画を
参考にしているよ。ただし
手順を
一部変えているところもあるんだ。