FC2ブログ

頭と尻尾はくれてやる!

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


SCNPhysicsSliderJointで回転させてみる

SceneKitでオブジェクトのヒンジっぽい接続と言えば文字通りSCNPhysicsHingeJointを使ってた。
SCNPhysicsSliderJointってのもあるけどこれはスライドドアみたいなのを表現するのに使うのだと思っていたし。
ところがこのSCNPhysicsSliderJointはどうやらヒンジっぽいのも表現できることに気付いた。しかも目標速度を与えてジョイント部分で回転(移動も)させることができるらしい!
ってことで試してみた。

実装自体はSCNPhysicsHingeJointとさほど変わらない。
+ (instancetype)jointWithBodyA:(SCNPhysicsBody *)bodyA axisA:(SCNVector3)axisA anchorA:(SCNVector3)anchorA bodyB:(SCNPhysicsBody *)bodyB axisB:(SCNVector3)axisB anchorB:(SCNVector3)anchorB;
という生成メソッドはSCNPhysicsHingeJointと全く同じ。

今回は回転させたいので
{
    sliderJointL.motorTargetAngularVelocity = 1.0;
}
てな感じで指定する。ちなみに移動させたい場合はmotorMaximumForceというプロパティがある。

可動範囲は下のような感じで指定できる。
{
    sliderJointL.maximumAngularLimit = AngleLimitMax;
    sliderJointL.minimumAngularLimit = AngleLimitMin;
}


↑手動でmotorTargetAngularVelocityの値を変えてる様子。
可動範囲のはしっこでプルプルしてるのはご愛嬌、、、?

うまくいってるように見えるけど最初意図通り動かず相当悩んだ。
-(void)control1
{
    sliderJointL.motorTargetAngularVelocity = -TargetAngularVelocityABS;
    sliderJointR.motorTargetAngularVelocity = TargetAngularVelocityABS;
}
↑タップ時にこんな感じで値を指定するんだが、なぜか全く動かない。トルクが足りないわけでもなく、、、なぜか動かないのだ。
motorTargetAngularVelocityの値を途中で変更しても問題ないはずなんだけどなあ。

試行錯誤してようやくたどり着いたのが、、、
-(void)control1
{
    [scene.physicsWorld removeBehavior:sliderJointL];
    [scene.physicsWorld removeBehavior:sliderJointR];

    sliderJointL.motorTargetAngularVelocity = -TargetAngularVelocityABS;
    sliderJointR.motorTargetAngularVelocity = TargetAngularVelocityABS;

    [scene.physicsWorld addBehavior:sliderJointL];
    [scene.physicsWorld addBehavior:sliderJointR];
}
SCNPhysicsSliderJointオブジェクトを一度physicsWorldから取り除いてサイドaddしてやる、というなんだかよくわかんない処理をすればなぜか動いた。
あまり深く考えるのはよそう、だってSceneKitだもの(みつを)。

<< SCNPhysicsVehicleの車をx軸方向に走らせる  TopPage  SceneKitで動ける次元を拘束する >>

コメント


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

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1165-2119b06a




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

FC2Ad