趣味のプログラミング(4)
「趣味のプログラミング(3)」の続きです。
2024年4月1日
先月に引き続き、『2足歩行ロボットの3D描画』のリファクタリングを進めています。
リファクタリング#1: ModelVerticesクラス
・面描画、線描画、テクスチャ描画の頂点データリストを持つコンテナクラスを設ける。
リファクタリング#2: ModelBaseプロトコル
・すべてのモデルの基底プロトコルで、面描画、線描画、テクスチャ描画の頂点データのそれぞれのリストを取得するメソッドを一つにまとめ、ModelVerticesオブジェクトを取得するメソッドへ変更。
リファクタリング#3: すべてのモデルクラス
・ModelBaseプロトコルを持つすべてのモデルクラスの面描画、線描画、テクスチャ描画の頂点データのそれぞれのリストを取得するメソッドを一つにまとめ、ModelVerticesオブジェクトを取得するメソッドへ変更。
リファクタリング#4: Rendererクラス
・モデルクラスからの頂点データの取得をModelVerticesオブジェクトを取得するメソッドへ変更。
2024年4月2日
『2足歩行ロボットの3D描画』のリファクタリングの続き。
リファクタリング#5: ModelBase基底クラス
・ModelBaseプロトコルを、基底クラスに変更して、面描画、線描画、テクスチャ描画の各頂点データリストの定義と、ModelVertices取得メソッドの実装を集約。
リファクタリング#6: すべてのモデルクラス
・継承しているModelBaseプロトコルを、基底クラスに変更したことにより、モデルクラスから、面描画、線描画、テクスチャ描画の各頂点データリストの定義と、ModelVerticesオブジェクトを取得するメソッドを削除。
2024年4月3日
『2足歩行ロボットの3D描画』のリファクタリングの続き。
リファクタリング#7: ModelBase基底クラス
・各モデルクラス内で実装してたモデルオブジェクトの面描画、線描画、テクスチャ描画の各頂点データリストのマージや回転を処理していたメソッド(rotateToVertices、copyToVertices)をModelBase基底クラスへ集約。
リファクタリング#8: すべてのモデルクラス
・ModelBase基底クラスへ集約したメソッドの実装を削除。
・ModelBase基底クラスへ集約した新しいメソッドの呼出しへ変更。
2024年4月4日
『2足歩行ロボットの3D描画』のリファクタリングの続き。
リファクタリング#9: ModelTreeクラス
・モデルを木構造で構築する際の要素となるクラスを設ける。
・要素モデル、接続する親モデルとの相対的な3次元座標、回転角度、サブツリーリストを持たせる。
リファクタリング#10: RobotWalk01クラス
・歩行動作を行う2足歩行ロボットのクラスで、ModelTreeクラスを用いて2足歩行ロボットの基本モデルを組み立てるコードの実装を行う。
元のRobotWalk00クラスのコードを元に、書き換え実装中です。
2024年4月5日
リファクタリング#10: RobotWalk01クラス
・実装継続中…☹️
2024年4月6日
リファクタリング#10: RobotWalk01クラス
・ModelTreeオブジェクトによるモデル要素の配置メソッド実装難航継続中…☹️
2024年4月7日
リファクタリング#10: RobotWalk01クラス
・先日にひきつづき難航継続中…☹️
2024年4月8日
リファクタリング#10: RobotWalk01クラス
・先日までは、ModelTreeオブジェクトのツリーをベースとしていたが、異なるアプローチで実装を試行中…☹️
2024年4月9日
リファクタリング#11:JointTreeクラス
・モデル要素のツリー構造から、関節点のツリー構造へ転換するためのJointTreeクラスを実装。
リファクタリング#12: RobotWalk01クラス
・JointTreeオブジェクトで関節点のツリー構造を試行実装中…☹️
2024年4月10日
リファクタリング#12: RobotWalk01クラス
・JointTreeオブジェクトで関節点のツリー構造を試行実装中…☹️
2024年4月11日
リファクタリング#13: RobotWalk01クラス
・JointTreeオブジェクトで関節点のツリー構造を試行実装してみたが、なかなかイメージ通りの動作を得られず、再び色々と試行中…☹️
2024年4月12日
リファクタリング#13: RobotWalk01クラス
・色々と試行中…☹️
2024年4月13日
リファクタリング#14: ModelUtilクラスrotateメソッド
・JointTreeオブジェクトを使ってイメージ通りの動作が得られない原因を色々と調べ、ようやくModelUtilクラスrotateメソッドに原因があることを突き止め、実装の書き直し。
3次元座標を回転させる際の計算については、『回転座標変換行列』を用いた計算に書き直した。なお、これまで、用いていたロジックは、2017年6月頃、(Winodws OS環境の)Microsoft C# を使った 3DCG 描画で実装していたロジックを転用したものでしたが、特定の回転パターンで期待通りの結果が得られず、今回のような用途には限界があったようです。😞
リファクタリング#15: RobotWalk01クラス
・JointTreeオブジェクトで関節点のツリー構造を実装し、関節点の間を線描画で繋ぎ、2足歩行で用いた関節の動作を適用してみました。
2024年4月14日
リファクタリング#15: RobotWalk01クラス
・実装した関節点のJointTreeオブジェクトのツリー構造に、モデル要素を貼り付けて動作を確認してみました。すると、残念ながら、特定の関節点の回転に対して、期待通りにモデル要素が描画されない現象を確認してしまいました。
再び、楽しい楽しい原因調査の再開です。😭
2024年4月15日
リファクタリング#15: RobotWalk01クラス
・JointTreeオブジェクトのツリー構造を元にモデル要素の描画する際の回転時の座標計算の問題を検出し訂正し、期待通りにモデル要素が描画されることを確認しました。
今回の原因調査は、あっけなく終了し、ホッとしました。
リファクタリング後の旋回歩行を実行してみました。
なんとか、うまい具合にリファクタリングできているので、リファクタリング前と変わり映えしていません。😣
2024年4月16日
モデル構築ロジックのリファクタリングを行い、簡単に関節点に動きを与えられるようになって、ちょっとだけ変化を付けてみました。
今回、モデル構築部分のリファクタリングの一環として、回転処理(ModelUtil.rotateメソッド)の書き換えを行いました。もう一つ座標の回転ロジックを持つビュア側も、モデル構築側にあわせて書き換えしてみたいと思います。
2024年4月17日
ビュア側のリファクタリングの前に2足歩行の微調整。
ビュア側の回転処理をリファクタリングしましたが、今のところ、変わり映えしていません。
2024年4月18日
試しに翼のようなものをイメージして、試作中…
2024年4月19日
翼のようなものをイメージして、試作中…
2024年4月20日
翼のようなものをイメージして試作しました。
翼の試作は、鳥の翼の構造について調べ参考にして、ざっくり実装した感じです。二次元的な描画としては、それなりに翼のように見えると感じていますが、三次元的には、翼に厚みを持たせていないことが課題として残ります。もし、羽根のモデルに厚みを持たせた場合、(自然の羽根のように)羽根同士の干渉を回避することは難しいと考えています。😔
2024年4月21日
2足歩行ロボットの描画で、リファクタリングを行い、思いつきで翼のイメージの描画を行いましたが、JointTreeオブジェクトのツリー構造による3D描画は格段に生産性を上げることができました。相変わらずモデル要素の編集手段がアナログ的なままですが…
そろそろ次のテーマを決めようと、思案中です。
以前、3D描画ネタとして、『ドローンの3D描画』を挙げていましたが、現段階では、今一つその気になれていません。😔
あと、翼のイメージの描画のような、関節点の多いものとして、ムカデやゲジゲジなど節足動物も考えましたが、どうも、あまりいい印象がしないので控えます。
多関節関連で、いろいろとネットで検索してみて、『ロボットハンド』があがってきたので、『ロボットハンドの3D描画』にトライしてみようと思います。
(仮に『ロボットハンドの3D描画』が実装できても、『2足歩行ロボット』の手の部分に適用させるかどうかは、後ほど改めて検討予定とします)
2024年4月22日
『ロボットハンドの3D描画』の準備として、左手のサイズを採寸。
そして、採寸したサイズを元に『ロボットハンド』のJointTreeオブジェクトのツリーを試作。
2024年4月23日
モデル要素としての「手のひら」部分の採寸を行い、JointTreeオブジェクトの座標を補正。
2024年4月24日
モデル要素「手のひら」を、地味に座標を起こしながら実装中。😔
2024年4月25日
引き続き、モデル要素「手のひら」を、地味に座標を起こしながら実装中。😔
2024年4月26日
一旦、一通りのモデル要素を揃えて、つないでみました。指のモデル要素の接合部分は、ざっくりと四角錐のような形で突き刺した感じです。これまでのロボットアーム、2足歩行ロボットのモデル要素の接合のような感じにするのは、厳しそうです。特に親指の接合部分の見栄えを良くするのが難しそうです。😅
2024年4月27日
手のひらの形を見直し、指のモデル要素の接合部分に接合部品のモデル要素を追加してみました。
2024年4月28日
気になっていた親指の結合部分を見直し、改めて、手のひらのモデル要素を整形しました。
ようやく、指の動きを付けた動画を収録することができました。
(2024/4/29 動画のリンクを取り下げました)
2024年4月29日
手で表現するハンドサインについて調べ、さまざまな表現がある事が分かりました。また、国によって解釈が異なり、日本ではポジティプな表現であっても、海外では、ネガティブな表現となり注意が必要であることも分かりました。
先日アップした、動画の中で、『グー、チョキ、パー』を行なっている箇所で、『チョキ』は『ピースサイン』と同じポーズですが、国によって、ネガティブな表現となるため、取り下げました。そして、改めて撮り直した動画(リンク)をアップします。
2024年4月30日
今回作成した『ロボットハンド』を『2足歩行ロボット』に接続出来るかどうかについて、スケールを合わせてイメージを並べてみました。
この画像からも判るように『2足歩行ロボット』のスケールに合わせた『ロボットハンド』は、線描画で潰れてよくわからない状態になっています。今回、Metal の線描画機能では、(線幅が選択ができず)大きい図形だろうが細かい図形だろうが線幅が変わらないので、細かい図形の場合、線描画が相対的に太い線になり荒い描画になってしまう事が分かりました。😖
ここまでの振り返り
2足歩行ロボット描画のリファクタリング
・以前から利用していたrotateメソッドのロジックの問題に気づかず、しばらく手間取ってしまい若干苦労しました。なんとか、モデル要素接続のための頂点座標計算ロジックを整理し基底クラスのメソッドに集約し、サブクラスでは、関節点の木構造を用いて、複数のモデル要素を結合してモデルを構成させる事ができるようになりました。
2足歩行ロボットへの翼描画の追加
前述のリファクタリングで構築した関節点の木構造の応用として、左右対称の翼の描画を試作し、2速歩行ロボットへ追加しました。片側の翼の30枚の羽根の付け根や、羽根の付け根の骨格部分に関節点を設け、木構造として構成し、それぞれの間接点に回転角度を与えるだけで、翼を開く描画が実装できています。
ロボットハンド描画
前述の翼描画同様、間接点の木構造の応用として、ロボットハンド描画を試作してみました。5本の指の関節を関節点として木構造を構成し、それぞれの間接点に回転角度を与えて、指の動きの描画を実装できています。
今回のロボットハンドの描画では、親指の付け根の部分の手のひらのモデル要素の整形に多少苦労しました。今回、親指の第一間接部分は手のひらの一部として整形してしまいましたが、本来なら、第一間接部分も可動するようにすべきだったと思いますが、その接続部分の整形について難度が高いと感じています。
今回のロボットハンドの描画では、親指の付け根や、指先同士で干渉している箇所が多々見られますが、柔らかい樹脂で構成されたモデルという事で寛大に見たいと思います。😅
全般について
やはり、モデル要素の頂点座標の書き出しに苦労しています。特にロボットハンドの『手のひら部分』は見直しを行い整形し直していますが、手作業で行うのは辛いと強く感じました。やはり、もう少し簡単にモデル要素の編集(頂点座標の生成)が行えるようにしたいです。😭
続きは、次のNote に掲載します。