ソース
境界球などを表示する
説明
ダイアログで選んだ形状モデルのそれぞれのパーツの境界球を順番に表示します。
モーションして境界球の大きさや位置が変わったりするのがよくわかります。
境界球の他にバウンダリーボックスも表示するようにしました。今のところローカル座標しか取れないのでモーションなしの場合にしか見た目と上手く合わないことがわかります。
当たり判定で使われる境界球が少し大きめだと感じていて、ボーンの分余計に大きくなっているかもと思ったので、ボーンも表示しました。でもボーンは関係ないことがわかりました。
インストール
Easy3DForHSP3のサンプルスクリプトと同じ場所にball2.hspを入れます。
kyuu.mqoなどの残りの他のファイルはMediaフォルダに入れます。
ソース
たぶんわかったこと(このソースだけではわからないことも含む)
E3DGetBBox で得られるバウンダリーボックスとは、指定したパーツに含まれる全ての頂点が収まる最小の直方体のこと。
E3DChkConflict* は指定したパーツのグローバル座標でのバウンダリーボックスで当たり判定をする。
バウンダリーボックスは回転しなくて、指定したパーツに含まれる頂点の位置だけで直方体の大きさを決めているので、指定したパーツが回転すると、球以外なら大きさが変わる。
E3DChkConfBySphere* は指定したパーツのバウンダリーボックスが収まる最小の球(=境界球)で当たり判定をする。だから、球に近いパーツでも境界球はパーツより一回りくらい大きくなってしまう。これで最初の疑問が解けました。
フィルアップモーションマスター
説明
元々のサンプルのようなquaの0から9フレームに空白を入れる必要を無くしました。
また、補間するフレームの長さを自由に変えられるようにしました。
また、補間先のモーションのフレーム番号を選べるようにもしました。
つまり、フィルアップモーションでモーションアクセラレータを作っちゃいました…。
たぶん、モーションアクセラレータを使うより自由自在にモーションを繋げやすいかも知れません。
今のところ、それだけがこの存在価値…。
面白い一つの使い方
例えば、目標のポーズのキーフレームを0フレームにだけ作ったquaを4種類用意します。その4種類のポーズ同士で補間し合います。
左上への剣のポーズ、左下への剣のポーズ、右下への剣のポーズ、右上への剣のポーズの腕の位置が作る4角形の中で腕が自由に動きます
「#const QUA 0」で見られます。「#const QUA 1」にすると普通のモーション同士の補間を見られます。
フィルアップモーションとモーションアクセラレータの補間の違い
フィルアップモーションとモーションアクセラレータの補間の違いは、例えばモーション1、2、3で言うと、モーションアクセラレータの場合は、1から2への補間の途中で3への条件が満ちると、瞬間で2になってから2から3へ補間されます。
フィルアップモーションの場合は、1から2への補間の途中で3への条件が満ちると、1から2への補間の途中のポーズから3へ補間されます。
追記:モーションアクセラレータの説明を見ると、補間中のモーションから補間中のモーションに補間できるみたいなのでバグかどうかも含めて確かめる予定。
展望
補間中のポーズを途中で止めたりする。
基本ポーズから始めるようなquaの作りにしない方が良いみたい。
ソース
その他
モデルデータ置き場にアップされているpupepoさんのcoboltを利用させてもらっています。ありがとうございます^^
オープニング画面を形状モデルでくり貫く
説明
半透明形状モデルを他の不透明形状モデルより先に表示することで背景を半透明形状モデルにだけ映します。
ソース
その他
モデルデータ置き場にアップされているjさんのe3dtanを利用させてもらっています。ありがとうございます^^
今回はモデルの色を全て白にするという使い方をしています。すみません^^;
描画高速化
説明
E3Dユーザのみなさんの掲示板で見付けたものをまとめたものです。
形状モデルを読み込んだ後に1回だけ仮描画した後、sigLightFlagを0にしてsigのライティング計算を無効にすることで描画を高速化します。
ライティング計算を無効にしてもライティング命令が使えなくなるわけではありません。仮描画をしたように、つまりはsigLightFlagはライティング命令を反映させるためのものということです。
反映させたい場合にだけsigLightFlagを0から1に切り替えて描画した後、またsigLightFlagを0に戻すと良いです。
落ちる品質はというと、リアルタイムでライティングが反映されないということです。
カメラが形状モデルを見ながらそのモデルの周りを回っても、形状モデルの陰影が動かないという感じです。
同じ面を向いているのに暗いモデルと明るいモデルが並んでいる場合にもなります。
でも意外とそれは気になりませんし、形状モデル毎にそれぞれの陰影が付いているのは綺麗に感じます
この方法で、例えばサッカーで11vs11+審判などの沢山人が出るゲームや、ミドルポリゴンを使うゲームなども、低スペックのパソコンでも扱いやすくなります。
ソース
その他
モデルデータ置き場にアップされているjさんのおじんを利用させてもらっています。ありがとうございます^^
形状モデルのパーツ分けを減らすのも描画が高速になるそうです。
淵あり文字の作り方
説明
周りにきれいな淵をつけて文字を描画します。
またこのテクニックは、E3DCreateFontを何度も使用するため、会話画面などのあまり
多くの処理を使わない場面で使うほうが望ましいと思います。
ソース
その他
元ソースを提供してくださったbutisavaさんにご協力をしていただきました。
ありがとうございます。m(_ _)m
マルチレイヤーモーション
説明
マルチレイヤーモーションは、ジョイント毎に再生できるモーションです。
base_mot_idで指定したマルチレイヤーモーション用のモーションに、形状モデルが読み込んでいるモーションの情報を毎フレーム適用しています。
つまり、E3Dユーザ独自のE3DSetNewPoseを作った感じです。その分、適用するジョイントを指定できるような応用度を増やせましたが、HSPでの繰り返しが多い処理なので速度は遅くなりました。
補間先のモーションの番号やフレームの番号と補間するフレームの長さを指定して再生出来ます。
指定したジョイントへのモーションの再生が重なる場合は、後から指定したモーションだけが指定したジョイントに適用されます。
_E3DSetNewPoseByMLMで得られる補間中のモーションのフレーム番号にはマイナスが掛けられています。
base_mot_idで指定したマルチレイヤーモーション用のモーションの番号を変える場合は、もう一度_E3DIniMLMを呼ぶことになります。
現在のマルチレイヤーモーションの制限
最初のフレームと最終のフレームがキーフレームであるモーションだけに対応しています。
高速化のために、クォータニオンと移動量とフレーム番号だけを操作しています。
クォータニオンは球面線形補間だけに対応しています。
バージョンアップできること
モーションのステップ数に対応する。
pingpongモーションのターンするフレーム数を2にしているけど、オリジナルを参考にして決めるようにする。
フレーム番号固定(Stop)に対応する
使っていない変数のメモリの確保を削除する。
他のモーションに上書きされて、指定した全てのジョイントへの再生がスキップされているMLMのモーションでもフレーム番号が増えているのを止める。
ジョイント毎にモーションを再生する。
クォータニオンのスプライン補間に対応する。(重くなりそうですし、私からバージョンアップすることはないと思います。MLMの何をバージョンアップできるかをただ示したということだけです^^;)
var100からvar150へのバージョンアップ
「バージョンアップできること」で打ち消し線をした部分に対応しました。
ジョイント毎にモーションを再生できるようにしたことに伴って、_E3DSetMotionKindToMLMで指定するjoint_noを配列変数から数値または変数にしました。また、引数の順番も変えました。
_E3DSetNewPoseByMLMで受け取るcur_frame_noに、dim cur_frame_no, hs_num_max, jnt_num_maxで確保した配列を渡すように変えました。
_E3DIniMLMを_E3DInitMLMに変更しました。
サンプルのE3DInitの最後の引数を1にしたり、サンプルの誤記を修正したりしました。
ソース
お願い
使いにくい箇所やより良く出来る箇所があれば、私のウェブサイトの掲示板で教えてください。
また、特にMOAが出て補間モーションが簡単に出来るようになって、モーションの作り方が変わったように、MLMを踏まえたモーションの作り方があるかも知れません。上手に出来ているモーションを見てみると、沢山のジョイントを操作しているみたいです。それにMLMが対応できるのかは私にはわかりません。ノウハウのようなものも皆さんと共有できたら嬉しいです。
その他
モデルデータ置き場にアップされているjさんのおじんとpupepoさんのcoboltを利用させてもらっています。ありがとうございます^^
複数同時表示できるエフェクト
説明
格闘ゲームのヒットマークなどに使えます(?)
使い方
格闘ゲームの場合、攻撃がヒットしている場所の座標をどうにかして取得し、
そこにエフェクト用ビルボードを配置する。
ソース
サンプル一覧ページから外部リンクしない場合は他のサンプルもここへどうぞ。