LAST UPDATE 1998/08/22


『 その10-7 』




 ■ GetBallPxyzの続き

 三角関数の話でわき道に入ってしまっていたが、続きである。
image143.gif
    Case 1, 2, 3
image144.gif
 図の3種類がBa.bnoが1~3の場合である。これらはボールの進む方向を示すベクトルは一定のままである。
    Ba.px = Bcx - Ba.vx + Ba.vx * (2 / BCMax) * BC
Ba.vxの値はこれらのブロックに入ってきたときは-1、0、+1のいずれかである。例えばボールが左から右に動いているとすると、Ba.vxの値は1なので、ブロックの中心であるBcxから1を引くことになり、Bcx- Ba.vxでボールがそのブロックに入った時点でのX座標を求めることができる。 それにBa.vx * (2 / BCMax) * BCでBC(0~32)を元にして、ボールの相対移動距離を求めて加えている。
    Ba.pz = Bcz - Ba.vz + Ba.vz * (2 / BCMax) * BC
同様にZ座標を求めている。




 ■ ブロック番号4

 三角関数の話でわき道に入ってしまっていたが、続きである。
image142.gif image145.gif
    If (Ba.Rdir = 3) Then
下から入って左に抜ける場合と、左から入って下に抜ける場合に別々の処理をしている。Ba.Rdirという変数には、「そのブロックを抜けたときの方向。」が入っている。0:↑、1:→、2:↓、3:←を意味することに決めてあるので、Ba.Rdir=3というのは「ボールがこのブロックを抜けたときに左向きになる。」ことを意味する。ということは「下から入って左に抜ける。」方向で動いているということになる。
    Ba.px = Bcx - 1 + Cos(Rang)
    Ba.pz = Bcz + 1 - Sin(Rang)
 この場合ボールは下から入ってきているので軌跡は図のようになる。 pic10_7.gif
ブロックの一辺のサイズは2なので軌跡は半径1の円弧を描くことになる。Rangは0~90°という角度をBCに対応させた値であるから、上の式でボールの座標が求められるのである。
    Ba.vx = -Sin(Rang)
    Ba.vz = -Cos(Rang)
vx, vzにその瞬間のボールの進行ベクトルを格納している。こういった行為を「微分」と呼んだりする。
    Else  Ba.px = Bcx - 1 + Cos(1.571 - Rang)
     Ba.pz = Bcz + 1 - Sin(1.571 - Rang)
     Ba.vx = Sin(1.571 - Rang)
     Ba.vz = Cos(1.571 - Rang)
 これは、ボールが左から入って下に抜ける場合の処理である。考え方はまるで同じなのだが、角度が1.571-Rangとなっているのは、この場合の角度は90→0になる。Rangはラジアンで表されているため、90をラジアンで表した時の値であるπ/2=1.571から引いているのである。
 残念ながらここで1回分に割り当てられたページがなくなってしまった。それぞれのブロックに関して、全て考え方は同じであるので、次回掲載されるまでにそれぞれ挑戦してみてもらいたい。いわゆる宿題ってやつである。

 それでは…





その 10 -1 | その 10-2 | その 10-3 | その 10-4 | その 10-5 | その 10-6 | その 10-7

『 サルのゲーム製作講座 』 目次 | その 1 | その 2 | その 3 | その 4 |
その 5 | その 6 | その 7 | その 8 | その 9 | その 10 | その 11


もどる

e-mail: sc_3da@magical2.egg.or.jp