SLの四輪等の車は旋回時にフロントタイヤの向きが変わるギミックが仕込んであるわけですが、その際にハンドルを逆に切るとタイヤがうねって取れそうな感じの挙動になる事があります。
タイヤを速度によってllTargetOmegaで回転させ、llSetRot(実際はllSetLinkPrimitiveParamsFastを使ってると思います)で旋回させている車が大半なわけですが、左右に軸が反転する事でTargetOmegaの回転角度がおかしくなるからだと思うのですが、大半のメーカーではこのままになっており対策はされていません。
対策しないのは、まずボディーに隠れてタイヤが運転手からほぼ見えないので気にならないからと、対策取るだけのスクリプターが居ないからだと思います。現状の車屋さんの多くはDTやらACRやらなにやらの商材を突っ込んで、あとは性能差を出すための数値調整くらいしかやらないので。
さて、そこでは対策です。
フロントタイヤの処理としては、通常状態でのまっすぐ、A入力によって左向き、D入力によって右向きの3状態になり、あとは車体の速度を拾ってTargeOmegaで回転させていると思います。
まず、タイヤの状態を保持する変数を用意します。
integer TireAngle = 0;
//左向きなら-1、右向きなら1、まっすぐなら0
といった具合です。
次に旋回処理ですが、
if(A入力){
車体を左旋回;
タイヤを左向きに;
}else if(D入力){
車体を右旋回;
タイヤを右向きに;
}else{
車体の旋回をしない;
タイヤをまっすぐに;
}
といった感じにしてあると思います。そこでこの処理を
if(A入力){
車体を左旋回;
if(TireAngle==1){
タイヤをまっすぐに;
TireAngle==0;
}else{
タイヤを左向きに;
TireAngle==-1;
}
}else if(D入力){
車体を右旋回;
if(TireAngle==-1){
タイヤをまっすぐに;
TireAngle==0;
}else{
タイヤを右向きに;
TireAngle==1;
}
}else{
車体の旋回をしない;
タイヤをまっすぐに;
TireAngle==0;
}
といった感じに変えます。これで既にタイヤが逆になっている場合に、一回まっすぐにしてから逆に向きを変えるになります。つまり軸をまたいでの旋回を行わないようにします。
これによりタイヤの向きの変更がワンテンポ遅れる事にはなるのですが、何度も何度も逆にハンドを切るなんて事も少ないでしょうし、そういう場合にタイヤがバタバタしてもしょうがないしね。
うちの場合はタイヤが60~-60の範囲で旋回するようにしてるとか、メーカーによってはカウンターを当ててる演出で入力とタイヤの向きが逆になるギミックがあったりだのすると思いますが、それがやれるなら、これみてどう変えればいいかも分かると思います。
これで走行時の見た目が少しは良い感じになるんじゃないかなーと思います。
#secondlife #セカンドライフ
0 件のコメント:
コメントを投稿