資料館/ビルボードビーム

Last-modified: 2008-04-30 (水) 14:04:18

がいよう

E3Dの「ライン命令」が充実している事を今知った。ほんとだよ。なんか頂点とかを色々追加しやすいようにあらかじめ準備されているじゃないですか。コレを使えばなんか色々できるんじゃないかと思った人も多いはず。
ていうかオイラが思った。
でも、このライン太さが1固定であり、カメラからの距離に比例して細くなったりなんてことはしない。エフェクト等に花を添えるには良いのだろうが、コレでビームは出せねえ。


さて、サンマを食った後、その骨を見ていて気付いたのだが

  • 2点間を結ぶラインを定義(ライン命令を使う必要はない)
  • そのラインと、カメラとのベクトルに垂直なベクトルを出す
  • そのベクトル上に板ポリゴンの頂点を持ってく

以上の処理で、見かけ上ビームとして成立するはずだ。ステキな絵で表すとこうなる。
risou.jpg
これはノーベル賞物の発明だと思ったのだが、思いっきり車輪の再発明だったようで、ぐぐったら良いやり方が出てきたので今回はそれを研究してみることにする。
どうでもいいことだが、何か絵のラインが陰毛のように見える。真に申し訳ない。




例によって出来上がったので、見て行く事にしよう

準備

素材の用意

まず例によって素材を用意する。今回はこのような板状のモデルを用意した。
sozai.jpg
曲がる、という事も想定し、適当にポリゴンを分割しておこう。今回は適当にやってしまったのだが、プログラム内でこの分割数が必要になってくるので、各々統一するなりした方がいいと思いますぅ。
それとは別に、今回は座標を求めるためにダミーオブジェクトを用意した。この辺は各自フィーリングで理解してくれ。なお、板ポリゴンは両面化している。

何をやるのか理解しとく

kekka1.jpg
ソースを見る前に、実行結果とナニをやっているのかをフィーリングで理解することにする。
まず、ダミーオブジェクトが画面を旋回している。この座標を、過去何回分か記憶する。この回数は先程の板ポリゴンの分割数で決まる。この数はそのまま、ポリゴンを曲げられる回数に直結するので適宜指定するように。このポリゴンの頂点を、カメラと、座標同士が結ぶラインのベクトルに合わせて動かしているというわけだ。

解説

ソースは下の方に置きました。ではソースを見ていくことにする。ポリ数を決める。今回オイラが作ったスクリプトでは、この数は分割したポリゴンより多くても少なくてもうまくいかない。適宜改善するか、数を統一してくれ。
次に幅を決める。この方式のいいところは幅が自在な所だ。場所場所で幅を変えることも出来る。これは適当に数字を入れておいた。
ダミーオブジェクトを読み込んだ後、板ポリゴンを読み込む。頂点座標をセットする時にパーツ番号が必要になるので、適当に取得する。座標用変数を宣言した後、一回初期化を行っているが、今はなくても良い。後々ON、OFFを切り替えた際にコレを呼び出さないと、いきなり伸びたものが表示されて( ´・ω・`)だ。
メインループで、まず座標データを一個ずつシフトする。前フレームまでの一番古い座標データは破棄される。


次に頂点座標のセットを行う。これが少しややこしい。まずオブジェクトの頂点の配置を確認しておく。
vert.jpg
もしかしたら0と1の関係が逆で、数字の増え方も逆かもしれないが、今回は大した問題ではない。
カメラと任意点のベクトルは求まるが、ラインのベクトル*1をどうするべきか迷った。今回は、先端のみ次の点、それ以外は前の点とのベクトルを求めることにした。この二つのベクトルに垂直なベクトルが求まれば良いのだが、さて、確か幾つか式が・・・
と思ったら、E3Dにはその計算をズバリやってくれる関数が備わっていたらしい。E3Dcrossというものだ。今日初めて使ったぜホント。正規化されているようなので、返ってきた値をそのまま使うことにする。どっち側を向いているのかわからんが、多分上(正の方)を向いてんだろうと仮定しとく。このベクトルをcrossと呼ぶ。


ここで、さっきの頂点の配置をもう一度確認。数字は行儀よく並べやすいよう配置されている。

  • cnt番の頂点を、任意の頂点から+crossだけ離れた位置にセット
  • cnt+1番の頂点を、任意の頂点から-crossだけ離れた位置にセット
  • cntを2増やす

syobon.jpg
この繰り返しで、良い具合に頂点座標がセットされていくはずだ。ソースではcntを倍にして計算している。
あとは描写命令などが来ている。コメントアウツしているが、ダミーオブジェクトを描写してみれば、その軌跡を追っているのがわかる。
ソースに間違いがあったので訂正しました。filebbeam2.zip

問題点と改善案

さて、見事に曲線を描くことに成功した。これで山盛りパーティクルを使わず、板ポリ1枚で納豆ミサイルが撃ち出せるのだが、問題点もある。
カメラの高さをに0をセットするなどで確認できるが、カメラとラインのベクトルが重なるようになるとうまくいかない。所詮板ポリゴンで厚みがないので、板を横から見ようとすると問題が起きる。
シューティングゲームのように、視点が固定されたゲームならば充分通用するが、ロボゲーで出せなければ意味がない。どうしよう。




同梱したbeam2.hspでは、一応誤魔化す策として、先端に適当な大きさのパーティクルを置いた。改善案は他にもあるかも知れない。ていうか教えてください。

おまけ

応用例

&flash(http://www.youtube.com/v/acZeiIvfpDo,425x350,bgcolor=#000000);

2Dシューティングゲームで使うばやいを想定し、真上からビームを見下ろしてみた。
一定時間ごとにランダムに目標位置が変わり、それをひたすら追い続けるだけの簡単なものだ。テクスチャを適当に変えてみたが、それなりに見えるもんである。
コレを応用すれば、ごんぶとの稲妻を走らせたり、インコムを飛ばしたりと表現の幅が広がるだべさ。

名前

ビルボードビームと銘打っているが、ビルボードは使ってない。誤魔化す際にパーティクルではなくビルボードを使うといいらしいが、その辺は適当に試してくれ。


*1 一番上の絵で言えばサンマの骨