2017年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
無料ブログはココログ

« Wizardry for Ajaxに向けて | トップページ | 読了:神様のパズル »

2006年8月 9日 (水)

昨日のモノの仕組み

昨日の続き。

どのように画像の位置を計算しているかを記す。

構成要素として以下の項目と、いくつかのルールを設定する。

  • 表示枠の幅と高さ(可変だが、とりあえず800×600とする)
  • 壁の幅と高さ(可変だが、4m×3.4mとする)
  • 視角(横方向)は、150度固定とする。
  • 視点の高さ(170cmとする。この値から壁の高さは2倍の3.4mとなる)
  • 壁を表示する範囲(通常時とLOMILWA実行時がある。最大4ブロック先まで見えるようにする)

●ルールとして、

  • 迷路の壁は横方向(横壁)と縦方向(縦壁)で構成される
  • 壁の高さは、視点が壁の中央に来ていることから視点の高さの2倍とする
  • 視点の立ち位置は、1ブロックの中央とする。(壁までの最短の長さは壁の半分になる)
  • 計算は横方向を基本とし、高さ方向の計算は、壁の幅と高さの比率から求める方が楽
  • 壁は画像(gif)にする。表示する壁はすべてその大きさで作る。(拡大・縮小するとジャギーがでて汚い)
  • 横方向をxで示し中央をx=0、奥行きをyで示し立ち位置をy=0とする。右側がx>0、左側がx<0とする。
  • xが偶数のとき、横壁を指す。xが奇数のとき縦壁を指す。
  • x=±1、y=0のとき、立ち位置の真横の縦壁を指す。
  • x=0、y=1のとき立ち位置の真正面の横壁を指す。

以上より、各壁のTop、Left、Height、Widthを計算する。x=0の壁のLeft、Widthと縦:横の比率から計算する。

  • 正面横壁のWidthは、視界に入る長さと壁の横の長さの比率を求めて、横ピクセル数に掛ける。視界に入る長さは視角と横壁までの距離から求まる。→視界に入る長さは、2×tan75°×距離 で求まる。(75°は、視角150°の半分)
  • 正面横壁のLeftは、全体の横ピクセル(800)の半分から横壁Widthの半分を引くことによって求まる。
  • 正面横壁のHeightは、壁の縦横比率を横壁Widthに掛けることによって求まる。
  • 正面横壁のTopは、Leftと同様、全体の縦ピクセル(600)の半分から横壁Heightの半分を引くことによって求まる。

横壁は、正面横壁を踏まえて計算する。

  • 横壁のTop・Height・Widthはyが同じならば一定なので、正面横壁の値を流用。
  • 横壁のLeftは、正面横壁Leftから横壁正面Widthを中央からどれだけ離れているかで、足し引きする。具体的には横壁正面Widthにx÷2を掛けた値をLeftに足す。(横壁はxが偶数のところなので2で割る)

縦壁は、横壁の値から計算する。左側と右側で計算方法がちょっと違う。

  • 縦壁のTopとHeightは、おなじy座標の横壁TopとHeightと同じ
  • 縦壁Leftは、左側が横壁と接するところ(横壁Left)と同じ。つまり、右縦壁(x、y)は、横壁(x+1、y+1)のLeft。左縦壁(x、y)は、横壁(x+1、y)のLeft。
  • 縦壁Widthは、左側と右側が横壁に接するところ(横壁Left)の間から計算する。つまり、右縦壁(x、y)は、横壁(x+1、y)Leftから横壁(x+1、y+1)Leftまで。左縦壁は、横壁(x+1、y+1)Leftから横壁(x+1、y)Leftまで。

問題は、y=1/2より手前の横壁の計算。
なんせ、視界に入る全体の長さには、距離がパラメータにあり、視点がブロックの中央にあるとするので、y=1/2で壁までの距離が0になってしまう。正面横壁のWidthは、視界に入る長さと壁の横の長さの比率を求めており、つまり、y=1/2に正面横壁があるとするとそのWidthは0の逆数つまり無限大になる。
また、y<1/2の値のとき(具体的にはy=0)では、Widthの値が負になる。
この問題を避けるためy≦1/2の場合は、Hight、Widthは表示枠の高さ・幅を設定する。Leftは左側は0、右側は、接する正面壁(x+1、y)Leftを返す。

これで何とかなった。(見直す部分があるけれど・・・)

« Wizardry for Ajaxに向けて | トップページ | 読了:神様のパズル »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/117572/2989460

この記事へのトラックバック一覧です: 昨日のモノの仕組み:

« Wizardry for Ajaxに向けて | トップページ | 読了:神様のパズル »