メモを見ながら適当にしている。まだ33分/50分くらいまでしか見てない。
ホーミングレーザー
運動方程式から「ある時刻にある地点に到達するための加速度」を求める 加速度を運動方程式に適用する 時間を勧める を繰り返すと絶対に着弾するミサイルができあがる 加速度に上限を設けると、ぎりぎりまで引き付けることで避けることができるようになる
線形補完でも実現できるが、着弾時間と運動方程式を使うほうが応用が利くので良い ex1. 飛び初めに別方向への速度を持たせる ex2. 最初に遊びをもたせる ex3. 着弾後にスクロールさせる
PvEでは自分の弾は必中であるべき。ロックオンして発射したにもかかわらず避けられると理不尽
誘導ミサイル
等速で角度調整だけで突っ込む感じ? Quaternion.Lerpはやめとけ(応用効かない) バネトルクがお勧め バネトルクはUnite2017の講演みてね バネトルク適用するとちょっと遅延して角度が追従する AngularDragを大きくすると敵にあたるようになるけど大きくし過ぎると同じ動きになる 同じ動きにならないようにゆらぎを突っ込む
トレイルの描画
テクスチャの両端ドットは透過にする
トレイルねじれ問題はたいへん
発生条件
- ノード間の間隔がせまい(みさいるがおそい)
- トレイルの幅が広い
- スクリーン上の2d座標で内積求めて角度が大きいところの透過度をあげて解決させた
昔話
- 整数のみ、割り算が重くて使えないハードウェアがあった
- 4096を1.0とする
- 掛け算をするたびに4096で割る
- 割り算は使わないよりほかにない...
運動方程式の適用
- 1秒60fの場合、1秒を60とすればdeltaTimeは1
- 加速度の再計算は2のべき乗時間のみに間引き。ビットシフトのみで割り算できる 神は二階微分に宿る
コンピュートシェーダー
- 二つの命令をCPUからGPUへ送る
- SetData
- Dispatch
- CPUはGPUの結果を待たない。めいれいするだけ
- 通常シェーダーもコンピュートシェーダーも呼び出されるタイミングは一緒なので特に遅延は考えなくてよい
- [numthreads(8,8,8)]を関数の前につけると512並列
- 並列数は超えると実行時エラー吐く
- ミサイルの位置情報をCPUに置かないことを目標にしてコンピュートシェーダー実装
課題1:ターゲット情報はCPUで枚フレーム更新
ターゲットバッファを256バイト用意して毎フレームSetData
課題2 : ミサイルの管理
- ミサイル生成関数をミサイルの誘導関数の前に置く
- オブジェクトプール的なミサイル配列
- 初期位置・初期角度・ミサイルID・生死に加えて乱数を付加しておくと便利