FC2ブログ

頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


SCNPhysicsHingeJointで謎の誤差

SceneKitで作る振り子

↑SceneKitでこういう振り子を作るのに、振り子のオブジェクト(ここでは直方体)を空間にSCNPhysicsHingeJointで固定している(横の支柱は今回は物理演算には関係のない飾り)。

この時のコードはこんな感じ↓
{
        SCNVector3 xAxis = SCNVector3Make(1.0 , 0.0 , 0.0);
        SCNVector3 anchor = SCNVector3Make(0.0, pendulumHeight/2.0, 0.0);
        SCNPhysicsHingeJoint *hingeJoint = [SCNPhysicsHingeJoint jointWithBody:pendulumNode.physicsBody axis:xAxis anchor:anchor];
        [mainScene.physicsWorld addBehavior:hingeJoint];
}
これでx軸方向のベクトルを中心に回転するjointが設定できる。振り子にトルクをかければちゃんと振り子のように動く。
ここまではいいんだけど、この時振り子の位置を確認すると、なんだかよくわからない誤差がある。

SCNNodeオブジェクトの位置・姿勢が取得できない
なおこういう場合、位置は↑のように pendulumNode.presentationNode から得る。

上のコードで pendulumHeight=2.0 、回転軸の高さがy=0なら初期の静止した状態の高さyは-1.0のはずが -1.014 とかになってしまう???

なんや、その誤差は?

振り子の付け根部分のずれ

↑本来なら棒の端と板の端は同じのはずが、確かにずれてる。

以前使ってたBulletという物理エンジンのことを思い出すと、まあこういうジョイント部分もオブジェクト同士(今回はオブジェクトと空間だけど)がかっちりくっついてるかというとそうでもなく、力をかければちょっとは離れる、といった計算になることも多分ある気がする。
もしかしてSCNPhysicsHingeJointに”固さ”というかそういうパラメータがあるのかな、と思ったけどリファレンスを見る限りなさそう。
オブジェクトの重さで重力方向に下がってしまっているのか?と思い質量を変えてみたけど、この値に変化はなし。
うーん、なんだろうなと思って重力加速度をゼロにしたら誤差はなくなった!
よくわからないけど、なんかそういう仕様になっているようだ。

深く考えるのはよそう、だってSceneKitだもの(みつを)。

<< Macで一太郎のjtdファイルを見る  TopPage  SCNNodeオブジェクトの位置・姿勢が取得できない >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1140-b7ecc25d




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad