プチメタ3.0

刺激を受けた物事に対する感想や考察、資産運用や英語学習、自己成長に関することなど。


正念場から逃げても自分が追い詰められるだけ


<<中略>>




―――「夏目にーに漫画短編集」第1集より  


創作活動をする人間にとって
自分の作品に自信が持てないことは珍しくないが、
だからといって勝負の場に出ないのは最悪の選択だ。


「まだ完成していない」「見せられるレベルじゃない」
「忙しくて時間がなかった」「人前に出すのが恥ずかしい」
逃げる人がよく言うこんなのは全部言い訳で、
結局は決定的な敗北を味わいたくないだけなのだ。


要するに公衆の面前で比較されて
ハッキリと優劣をつける勇気がないだけだし、
「勝負しなければ辛くない」と思っているのだろうが、
不戦敗はただの敗北よりも格下だということはみんな知っている。


創作物で100%満足できることなんてなかなかないし、
〆切までに完璧な状態に到達することもない。
どのクリエイターも納得できない部分を抱えつつ
腹をくくって作品を発表しているのだ。


そこを乗り越えない限り、まず他人には勝てない。



mclover.hateblo.jp

mclover.hateblo.jp

mclover.hateblo.jp

プログラマー志望者はタイピングが遅くても気にしなくていい


将来、プログラマーになりたいと思っているものの
パソコンに不慣れでタイピングが遅いことを悩む人がいるが、
正直、そんなことは気にしなくていい。


第一に、プログラミングに要する時間のうち大部分は
これから作っていくプログラムの構造を考える
設計」と呼ばれる工程だからだ。




この間、プログラマーの手はほとんど動いておらず、
問題が起きにくく、効率のいい作り方を
いろいろと頭の中で組み立てていることになる。


作家でいえばプロットと呼ばれる筋書きを考える段階で、
タイピングがいくら速くても
短時間で小説が書き上がるわけではないのと同じだ。


この設計の精度によって、その後の作業量や
トラブルの度合いがおおよそ決まるため、
タイピング速度よりも設計能力の方が遥かに重要だ。




第二に、実際にプログラマーになるまでには
たくさんのプログラミングを経験するため、
よく使う単語やキーボードの配置は嫌でも覚える。
逆に言えば、タイピングが速くなっていないなら
作ったプログラムの量が絶対的に足りないと言える。


つまりはプログラマーを目指しているのに
タイピング速度だけを気にしたり、
それだけを練習したりしても意味がないのだ。


プログラマーの実力が何によって決まるのかに目を向け、
そのための努力に時間をかけよう。



mclover.hateblo.jp

クリエイターが「面倒くさい」と考えたら終わり


ゲーム開発に限らず、何かを作っている過程で
「面倒くさい」と愚痴るようなら
クリエイターの道は諦めた方がいい。


そもそも創作活動なんてものは面倒くさいことだらけであって、
「人を楽しませたい」「思いついたアイデアを形にしたい」という
意欲と情熱に逆らえずに作業しているわけだろう。


一度作ったものが納得できずにやり直したり
周囲の意見を受けて手直しするなんてことは日常茶飯事。
それでも作品がよくなるなら我慢できないのだ。


それなのに「面倒くさい」なんて感情が湧くのは
作りたいという欲求や作品が評価される快感よりも
労力に対する嫌悪感の方が上回っている証拠。
もはやクリエイターとして死んでいる状態と言える。


「思いついたら作らずにいられない」、
それが正しいクリエイターの姿のはずだ。



mclover.hateblo.jp

mclover.hateblo.jp

3Dゲームではあらゆる判定でコサイン(内積)が役に立つ


サイン・コサインなどの三角関数
ゲーム開発で非常によく使われるが、
3Dゲームの場合は特にコサインが役に立つ。
これはコサインでベクトルの影の長さを求められるからだ。

内積を利用してベクトルの影の長さを求める


コサインを使えば直角三角形の底辺の長さがわかるが、
その計算式は「斜辺の長さ × コサイン値」となる。
この図の場合は「3 × コサイン30度」だ。




これをそのまま先ほどの図に当てはめてみると、
「ベクトルABの長さ × コサインθ」を計算によって
ベクトルABの影となるベクトルACの長さが求まるということだ。


これを数学的に表現すると以下のようになる。


  \displaystyle\ |\vec{AC}|=|\vec{AB}|\cos\theta


この式は以前紹介したベクトルの内積の計算方法、
\displaystyle\ |\vec{AB}||\vec{AC}|cos\theta と非常に似ていることがわかる。
違うのは\displaystyle\ |\vec{AC}| があるかどうかだ。


\displaystyle\ |\vec{AC}| はベクトルACの長さを表すが、もしこれが 1 なら
\displaystyle\ |\vec{AB}|cos\theta\displaystyle\ |\vec{AB}||\vec{AC}|cos\theta は同じ意味になる。
つまり、ベクトルACの長さを1にしたものとの内積を求めれば
それがベクトルACの長さを表すということになる。



  \displaystyle\begin{align}\ |\vec{AC}|&=|\vec{AB}|\cos\theta\\&=|\vec{AB}||\hat{AC}|\cos\theta\\&=\vec{AB}\cdot\hat{AC}\end{align}


数学的に表現するとややこしく見えるが、
要するに内積を求めるときの2本のベクトルのうち、
片方は正規化したものを使うというだけだ。
この場合、ベクトルACはベクトルABの影が落ちる地面と考える。

影の長さで特定方向に対する位置がわかる


「影」といっても実際の地面とは関係がなく、
2本のベクトルがどこを向いていようが
正規化したベクトル方向を基準に
ベクトルの影の長さがわかるということだ。


これが役立つ場面として
たとえばレースゲームを想像してみよう。


自機と敵が順位を競っている場合、
どちらがゴールに近いかを判定して順位表示する必要があるが、
サーキットは曲がりくねっているので
各キャラクターとゴール地点の単純な距離では判断できない。




そこでスタートからゴールまでコース上に少しずつ点を置いていく。
ここではそのうちの2つの点を取り上げ、
P1からP2に向かう方向がゴールだとする。


そして、P2の座標からP1の座標を引き算して求めたベクトル
さらに正規化し、これを基準ベクトル(\vec{V_0})と考える。




さらに自機の座標からP1の座標を引いて求めたベクトルを \vec{\alpha}
敵の座標からP1の座標を引いて求めたベクトルを \vec{\beta} とする。


正規化された \vec{V_0} の長さは1なのだから、 \vec{\alpha}\vec{V_0} の内積を求めれば


  \displaystyle\vec{\alpha}\cdot\vec{V_0}=|\vec{\alpha}||\vec{V_0}|cos\theta=|\vec{\alpha}|\times\ 1\times\cos\theta=|\vec{\alpha}|cos\theta


となり、 \vec{\alpha} の影の長さを求めることができる。
同様に \vec{\beta}\vec{V_0} の内積を使って \vec{\beta} の影の長さも求める。




そしてその影はP1とP2を結んだ軸上に落ちたものなので
自機と敵のうち影の長い方がP2に近いということがわかる。
これで順位を判別するのだ。




同じ考え方でゴールを通過したかどうかも判定できる。
ゴールは1本の直線だが、判定する際は
そのゴールラインの上にある点Gの座標を使う。




さらに点Gから進行方向に伸びる長さ1のベクトル \vec{V_0}
点Gと自機を結ぶベクトル \vec{\alpha} 、点Gと敵を結ぶベクトル \vec{\beta} を用意する。


あとは先ほどと同じように \vec{\alpha}\vec{V_0} の内積、
\vec{\beta}\vec{V_0} の内積を使ってそれぞれの影の長さを求める。


この影の長さは \vec{V_0} 方向に対しての進捗具合を表すが、
点Gより手前を向いている \vec{\beta} の影はマイナス値になるので
キャラクターがゴールラインを通過したかどうかも簡単に判定できる。


直線からの離れ具合も判定できる


別の利用法として、レーザー兵器との当たり判定を考えてみる。
発射口から一直線に伸びていく攻撃では
単純に発射口との距離が近いからといって当たっているとは限らない。
大切なのはレーザーの太さよりも近くにいるかどうかだ。




そこでレーザーの発射方向を基準ベクトル(\vec{V_0})とし、
座標Aと発射口の座標を結ぶベクトル \vec{W} を求める。




そして \vec{W}\vec{V_0} の内積を求めれば
これまで同様の理屈で、\vec{W} の影の長さ a が手に入る。




ベクトルの長さは簡単に調べられるので
\vec{W} の長さを c とすると、ここに直角三角形が見えてくる。


直角三角形なら三平方の定理である「 c^2=a^2+b^2 」を変形すれば
b=\sqrt{c^2-a^2} 」となり、 b の長さを求めることができる。


この b はレーザーの中心線からの距離となるわけだから
それがレーザーの半径以下かどうかを調べれば
座標Aがレーザーの攻撃範囲内かどうかがわかる。
これが点と直線を使った当たり判定だ。

まとめ

「ベクトルの計算」と聞くとややこしく感じるが、
その中身は四則演算と三平方の定理、三角関数など
数学の基本的な理屈ばかりだ。


すべては基本の積み重ねであり、
思い通りの判定を作っていくためにも
このあたりの知識はきちんと理解しておきたい。



mclover.hateblo.jp

mclover.hateblo.jp

mclover.hateblo.jp

mclover.hateblo.jp

ベクトルの内積を使って角度を求める仕組み


ゲーム中に出てくる判定や敵AIの処理では
角度の情報が必要になることが多い。


2Dゲームの場合は回転方向が左右しかないので
タンジェントを利用するだけでなんとかなるが、
3Dゲームの場合は横にも縦にも回転できるので
ベクトルの内積を利用する必要が出てくる。


3Dゲーム開発をする上で内積は避けられないため、
早い段階で理解してしまう方がいい。

ベクトルの内積とは

内積の計算には必ず2本のベクトルが関係するので、
ここでは3つの座標のうち2つを結ぶベクトルを考える。



点Aと点Bを結ぶベクトルを \vec{AB}
点Aと点Cを結ぶベクトルを \vec{AC} と表現し、
2本のベクトルの向きは46度ズレているとする。


\vec{AB} を求めるには座標Bから座標Aを引き算するだけでいい。
2ヶ所の座標を引き算すると
 その2点を結ぶベクトルが手に入る

というのはベクトル計算の基本だ。


内積というのは2本のベクトルから求めたひとつの値を指し、
\vec{AB}\vec{AC} の内積は \vec{AB}\cdot\vec{AC} と表現するが、
この求め方に2種類あるのがミソだ。

内積の計算方法その1

ひとつがベクトルの長さとコサインを利用する方法だ。


  \displaystyle\vec{AB}\cdot\vec{AC}=|\vec{AB}||\vec{AC}|cos\theta


|\vec{AB}|\vec{AB} の長さを表しているので、
上記の式は「 \vec{AB} の長さ」と「 \vec{AC} の長さ」と「コサインθ」を
すべて掛け合わせた値を求めていることになる。




ベクトルの長さ三平方の定理で求められるので、この図でいえば


  \displaystyle\begin{align}|\vec{AB}|&=\sqrt{(5-3)^2+(17-10)^2+(6-4)^2}\\&=\sqrt{2^2+7^2+2^2}\\&=\sqrt{57}\end{align}


  \displaystyle\begin{align}|\vec{AC}|&=\sqrt{(7-3)^2+(12-10)^2+(5-4)^2}\\&=\sqrt{4^2+2^2+1^2}\\&=\sqrt{21}\end{align}


となり、コサイン46度は約0.694なので、
それらを踏まえて計算すると


  \displaystyle\begin{align}\vec{AB}\cdot\vec{AC}&=|\vec{AB}||\vec{AC}|cos46^\circ\\&=\sqrt{57}\times\sqrt{21}\times\ 0.694\\&=24\end{align}


となる。

内積の計算方法その2

もうひとつがベクトルの成分を使う方法だ。


\vec{AB} の成分を (AB_1,\ AB_2,\ AB_3)
\vec{AC} の成分を (AC_1,\ AC_2,\ AC_3) と表現すると、


  \displaystyle\vec{AB}\cdot\vec{AC}=AB_1\ AC_1+AB_2\ AC_2+AB_3\ AC_3


という計算で内積を求めることができる。



ベクトルの成分というのはXYZ方向それぞれの長さであり、
終点から始点を引き算すればいいので、この図でいえば


  \displaystyle\begin{align}\vec{AB}&=(5-3,\ 17-10,\ 6-4)\\&=(2, 7, 2)\end{align}


  \displaystyle\begin{align}\vec{AC}&=(7-3,\ 12-10,\ 5-4)\\&=(4, 2, 1)\end{align}


となるので、これを踏まえて計算すると


  \displaystyle\begin{align}\vec{AB}\cdot\vec{AC}&=2\times\ 4+7\times\ 2+2\times\ 1\\&=24\end{align}


となり、もう一方の計算方法で求めた値と同じ結果になる。

内積の値から角度を求める

さて、内積をうまく利用すると
2本のベクトルの間の角度を求めることができる。


先ほどは角度の値を添えていたが、
実際にはその情報がわからないことが多く、
そこを内積を利用して求めていくのだ。


一旦、内積を求める2つの計算方法を並べてみる。


  \displaystyle\vec{AB}\cdot\vec{AC}=|\vec{AB}||\vec{AC}|cos\theta
  \displaystyle\vec{AB}\cdot\vec{AC}=AB_1\ AC_1+AB_2\ AC_2+AB_3\ AC_3


どちらの計算方法でも同じ値が求まるわけだが、
1つ目の式はベクトルの長さとコサイン値、
2つ目の式はベクトルの成分が必要になる。


ベクトルの成分というのは要するに座標であり、
ゲームプログラムでは必ず保持している情報だ。
つまり、2つ目の式ならいつでも計算できる。
それに対して角度がわからない状況では1つ目の式は使えない。


しかし AB_1\ AC_1+AB_2\ AC_2+AB_3\ AC_3 の計算で求めた内積は
|\vec{AB}||\vec{AC}|cos\theta と同じ値なわけだから、角度がわからなくても
\vec{AB} の長さ」と「 \vec{AC} の長さ」と「コサインθ」を
掛け合わせた値を求めることができるということだ。


しかし3つの値を掛け合わせた計算結果から
ひとつの要素だけを取り出すことはできない。
6\times\ 4\times\ 5 の合計が 120 だと計算するのは簡単だが、
120 という値から 65 という値を導き出すのは無理だろう。


つまり |\vec{AB}| \times\ |\vec{AC}| \times\ cos\theta の合計がわかっても
そこから角度 \theta を取り出すことはできない。
すべての原因は3つの要素が混ざっているためだ。


そこで |\vec{AB}||\vec{AC}|1 にすることを考える。


ベクトルの向きを変えずに
長さを1にすることを「正規化(せいきか)」と呼ぶが、
ベクトル成分を長さで割るだけで実現できる。
\vec{AB} を正規化したものは \hat{AB} と表現する。


  \displaystyle\hat{AB}=\dfrac{\vec{AB}}{|\vec{AB}|}=\dfrac{(2,\ 7,\ 2)}{\sqrt{57}}=(0.264,\ 0.927,\ 0.264)


  \displaystyle\hat{AC}=\dfrac{\vec{AC}}{|\vec{AC}|}=\dfrac{(4,\ 2,\ 1)}{\sqrt{21}}=(0.872,\ 0.436,\ 0.218)



内積を求める式は


  \displaystyle\vec{AB}\cdot\vec{AC}=|\vec{AB}||\vec{AC}|cos\theta


だったので、 \hat{AB}\hat{AC} の内積は


  \displaystyle\hat{AB}\cdot\hat{AC}=|\hat{AB}||\hat{AC}|cos\theta


となるはずだが、正規化しているため |\hat{AB}||\hat{AC}|1 なので、


  \displaystyle\hat{AB}\cdot\hat{AC}=|\hat{AB}||\hat{AC}|cos\theta=1\times\ 1\times\ cos\theta=cos\theta


となる。
つまり、内積を計算する前に2本のベクトルを正規化しておけば
内積=コサイン値になるわけだ。


角度からコサイン値を求める場合はコサイン関数を使うが、
コサイン値から角度を求める場合は
コサインの逆関数であるアークコサインを使う。


 \displaystyle\theta=arccos(\hat{AB}\cdot\hat{AC})


これが内積を使って角度を割り出す仕組みだ。


実際のプログラムではベクトルの正規化も内積の計算も
アークコサインも専用の関数が用意されているので、
自分で計算する必要はまずない。

2本のベクトルを見出せれば角度がわかる


内積を使って角度を求める仕組みさえわかれば
あとは自分が欲しい角度を挟む2本のベクトルを
きちんと見出せるかどうかにかかっている。


敵が攻撃する角度、旋回する方向、画面に表示する方角など
3Dゲームを構成するあらゆる場面で内積が役に立つし、
早めに理解して苦手意識をなくした方が武器になる。



mclover.hateblo.jp

mclover.hateblo.jp

mclover.hateblo.jp

mclover.hateblo.jp

総アクセス数