FC2ブログ

頭と尻尾はくれてやる!

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


ヨッピーたこ焼きに挑戦してみた

【永久保存版】たこ焼きを家で作る時は○○を増やせ!たこ焼き皇帝に聞く自宅たこ焼きの作り方 - ぐるなび みんなのごはん
↑以前この記事を読んだ時に今度やってみよう!と思ってたんだけど、先日ようやくやってみた。

たこ焼き粉

↑ウチはいつも日清のたこ焼き粉を使う。お好み焼きの粉も日清製。

たこ焼き粉のレシピ

↑そのレシピによると粉100に水300ccとある。
いつもレシピ通りの割合で作ってる。つまり下の(1)に相当する割合だ。

(1)粉100g - 水300cc
(2)粉100g - 出汁400cc
(3)粉100g - 出汁500cc

上記の記事が勧めてるのは(3)のように粉の割合を下げるレシピなんだが、初心者向けには(2)の割合からスタートすれば、とあるので今回は(2)の割合で作ってみた(もっとも日清のたこ焼き粉は出汁入りなので使ったのは水)。

たこ焼きの材料

↑準備OK(画像には含まれてないけどチーズや紅生姜も入れる)。わくわくしながら作ってみたんだが、、、

記事にある通り固まりにくくなり、丸く焼くのがとたんに難しくなる!うまく丸くなるのは5割程度になってしまう。これで初心者向けだと?難易度高いぜ。
うまく焼けねえ!ってイライラして写真も撮ってないわ。

ただ、、、おいしい!!
声を大にして、、、いや、文字サイズを大にして書きたいほどおいしい。
この味だよ!どこかで食べたたこ焼きの味!
やわらかくて竹串で突き刺してお皿に入れるのさえ失敗することがあるほどのやわらかさ。
なるほど、粉と水の割合ってこういう影響あったのね、、、!知らんかったわあ。
作るの難しいけどこのおいしさは挑戦する価値がある。練習あるのみ、やな。


SCNPhysicsSliderJointで二つのオブジェクトをカチッと固定する

SCNPhysicsSliderJointはjoint部分に目標になる速度や角速度与えて直線運動や回転運動させたりなんて面白いことができる(他のSCNPhysicsHingeJointなどにはない)。それに関連して、
minimumLinearLimit
maximumLinearLimit
minimumAngularLimit
maximumAngularLimit
なんてプロパティがある。
直線運動と回転運動の可動範囲を指定できるんだけど、リファレンスによるとmin,maxともゼロにすると固定できるとある。
つまり、上記4つの値を全てゼロにすると二つのオブジェクトを固定できることになる?!
ということで試してみた。
で、なんでこれがうれしいかというと、、、物理エンジンを使う時により描いてる形状に近い形状で物理演算できるからなのよ。



↑こんな感じ。(1)から(3)までは
sceneView.debugOptions = SCNDebugOptionShowPhysicsShapes;
でPhysicsShapesを表示させてる。

(1) Blenderなどで作成したL字型のオブジェクトでオプションのSCNPhysicsShapeTypeKeyを
SCNPhysicsShapeTypeBoundingBox
とした場合。物理演算する形状がL字よりだいぶ大きい直方体になってる。

(2) 同じL字型オブジェクトに対しオプションを
SCNPhysicsShapeTypeConvexHull
にした場合。形状の一番外側部分を拾ってくれる(いわゆる凸包)ので大抵はこれでもよかったりする。ただL字の凹んだところまで物質があるような扱いになる。
これが許せない場合もあるかもしれない。そこで、、、

(3) 二つの直方体をSCNPhysicsSliderJointで接続した場合。それぞれの直方体に対して物理演算が行われている。

(4) 通常表示に変更


ただ動画をよく見ると接触した時にjoint部分がすこしずれてる場合がまれにある。
こういうのや処理時間なんかが許せる場合にはいい方法かもしれない。


脚の先にホイールを付けた3枚板ロボット

SCNPhysicsSliderJointで回転させてみる
↑この続き。
これだと脚を内側に折り込んだ時に戻れない、という状態に陥ってた。SCNPhysicsSliderJointのmotorMaximumTorqueプロパティでトルクを大きくしてもダメだった。
もしかして脚の先にホイール付けたらすんなり動くんじゃね?!と思って試してみた。

中央の板

↑これが中央の板。

脚とその先端に付いたホイール

↑脚とホイール。この二つでSCNPhysicsVehicleオブジェクトになる。
このSCNPhysicsVehicleオブジェクトを前後用に二つ作ってそれぞれ中央の板とSCNPhysicsSliderJointで接続する。
ホイールにはなんの推進力とかも与えず(単に地面との摩擦を緩和してくれることを期待してる)。
脚が動くのは前後同時にSCNPhysicsSliderJointオブジェクトにmotorTargetAngularVelocityを与える。



↑実際に動かしてみた動画。前後の脚の回転の向きを時々同時に切り替えてるが、、、
あかん。ホイールを付けても改善しないし計算が複雑になって悪い方向へ行ってるんじゃないか?とさえ思える。
トルクも不足してる。motorMaximumTorqueが効いてるとは思えない。同じタイミングで動かしてるはずなのに片方しか動かなかったりするし。
これでは強化学習には使えそうにない。
ういーーーーんって感じの動き方がロボットっぽくて気に入ってたんだけどなあ。


SCNPhysicsVehicleオブジェクトをjointで繋ぐ

SCNPhysicsVehicleで二輪車と一輪車
↑この辺りでSceneKitのSCNPhysicsVehicle使って二輪車を走らせてる。
これを
SCNPhysicsHingeJoint
SCNPhysicsSliderJoint
などで接続したら動くのかな?と思い試してみた。



↑二輪車のオブジェクトを二つ並べて以下のようなことをした。
(1)jointなしで走らせる
(2)SCNPhysicsHingeJointで接続
(3)SCNPhysicsSliderJointで接続
(4)平行移動拘束を追加
(5)モータによる駆動を追加

なんや動くやん!ってのが結論。

{
    SCNPhysicsVehicle *bicycle1;
    SCNPhysicsVehicle *bicycle2;

    float vehicleSteering = 15.0/180.0*M_PI;
    [bicycle1 setSteeringAngle:vehicleSteering forWheelAtIndex:0];
    [bicycle2 setSteeringAngle:vehicleSteering forWheelAtIndex:0];
}
↑走らせる時のステアリングの角度は両方とも同じなので普通に走らせると(1)のようにぶつかる。

{
    SCNPhysicsHingeJoint *joint = [SCNPhysicsHingeJoint jointWithBodyA:bicycle1.chassisBody axisA:zAxis anchorA:anchorP bodyB:bicycle2.chassisBody axisB:zAxis anchorB:anchorM];

}
↑jointはSCNPhysicsVehicleオブジェクトのchassisBody(SCNPhysicsBodyオブジェクト)同士で接続。

{
    joint.maximumLinearLimit = joint.minimumLinearLimit = 0.0;
}
↑(4)のSCNPhysicsSliderJointで平行移動を拘束するのはこんな感じで。

{
    joint.motorTargetAngularVelocity = -0.1;
}
↑(5)のモータで駆動する部分。


SCNPhysicsVehicleの車をx軸方向に走らせる

SCNPhysicsVehicleでシャーシとホイールの位置関係
SCNPhysicsVehicleで二輪車と一輪車

↑この辺りでいろいろとSCNPhysicsVehicleを使って車っぽいのを走らせてきたんだけど、これらは(APPLEのサンプルコードを含め)どれもz軸のプラス方向が前、というオブジェクトのデータだった。

APPLEサンプルの車

↑これはAPPLEのサンプルコードの四輪車。z軸プラス方向を向いてる。

z軸方向を向く一輪車
↑これはBlenderで作成した一輪車をXcodeに持って来たもの(動くとこは先のリンクで)。Xcodeのy-upの処理によりz軸プラス方向を向く。

x軸方向を向く一輪車
↑今回、元々のデータがx軸プラス方向を向いてるのを使おうとした。

これをいざSCNPhysicsVehicle使って動かそうとすると、、、 



おい!タイヤの回転軸おかしいやろ!ホイールがy-upしない?どうなってんだ??シャーシ接続時にホイールの姿勢を変えたりしても全然ダメ。
SCNPhysicsVehicleWheelのaxleプロパティをいじってもだめ。
何か方法があるんだろうか、、、?

結局データをz軸方向へ進むように作成しておく方が安全ということかな。


なお、そのようにz軸方向へ進むようなデータを作っておいて、シャーシ(SCNNodeオブジェクト)をy軸周りに90度回転(※)させれば、



↑このようにx軸方向へ進ませることができるので、やはり元データをz軸方向へ進むようにしておけばなんとかなりそう。


(※)リファレンス通りホイールはシャーシの下階層に位置してる。

シャーシとホイールの階層関係

↑Xcodeで確認するとこういう階層になってるべき、らしい(けどそうじゃなくても動いたりする)。



macOS High Sierra 10.13.6





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

FC2Ad