2017年12月3日日曜日

RayCastとか呼ばれてるllCastRayのお話 乗り物向け

前に書いたのが出てすぐくらいだったので改めて書くかなぁという感じで
 
とりあえずリファレンスになるようなヴィークルがあるといいいんだけど
知ってる限りではこいつくらいしかないんだよなぁ



処理の考え方 とりあえず路面追従のみする場合

・とりあえず速度ベクトルから”未来のタイヤ位置”を調べる
 
 この辺はタイヤの位置と角度の制御がセントラルコントロールだと楽です
 計算に必要なパラメータが全部揃ってるのでちょー簡単

 で、ルートプリムの位置と 回転と 速度ベクトルを調べて
 1フレーム(約0.035秒)後のタイヤの位置座標を計算します
 単純に速度ベクトルを0.035倍するだけでOK

・RCを実行する
 
 でそのタイヤ位置から
 ローカル座標系(ルートプリムをゼロ位置ゼロ回転とする座標系)で
 それぞれのタイヤの未来位置から
 Z軸のプラス50センチからZ軸のマイナス1mに向かってllCastRayを実行する
 検出の最大数は 子プリム検出とかしないなら最大でも2でいい
 UUIDはルートプリムのものを拾うようにしとくと
 自社検出を効果的にフィルタリング出来るはずだ

 ノーマルのベクトルはいらん どうせ使わん

 これを変換すればタイヤの未来位置における”接地面までの高さ”が出る


・タイヤをストロークさせる
 理想的なサスペンションシステムは
 車体をロールさせずに完全に垂直にストロークするので
 とりあえずタイヤのストローク位置はRCの数値そのままオフセットすればOK

 ストローク量が一定以上の場合は
 フルバンプとフルリバウンドの位置で止める処理入れとくとええ


ソースを使わず大体の流れをまとめると大体こんな感じ


サンプルコード書くとタイヤ位置ごとにRCを実行して高さをfloatで返すだけの関数を
4回実行するだけでいけるからちょー簡単なんだけど

ルートプリムからのタイヤの初期位置 の定義が無いとそこが厄介なのよねぇ





でもって荷重移動を足す

でまぁ これに荷重移動によるサスペンションストロークを足したいってなるわな?
ストローク最終決定する前にRCの生データを足せばOK 簡単だな


タイヤ”だけ”を考慮した場合はこれでいい





でまぁこれが一番厄介な箇所になるんだけど

実際のところほとんどのSLの地上ヴィークルには
当たり判定のための通称"ソリ"がついているのだ

こいつを4輪がまともに接地するように調整するのがまぁかなり厄介なんだけど

ピッチングのみを制御するならまだなんとかなる
ローリングのみでもまぁなんとかなるな

複合した場合
タイヤ4つが同時に接する”ソリ”の回転と位置を合わせることになるんだけど

むしろソリを回転させてから
それに合わせてホイールをストロークさせたほうが楽だな

となると さっきのRCの計算ともちょっと違うねぇ

でそのホイールのストロークでもサスペンションのフルバンプは出るわな?
でそうなった場合挙動にリミットがかかるわけかんだけど

その辺はピッチとロールの数値で直接リミッターかけたほうが多分楽だよなぁ

底辺と角度が決まってるからArcCosでRだしてからのRsinθか?
この辺の式は整理すればもうちょいわかりやすい構造になるはずだけどなぁ

ああ普通に tanθx(底辺Y) でストローク出るかいけるじゃん

変に合成ベクトルでやろうとしなけりゃいけるな


大体の考え方はこれでいけるはずだから
後は誰かが頑張って実装してください だなぁ


計算の順序は ソリをピッチとロールさせて
それに合わせて4輪のストローク量を決定して

そこから更に接地分を足す と



んでこれ前荷重状態で地面がなくなった時の挙動が厄介か? いやそうでもねぇか
ある程度真面目に方程式を解けば
イニシャルDでやってた インの前輪だけ浮かすコーナリングとか
あのへんも実現出来そうではあるな



これで合ってるかどうかは実装してみんとわからんなぁ



ちなみにもっと雑な実装方法もなきにしもあらず
"ソリ"を先に回転させてコリジョンで挙動安定してから
RCで接地計測するの
時速20キロくらいまでならこういうガバガバ実装でもそこまで違和感出ないはずだ?

とりあえずこの辺かねぇ

以上

2017年12月2日土曜日

スクリプトから見た イベント時のSIMパフォーマンス改善方法について

まぁ2017年が終わるのに今更そんなカビの生えたネタかよみたいなところはありますが
 
未だに"ヌルい"運営してるところが結構あるという話を伝え聞きますので
今一度最新のトレンドも込で年末イベント向けのパフォーマンス改善の話とします
 
 
ちょー雑にチェックポイント

・SIMFPSが44.0を下回るとヤバイ
・SIMのスクリプトタイムが10を超えるとヤバイ
・軽くしたいならビジターは全員座らせろ

・装着スクリプト負荷のチェックは必須
 スクリプト総数15枚 スクリプトタイム0.05ミリ秒以内が目安

・アパレルで一着に3枚以上のスクリプトが入ってるのは異常と知れ
 特に今時パーツ単位でのリサイズやカラーチェンジのため"だけ"
 パーツ単位でスクリプトが入ってるのはおかしい
 5年以上前には既に入れなくてよくなってる

・スタッフやオーナーやメイン演者だから
 重くていいという道理は 無い
 特にオーナーとスタッフは
 ビジターに対する模範として徹底的に軽くしろ

・いくらそのSIMに取って重要な住民だろうと重いのはやめさせろ
 そいつのためだけにSIMを沈めるだけの覚悟があるなら別だが




んじゃ詳細

ctrl+shift+1を押して出る統計情報から

まず平時のチェック項目

・SIMFPSの確認
 44.0を切るようならアカンです
 逆に1.0くらいは割と色々な条件で落ちます

・アクティブなスクリプト
 大雑把に3000切ることを目指しませう

 普段土地レンタルしている土地ならスクリプト数は
 土地プリムの20%程度を目安に減らすことを目標としませう

 200プリムなら40程度 

・スクリプト実行
 ここが常に100%になることを最低条件とします

・時間
 常にフレーム合計時間が22.200ミリ秒を超える場合何かがおかしいです
 
 スクリプト時間 は10ミリ秒切ってることが最低条件
 ほんとは3くらいにしときたいんだけどねぇ

 逆に スクリプト時間と余暇 とフレーム時間合計 以外が
 1.0を超えるのも割とまずいです


・スタッフ・住民・常連客の装着スクリプト数とスクリプトタイム
 装着スクリプト数は平時で50枚未満 イベント中は20枚未満
 スクリプトタイムは0.1ミリ秒を切りませう
 0.1超えてる時点でスタッフとしては重すぎます
 ほんとは0.05切りたいところだけど最近だとちょっとむずかしい

 消費メモリは多少参考になるけど
 スクリプト数が多けりゃ普通にアカン数値になるので
 基本的にはスクリプト数とスクリプトタイムを観測すること

でまぁこの辺のチェック項目で一つでもボーダー越えたらアウトです




イベント時のチェック項目

・ビジターのスクリプト数とスクリプトタイム
 実際のところスクリプト数が150枚越えてたら問答無用でTPHOME対象
 警告してダメならBANでもOK
 それを理由にテロリストになる可能性はあるけど
 そったらそれはそれでARする理由になるのでOK

 50枚超えてる程度なら
 軽量化にご協力ください
 不要なHUD等を外してください
 という感じの"お願い"すりゃええ

 ほんとの理想は来客全員完全ゼロスクリプトではあるんだけど
 そんなことしたら服装の選択肢が極端に狭まる上に
 イベントの性質によってはそれが不可能な場合が多いので

 最低限のAOとかその辺の装着を許可した場合
 15枚くらいが最大値かなという感じ
 スクリプトタイムは0.06ミリ秒くらいまでは大目に見ませう

 超えるやつは両方共大幅に超えちゃうので個別対応でいい


・監視スタッフとしてのエスマネの有効性
 正直エスマネの上位スクリプト が使えないと
 イベント中のリアルタイム監視は無理HUDタイプの監視スクリプトは止まる
 ライブパフォーマンス系のイベントなら最低一人はエスマネが常駐しませう
 
 ある程度期間のあるイベントの場合は各種自動監視スクリプトを活用しませう




有用なスクリプト命令群

まず装着物一覧がUUIDで取得できる関数 HUDを除く
http://wiki.secondlife.com/wiki/LlGetAttachedList

からの 個別オブジェクトのスクリプト数 スクリプトタイム 等の取得
http://wiki.secondlife.com/wiki/LlGetObjectDetails

OBJECT_NAME,OBJECT_RUNNING_SCRIPT_COUNT,
OBJECT_TOTAL_SCRIPT_COUNT,OBJECT_SCRIPT_TIME

この辺取得すりゃ十分だな
これ使ったセキュリティーゲートを通ること自体を
プライバシーの侵害云々でゴネるようならお帰り願うしかないなぁ

ちなみに装着HUDの一覧は取得できないので
アバター全体から HUD以外の装着物の数値を引いたものが
HUDのスクリプト量になる

チェックタイミングは

これを使って通過時にすればOK セキュリティーゲート風にしときゃええな