こんにちは。プログラマーのAです。現在『Warlander』チームでギミックやネットワークの処理を担当しています。今回は私が担当したところから、物理オブジェクトについて工夫した点などをご紹介します。
ギミック破壊
ギミックを破壊すると破片が発生します。これらの挙動は物理エンジンで制御しています。
形状は直方体プリミティブで表現しています。開発当初は、複雑な形状に対しては凸包(convex hull)を使わないと不自然になるのではないかと考えていましたが、破片がすぐに消滅することもあり、特に要望が上がってきませんでした。なので結局最後まで凸包を使用することはありませんでした。
破片のメッシュは数が多いため個別にパラメータを入力するようなことはしていません(2024年8月1日時点で 約7,200種類)。直方体の三辺の長さは描画メッシュのバウンディングボックスから算出しています。まず、バウンディングボックスは大きさが膨らみがちなので一定の係数で縮小します(ひとまわり小さくなるくらい)。次に、一番長い辺を 1.0 として正規化した値に対して1.5乗し、元の長さに乗算します。
辺の長さ *= (辺の長さ / 最長辺の長さ) ^ 1.5
この処理をグラフにすると以下のようになります。1.0 を入力すると 1.0 のままなので、最長辺の長さは変わりません。最長辺と比べて短いほど値はより小さくなります。
この処理により、薄いものはより薄く、細いものはより細く、というように形状が加工されます。実際に見ていきます。
加工しない場合は物が倒れにくくなります。
加工した場合はより薄くなるので、倒れやすくなります。やはり薄いものは倒れたほうが人間の目には自然に感じるのではないか、と考えてこのような処理を行っています。
加工しない場合の形状です。
加工した場合の形状です。より薄くなっているのが分かります。
樹木破壊
樹木を破壊したあとも物理オブジェクトが発生しますが、こちらは破壊後にそれっぽく倒れるようにしたかったので専用の形状を設定しています。
物理プリミティブのみの表示です。実際の見た目とはかけ離れた形状になっているのが分かります。
描画メッシュと物理プリミティブを合わせた表示です。
様々な形の樹木がありますが、すべて立方体と円柱を組み合わせた形状になっています。立方体の中心を円柱からすこしずらすことで、必ず倒れるようにしています。また、立方体を斜めに回転して配置することで、倒れたあとすぐには安定せずゴロゴロ転がるようにしています。
最後に
いかがだったでしょうか。このようにプリミティブを使うことで、凸包を使うよりも軽い処理で動作できているんじゃないかと思います。また、物理演算のような機械的な処理においても、それっぽい動きになるように形状を工夫しているのがお分かりいただけたかと思います。
みなさまの参考になれば幸いです。