TraceRayについて
ついてもクソもないんですけどね
今必死で調べてる 健忘録残す
まぁまずはリファレンスから
Handle TR_TraceRayEX(const float pos[3], const float vec[3], int flags, RayType rtype)
開始地点posから終了地点またはサーチ方向vecにRayを発射
flagsはサーチ対象の属性
rtypeは衝突判定探すならRayType_Infiniteで、射撃範囲とかサーチ範囲とかで距離が有限ならRayType_EndPoint
このRayTypeでvecの値が座標ベクトルを使うか方角ベクトル使うか変わるので注意な
とりあえず基本的にはこのイメージ
ページ内のこの画像が分かりやすくて良い ただHullの箱の大きさの決め方が書かれていないのが辛い 始点から相対座標minから座標maxを対角線とする立方体がrayに沿って移動するという認識でいいのか pic.twitter.com/zQtUaqKv4a
— ArcMage (@Alchemist_Ark) 2018年4月3日
で、Rayをプレイヤーの座標から開始した場合、プレイヤー自身に当たってそこでトレースが終わってしまう
なのでこの場合TR_TraceRayFilterを使う
Handle TR_TraceRayFilterEX(const float pos[3], const float vec[3], int flags, RayType rtype, TraceEntityFilter filter, any data)
最後にTraceEntityFilterが追加されてるけど、これはコールバック関数
Rayが何かに衝突する度に呼び出されて、コールバックがtrueを返したらそこで終了
falseを返したら無視して次になにかに衝突するまでトレースを継続する
つまりコールバックでプレイヤーEntityだったらfalseしてやればいい
データを1つコールバックに送ることができるので、clientindexでも送ればいいんじゃないの
次
関数のEXって何って話
EXある関数はトレース結果をhandleで返す
無い関数はglobal trace resultとやらに保存されている らしい よく分からない
トレースしたらすぐ結果を使うように運用すれば多分globalでいいんだと思う
複数のトレース結果を使用するとか、他の関数からも結果を参照するとか、そういう時に使うのかとは思う
けど明示的に結果がこのhandleに入ってますよの方が気分がいいので使うようにした方がいいかも。
Hullについては自分でもうちょっと試したら追記する
終わったら閉じましょうNE
追記
思ってたので間違いない感じ
追記
Entity0には必ず当たるんだろうか
フィルターかけてもダメというかフィルターを通過していない感がしている
特にTraceHullの時に範囲内に壁とか床とかあった場合、他に何かがあるかどうかは関係なくEntity0にヒットしてしまう
追記
マスクタイプでCONTENTS_MOVEABLEだとかCONTENTS_MONSTERCLIPだとか指定した時に、TR_GetEntityIndexが-1を返しているのにフィルター関数を通過しているのを発見
でもtrueを返しても-1になる
ハラ立ったのでグローバル変数で検出したEntityIndex保存したよね
//Hit条件でフラグを建てておく if(entity <= MaxClients && entity > 0){ g_Hit = entity; }
ほんでTR_GetEntityIndexの代わりにg_Hitで条件式書いたよね
動いたよね
暴れるよね
なんでや。