Heliodor 2019/05/24 21:23

続・物理演算

前回の続きです。
最近は色々と物理演算(Box2D)のテストみたなことをやってました。

昔すこし触ったBullet Pysics で試してみようかとも思ったのですが、今回の触手であれば2Dで十分だなという事に気づき、結局 Box2D に戻りました。

おさらいですが、現在作っている触手の構造としては、空中に適当な物体(Static)を配置し、そこから10個程度の棒(Dynamic)をダラリとぶら下げる、というものです。
本体と棒の接続には b2RevoluteJoint という回転ジョイントを使い、棒同士はそれぞれ b2WeldJoint で弾力を持って固めてあります。

本体との接続部にだけ b2RevoluteJoint を使っているのは、このジョイントにモーター機能があるからです。
回転速度と最大トルクを指定して EnableMotor(true) で電源を入れるとクルクル回ってくれます。

棒同士を b2WeldJoint で固めてあるのは、棒と棒がある程度の弾力を持って左右に振れてほしいからです。
b2WeldJoint には referenceAngle というパラメータがあるので、それで指定した角度を中心ちとしてユラユラ振れてくれますし、外力がなくなれば自然と referenceAngle な角度に戻ります。良い感じです。

しかし b2WeldJoint だと接続角度の範囲が指定できないんですよね。力がかかればどれだけでも曲がってしまうという……。
その点 b2RevoluteJoint では lowerAngle と upperAngle で範囲が指定できますので、こちらの方が目的に適っているという気もします。どちらがふさわしいか等、まだまだ研究が必要ですね。


ところで、ライブラリを見たら b2MotorJoint という(名前的には)その物ズバリな奴があったので、中心に置いてあった b2RevoluteJoint の代わりにそれを入れてみたのですが、完全に想定外の動きをしたんですよねコレ。???と思ってよくよくドキュメントを読んでみると、

A typical usage is to control the movement of a dynamic body with respect to the ground.

と書いてありまして、地面に対するボディの制御に使うとかっていうのは、思ってるようなモーターとは違うのでは…?となり、結局 b2RevoluteJoint のモーター機能に戻りました。調べてみると、これは例えば波の上でゆらゆら動き続けるといった動きを実現したりするのに使うみたいですね。紛らわしいッ。



そんなわけでいろいろ試行錯誤しているのですが、プログラムを書き換えてそのたびにゲームを起動して動きをチェックする、というのも面倒になりまして、楽をするために触手専用アニメーションエディタを作ろうという結論に達しました。
触手のある敵は他にもいっぱい作るし、今後もエロゲー作るのに触手エディタは決して無駄にならないハズ。

さしあたり現在製作中のゲームで動かしている触手くん(仮)の編集をするのが目的なので、エディアもゲームエンジンをそのまま利用して作るのが自然だろうと思いまして、簡単なエディタを組んだんです。それでとりあえずそのエディタの世界に触手くん(仮)を置いてみたのですが、なんせ触手くん(仮)のコードを丸ごと移植したので、エディタの中で勝手に移動するんです。

オーラとか白濁液とかもまき散らすし……。
放っておくとプレイヤーを探して勝手にエディタから出ていくんでよこいつ。けしからんヤツです。
なのでエディタの中心にむりやり押さえつけて動かないようにしています。

行動パターンのなかに「エディタモード」を追加しておとなしくさせようかとも思ったのですが、エディタ専用の行動パターンを入れるというのもなんだかバカらしいのでやめておきました。

というか、本来なら触手くん(仮)の行動プログラムとアニメプログラムを分離しておいて、エディタではアニメの部分だけを編集させるべきなのですが、割と初期の頃に作り始めた敵なうえにいろいろと仕様変更が重なって、行動とアニメが完全に一体化したソースコードになっていたのです……。


果たして理想の触手が生まれる日は来るのか。
ひたすら触手をうねうねさせるという他人から見たら正気を疑われる実験は続く。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索