3Dキャラの作り方を真似できる動画に ― ハコブくんの7つの手順を Blender と Unity で
この記事の素材(コード・ログ・データ 5ファイル・まとめてダウンロードあり)arrow_downwardAIで読む ChatGPT・Claude などで、この記事に質問できます expand_more
マンガのキャラクターを3Dにした作業は、手順に番号を付けて、どの手順がどの道具かを画面で分けると、見た人が同じ順番で作れる解説動画になる。 4コママンガ『ハコブくん』のロボットのハコブくんと、看護師の大城さんを 3DCG にした作業(LOG496)を、9分05秒の YouTube の解説動画「マンガのキャラを3Dにする7つの手順 Blender と Unity で作ってみた」にした。台本から声・図・書き出し・サムネイル・概要欄・投稿文まで、1つの会話で Claude が作り、エイイチが途中で見て直す所を決めた。
この動画づくりで、次のことが変わる。
- 3Dを作りたい人が、7つの手順をそのまま追える。手順1・2は準備、3〜6は Blender(3Dの形を作る無料のソフト)、7は Unity(ゲームや場面を動かすソフト)と、画面の札で分けた
- 次に「作り方の回」を作るときは、決まり(動画の決まりの文書 video_rules.md の2節28と4-4e)を読めば、同じ形で始められる。手順に番号を付ける、謎解きは無理に入れない、画像を見せる所ではカードを隠す、などを書き足した
- 失敗した時の絵が残っていなくても、直す前のコードから描き出し直して見せられる。袖が裂けた絵3枚を、サイトの GitHub に残っていた直す前のコードで描き出した
動画1本にかかった時間は測っていない。作業フォルダのファイルの時刻では、台本の2版から公開用の一式までが 16:38〜21:33 だった(台本の1版を書き始めた時刻は残っていない)。次の作り方の回で、同じ区切りで時間を記録して比べる。
きっかけは、病院の搬送ロボットのシミュレーションのために作った2人の3Dだった。人を青い筒、ロボットを白い箱で表していたシミュレーションでは、看護師さんがどこに立ってどう薬を受け取るかが見えない。そこで受け渡しを近くで見せるための3Dを作り、その作り方を動画にした。作る途中では、首が長すぎた、肩がいかつすぎた、袖が3回裂けた、と失敗が続いた。動画ではその失敗もそのまま見せている。
| やったこと | なぜ | 結果 |
|---|---|---|
台本を「作る順番の7つの手順」で書き直した | エイイチから、見た人が自分で再現できる順番を説明するよう指示があったため | 78文・9分05秒。謎解きの形と立ち位置の話は外した |
画面の形を「大文字型+動きあり」にした | 手順の名前と道具の名前を大きく見せるため | 手順の一覧に 準備・Blender・Unity の札を付けた |
画像を見せる場面ではカードを一時的に隠した | カードを右へずらして画像と並べると、どちらも見えにくいため | 場面の半分ほどまで画像だけを見せ、そのあとカードを出す |
| 袖が裂けた絵を描き出し直した | 当時の絵がどこにも残っていなかったため | 直す前のコード(p2m-site のコミット e3daa10)から、1回目・2回目・3回目の3枚 |
| 読み間違いを直した | 「首長すぎ」と「角(かど)」を声が違う読みで読んだため | 読みの表に足し、その文だけ声を作り直した |
公開した記事 LOG496 と台本を、別のエージェントに1文ずつ突き合わせてもらった | 書いた本人が確かめると同じ見落としをするため | 9か所を直した |
この記事の数字は、作業フォルダのファイル(台本の narration.py・場面の時間の表 timeline.json・書き出した動画)から読んだもの。効果の欄のうち、見た人が実際に作れるかは見込みで、動画のコメントと、記事のコードを使った人の反応で確かめる。
作業ログ ― 台本を「作る順番の7つの手順」に書き直した
最初の台本(1版)は、謎解きの形で書いていた。3Dのハコブくんを初めて見た時の感想と、看護師さんの立ち位置の話を、謎として置く形だった。台本を見せたところ、エイイチから次の指示があった。
何が分かったか(謎)…無理して入れないで。3Dを構築していくための作業の順番を説明するようにしてください(どのように進めれば、ユーザー自身で再現して作れるかを教えてください)
立ち位置の話については、謎というには小さすぎる、という判断だった。そこで2版は、作る順番を7つの手順に分けた。
| 手順 | 中身 | 道具 |
|---|---|---|
| 1 | 使い道と、見た目の決まりを先に決める | 準備 |
| 2 | 元の絵(マンガの三面図)と、大きさをそろえる | 準備 |
| 3 | 形を数字で作る(Python のコードで Blender を動かす) | Blender |
| 4 | 絵に描き出して、2人を並べて直す | Blender |
| 5 | 骨と顔を入れる(骨の名前は Unity の人型の決まりどおり) | Blender |
| 6 | ポーズを付けて、服や肌が破れないかを確かめる | Blender |
| 7 | FBX のファイルで Unity に渡し、借りた動きで動かして撮る | Unity |
FBX は、3Dの形と骨をまとめて別のソフトに渡すためのファイルの形式。Unity はこのファイルをそのまま読める。
台本で決めた4つのこと
エイイチの指示から、台本の書き方を4つ決めた。
- 最初に「何に使うための3Dか」を言う。病院の薬の受け渡しを近くで見せるため、を冒頭の2文で言う
- 言葉は平易にし、難しい言葉は要所だけにする。骨(ボーン)は「見えない棒」、FBX は「Unity がそのまま読めるファイル」と言い換えた
- 面白くない所は早送りで飛ばす。大城さんの形を15回作り直した所と、Unity での細かい直しは早送りにした
- 真面目なだけにしない。「ハコブくん、ついに体ができました。……腕は、まだありません。」「人間の首は、数字を変えても短くなりません。3Dの、いいところです。」のような一言を、手順ごとに1つずつ置いた
途中で、エイイチから Blender と Unity の区別について指摘があった。
どこまでがBlenderでどこまでがUnityかがわからない
台本に「形を作るのは Blender。動かして撮るのは Unity。」の1文(手順3の頭)と、「ここで、Blender から Unity へ、バトンタッチです。」の1文(手順7の頭)を足した。画面では、手順の一覧の右に道具の札を付けた(下の「画面の形」の節)。
エイイチの言葉は、本人に聞いた言葉だけ
動画には、エイイチの言葉が6つ出てくる。2つはこの会話で聞いた言葉(「Unityでここまでできるの、熱いっ!」「人の描写のバランス悪っ!」)で、残りの4つは LOG496 に書いた言葉(全体の流れ・首と肩・袖・これから見せたいもの)。台本を見せたあとに、3Dのハコブくんを初めて見た時の感想と、看護師さんを見た時の正直な感想の2問を聞いて、答えをそのまま入れた。エイイチの声は、本人の声ではなく AI の声で読ませている(概要欄にもそう書いた)。
公開した記事 LOG496 との突き合わせ
台本を書いたのとは別のエージェントに、LOG496 と台本を1文ずつ突き合わせてもらい、食い違い・根拠のない事実・言い過ぎを出してもらった。出た指摘のうち9か所を直した。外部のレビュー(codex)は、自分の作業を題材にした回なのでかけていない(2026-11-01 にエイイチが決めた運用)。
声 ― ElevenLabs で作り、読み間違いを2つ直した
声は ElevenLabs(文章を人の声で読み上げる AI のサービス)で、エイイチの Mac で作った。ハコブくんの声とエイイチの声は別の声で、78文のうち6文がエイイチの声。
読み間違いは2つあった。
| 文 | 書いた字 | 声が読んだ読み | 直した読み |
|---|---|---|---|
手順4「首長すぎ、肩がいかつすぎ。」 | 首長すぎ | 違う読み | くびながすぎ |
手順4「ハコブくんの角だけが硬く見えました。」ほか | 角 | つの | かど |
どちらも、読みの表(narration.py の ELEVEN_READ)に足して、その文だけ声を作り直した。「角」は、動画の3:53あたりで「つの」と読んでいたのをエイイチが見つけた。「角」が出る3つの文をまとめて作り直した。
冒頭の自己紹介を2文に短くした
前の動画まで、自己紹介は「エイイチは、本業のデザイナーをしながら、ロボティクスの研究と開発をしています。その中で分かったことと、そこから考えた見立てを、ハコブくんがお伝えします。」と長かった。エイイチから短くするよう指示があり、3つの案から次の案Cを選んだ。
Pixels to Motors、案内役のハコブくんです。エイイチが研究と開発で確かめたことを、ぼくがお伝えします。
自己紹介の2文だけ声を作り直し、前の声と合わせ直した(voice_eleven の「合わせ_紹介短縮後」)。冒頭の45秒ほどは「何に使うための3Dか」に使い、自己紹介はそのあと(0:46)に置いた。
画面の形 ― 大文字型に動きを付け、道具の札を付けた
画面の形は、エイイチが「大文字型+動きあり」を選んだ。背景には Unity で撮った受け渡しの場面の寄りの映像を流し、手順の名前や短い言葉を黒いカードに大きく載せる。

手順の一覧には、右に道具の札を付けた。準備は灰色の枠、Blender はオレンジ(#E87D0D)、Unity は水色(#62BFF5)。手順の一覧は、目次とまとめの2か所で同じ形で出す。

- ねらい:どの手順をどのソフトでやるかを、見ている人が迷わないようにする
- 変わったこと:手順の一覧と、手順3・7の頭のカード(「Blender → Unity」)で、道具の切り替わりを毎回見せた
- 見込める効果:真似して作る人が、Blender の作業と Unity の作業を分けて準備できる。分かりやすくなったかは、コメントで確かめる

画像を見せる所ではカードを隠す
最初の書き出しでは、画像を見せたい場面でも、カードと画像を並べていた。カードを中央から右へずらし、画像を左に置く形だった。エイイチから、画像の中身を見せたい時はカードを一時的に消し、無理に並べないよう指示があった。
場面を作る関数 bg_card に img_first という引数を足した。値は場面の長さに対する割合で、その割合の所まではカードを出さず、背景も暗くしないで画像だけを見せる。そのあとカードを出す。使ったのは15の場面(ハコブくんの角・大城さんの最初の形・袖が裂けた所など)。

- ねらい:画像が主役の場面で、画像の中身をちゃんと見せる
- 変わったこと:カードを横にずらして並べる形をやめ、時間で分けた(はじめは画像だけ、あとからカード)
- 見込める効果:画像とカードがどちらも小さくなることがなくなる。次の作り方の回からも、画像が主役の場面はこの形にする(video_rules.md 4-4e に書いた)
ほかにも、画面について次の指示があり、直した。
- 明朝体のフォントは使わない。カードと見出しはゴシックにした
- 画像を中途半端に斜めにしない。まっすぐ置いた
- 白い背景の時間を、意味のある形で減らす。紙色の無地だった場面の背景に、その話の映像や静止画を暗くして敷いた
- 画面に Blender の名前が出ていなかったので、手順3の場面と道具の札に入れた
早送りの間は、直した所に寄せる
大城さんの形を15回作り直した所は、早送りにした。最初は全身の絵を並べて早く切り替えるだけだったが、エイイチから、早送りの時は目や肩などに寄せて動きを付けるよう指示があった。
静止画の中の目や肩に、1か所ずつ寄りながら切り替えていく映像を作る関数(make_bg.py の ff_zoom)を書き、最初の形と直した形を交互に見せた。右上には「▶▶ 早送り」の札を出す。

袖が裂けた絵を、直す前のコードから描き出し直した
手順6では、袖が3回裂けた話をする。動画にするには、裂けた時の絵が要る。ところが、当時の確認用の絵は作業フォルダにも KIOXIA にも残っていなかった。描き出した絵を見て直し、次の版で上書きしていたためだった。
エイイチから、拡大した絵はないのかと聞かれ、当時の絵はないこと、直す前のコードは残っていることを伝えた。エイイチの判断で、直す前のコードから描き出し直すことにした。
直す前のコードの探し方
大城さんの形を作るコード(nurse_build.py)は、サイトの GitHub(PixelstoMotors/p2m-site の tools/sim_people/)にある。袖を直した後の版は、コミット e3daa10 に入っている。そこから、袖の3回の直しを1つずつ逆にたどって、3つの版を作った。
| 版 | 袖の作り | 直す前の状態 |
|---|---|---|
| 1回目の前(v1) | 袖は胴と1つの面。肩の所は腕の骨に引っぱられる | 腕を前に出すと、袖と胴のつなぎ目が裂ける |
| 2回目の前(v2) | 袖は別の部品。袖の中に入る所の肌が残っている | 袖の中の腕の肌が、外に飛び出す |
3回目の前(v3=e3daa10) | 袖は別の部品で、肌は袖の中で消してある | 腕を上げると、袖の肩の所がゆがむ(このあと、袖をまるごと腕の骨に付けて直した) |
描き出しは、Claude の作業環境(クラウド)で、Blender を Python のライブラリ(bpy 5.3.0)として入れ、画面を開かずに動かした。ポーズは LOG496 と同じ「差し出す(give)」「指さす(point)」の2つで、肩の寄りと全身を描いた(pose.py)。

動画では、この3枚を背景の静止画にして、それぞれの話の所で見せた。画面の左上には「直す前のコードで描き出し直した絵」と書き、概要欄にも「当時の絵とまったく同じではないかもしれません」と書いた。

- ねらい:失敗した時の絵がなくても、失敗をそのまま見せる
- 変わったこと:想像で描いた絵ではなく、直す前のコードから描き出した絵を使った
- 見込める効果:形をコードで作っていれば、どの時点の失敗でも描き出し直せる。次からは、確認用の絵を上書きせずに残す(今回は残していなかったため、この手間がかかった)
書き出し ― 9分05秒、78文
声・BGM・効果音を合わせ、場面の映像を作り、字幕を付けて書き出した。書き出した動画は 1920×1080・30fps・544.8秒。YouTube に上げた本編は約70MB、確認用は約25MB。
場面の書き出しの途中で、何度か止まった。ハコブくんの区画(画面の左下)とカードが重なると、書き出しの道具(render.py)が止まる決まりになっている。手順の一覧・まとめの一覧・手順3と7のカードの字を小さくして、重ならないようにした。動きの場面の書き出し(motion_kit)が時間切れで途中のファイルを残したこともあり、そのときは足りない場面だけを書き出し直した。
全場面の一覧は次の画像(大きいので縮めて見る)。

サムネイル・タイトル・概要欄
サムネイルは2案を作り、エイイチが左の案A(受け渡しの3DCG を背景に「マンガのキャラを3Dにする7つの手順」)を選んだ。案B は、袖が裂けた絵を背景に「袖が3回裂けた」とした案。どちらも、背景は Blender で描いた絵で、生成AIの画像は使っていない。


タイトルは、エイイチが「マンガのキャラを3Dにする7つの手順 Blender と Unity で作ってみた」に決めた。
概要欄には、7つの手順と目次、この動画で扱う範囲(実物のロボットはないこと、Blender を Python で動かしたこと、描き出し直した絵のこと、Mixamo から借りた動きは配らないこと)、作り方の記録として LOG496 へのリンクを入れた。
公開と、X・LinkedIn の予約
X と LinkedIn の文は、YouTube の公開予約の時刻に合わせて自動で予約される仕組みに置いていた(r2r2r-content の sns/VIDEO_hakobu-3d-seven-steps_sns_posts.json)。ところが、エイイチは公開予約を使わずにすぐ公開した。自動の同期は「公開の時刻を過ぎてから見つけた動画は入れない」決まりなので、このままだと X にも LinkedIn にも出ない。
そこで、予定表(sns/schedule.json)に手で入れた。X は公開の直後の 2026-11-13 22:50、LinkedIn は「業界の読み解き」の枠の空いている最初の日(2027-02-10 17:00)。
ショートは作っていない。本編から切り出すショートは、登録者や再生数が増えるまで作らない運用にしている(video_rules.md 9-0)。
動画の決まりに書き足したこと
この動画で決めたことを、動画の決まりの文書 video_rules.md(113回目の更新)に書き足した。
| 節 | 書き足したこと |
|---|---|
| 冒頭の作り方の5 | 自己紹介は2文(案C)。問いのあと(作り方の回は「何に使うのか」のあと)に置く |
| 2節28 | 作り方の回は、手順に番号を付けて並べる。最初に使い道を言う。道具の札を毎回見せる。謎が小さいなら謎解きの形にしない。早送りは直した所に寄せる。失敗の絵がなければ直す前のコードで描き出し直し、そう書く |
| 4-4e | 画像を見せる所ではカードを隠す。画像はまっすぐ・見出しはゴシック。白い背景の時間を減らす。手順の道具の札 |
| 更新履歴 | 読み(首長すぎ→くびながすぎ・角→かど)と、袖の絵の描き出し直し |
作業フォルダとファイルの置き場所
| 置き場所 | 中身 |
|---|---|
iCloud の 動画/ハコブくんの3D/ | 作り方のファイル(narration.py・scenes.py・sound.py・thumb.py・ei_talk.py・台本・照合の結果・概要欄・タイトル・投稿文・voice_eleven・thumb の案A・サムネ素材・袖の描き出し直し) |
KIOXIA の videos/ハコブくんの3D/アップロード用/ | YouTube に上げた物(ハコブくんの3D.mp4・サムネイル.png・タイトル.txt・概要欄.txt・投稿文_X_LinkedIn.txt) |
KIOXIA の videos/ハコブくんの3D/ | 確認用の動画と、取り込みに使った tar(_取り込み/) |
GitHub r2r2r-content の sns/ | X と LinkedIn の文(VIDEO_hakobu-3d-seven-steps_sns_posts.json) |
使わなかった版(サムネイルの案B・前の台本の写しなど)は、iCloud の 動画/_旧版/置き換え前_20261113_ハコブくんの3D_フォルダ整理/ に移した。
台本の全文(narration.py)
この記事のコード・ログ・データは、1ファイルずつ下に置いています。全文はリンク先にあります。
ファイルの一覧(5本)
01_sec10.py.txt ― 台本の全文(narration.py)・8,685字
02_sec12.py.txt ― 場面の作り方(scenes.py)・25,256字
03_sec13.py.txt ― エイイチのドット絵を話させる部品(ei_talk.py)・5,522字
04_sec15.py.txt ― 背景の静止画の映像と、早送りの寄りの映像(make_bg.py)・3,276字
05_sec16.py.txt ― 袖の描き出し直しのポーズと描き出し(pose.py)・6,322字
78文の台本と、読みの表。SEGS の1行が1文で、(場面の名前・ハコブくんの表情・字幕の文・後ろの間)。
# -*- coding: utf-8 -*-
# 台本「ハコブくんの3D」— 病院の搬送ロボットの手渡しを近くで見せるために、ハコブくんと看護師の大城さんを3Dにした回(2026-11-13 2版・作る順番の7手順)
# 元の記事: LOG496(サービスロボット導入シミュレーション Log#45「受け渡しを寄りで見せる、ハコブくんと看護師の3D」)
# 映像: Unity の場面の寄り(KIOXIA service_sim/unity/closeup/ の依頼162・166・169・171)
# エイイチの指示(2026-11-13): 何に使うためかを最初に言う/平易な言葉で、難しい言葉は要所だけ/面白くない所は早送り/ユーモアを交える
# 作る順番を、見た人が真似して作れる形で説明する(エイイチの指示)。立ち位置の話(依頼167〜171 の引き出しとカード)は入れない(エイイチ「謎というには小さすぎる」)
# エイイチの言葉: LOG496 の引用3つ(流れ・首と肩・袖)と、2026-11-13 に聞いた2つ(「Unityでここまでできるの、熱いっ!」「人の描写のバランス悪っ!」)
# codex は自分のネタの回なのでかけない(2026-11-01 エイイチの決め)場面の時間の表(timeline.json から)
書き出したときの、文ごとの始まりの秒と長さ。
| 文 | 場面 | 始まり(秒) | 長さ(秒) | 字幕の文 |
|---|---|---|---|---|
| 0 | hook_use | 0.0 | 6.4 | 薬を運ぶロボットと、看護師さんが、薬を受け渡す。|その場面を、近くから見せたい。 |
| 1 | hook_use2 | 6.8 | 4.9 | そのために、ハコブくんと、看護師の大城さんを、3Dで作りました。 |
| 2 | hook_joke | 12.0 | 5.0 | ハコブくん、ついに体ができました。|……腕は、まだありません。 |
| 3 | hook_why | 17.7 | 5.8 | これまでの病院のシミュレーションでは、人は青い筒、ロボットは白い箱でした。 |
| 4 | hook_why2 | 23.9 | 8.4 | ロボットが何回止まったかは数えられます。|でも、看護師さんがどこに立って、どう受け取るのかは、筒と箱では分かりません。 |
| 5 | hook_joke2 | 32.6 | 5.5 | 筒から薬を受け取る箱。……絵としては、ちょっと寂しいですよね。 |
| 6 | hook_today | 38.4 | 6.9 | 今日は、この3Dを作った順番を、そのまま真似できる形でお伝えします。|手順は7つです。 |
| 7 | title | 46.6 | 3.7 | Pixels to Motors、案内役のハコブくんです。 |
| 8 | title_eiichi | 50.6 | 4.0 | エイイチが研究と開発で確かめたことを、ぼくがお伝えします。 |
| 9 | toc | 55.8 | 1.9 | 7つの手順は、こうです。 |
| 10 | toc2 | 58.0 | 13.9 | 使い道を決める。元の絵と大きさをそろえる。形を数字で作る。|絵に描き出して直す。骨と顔を入れる。ポーズを付けて確かめる。そして、Unity で動かす。 |
| 11 | toc_note | 72.3 | 8.0 | なお、ハコブくんはマンガのロボットで、実物はありません。今日の話は、ぜんぶ3DCGの中の話です。 |
| 12 | s1 | 81.5 | 4.5 | 手順1、使い道と、見た目の決まりを、先に決めます。 |
| 13 | s1_use | 87.2 | 9.2 | 今回の使い道は、病院の場面を近くで見せること。|パソコンの試算、病院の1日のシミュレーションの、その次の段です。 |
| 14 | ei_steps | 96.7 | 1.9 | エイイチは、こう書いていました。 |
| 15 | ei_steps | 99.0 | 10.2 | 試算、全体のシミュレーション、場面の細部、実際のロボットでの動画。|全体がつながっていけば、より伝わりやすくなると考えます。 |
| 16 | s1_look | 110.0 | 8.6 | 見た目の決まりは、粘土の人形のような感じ。ただし、デフォルメしすぎない。|人とロボットを、同じ決まりで作ります。 |
| 17 | s1_tip | 119.0 | 5.0 | ここを先に決めておくと、あとで、なんか違う、で迷子になりません。 |
| 18 | s2 | 125.1 | 3.4 | 手順2、元の絵と、大きさをそろえます。 |
| 19 | s2_ref | 129.7 | 9.7 | 元の絵は、マンガ『ハコブくん』の三面図です。正面、横、背中の3枚。|大城さんも、マンガに出てくる看護師さんです。 |
| 20 | s2_size | 139.8 | 12.7 | 大きさは、実寸で作ります。ハコブくんは、高さ1メートル15センチ。大城さんは、身長1メートル65センチ。|頭は、身長の約7分の1にしました。 |
| 21 | s2_joke | 152.8 | 6.1 | ハコブくん、大城さんより50センチ小さいです。……見上げるのには、慣れています。 |
| 22 | s3 | 160.0 | 3.3 | 手順3、形を、数字で作ります。 |
| 23 | s3_split | 164.5 | 9.0 | その前に、道具の役わけです。|形を作るのは、Blender。動かして撮るのは、Unity。この2つを使い分けます。 |
| 24 | s3_tool | 173.9 | 10.3 | Blender は、3Dの形を作る無料のソフトです。画面は開かずに、Python のコードで動かしました。|コードを書いたのは、AI の Claude です。 |
| 25 | s3_robot | 184.6 | 5.8 | ハコブくんは、三面図の外形を測って、Blender の中で、箱を組むように作ります。 |
| 26 | s3_human | 190.7 | 10.0 | 人は、楕円の頭、丸い棒の腕、角を丸めた箱の胴、のように、簡単な形を Python で足し合わせて、Blender に渡します。 |
| 27 | s3_why | 201.1 | 9.5 | 首の長さも、肩の丸みも、ぜんぶコードの中の数字です。|だから、首が長い、と言われたら、数字を1つ変えて作り直すだけ。 |
| 28 | s3_joke | 210.9 | 5.6 | 人間の首は、数字を変えても短くなりません。3Dの、いいところです。 |
| 29 | s4 | 217.7 | 3.2 | 手順4、絵に描き出して、直します。 |
| 30 | s4_render | 222.1 | 7.1 | 作った形は、正面、横、斜めから、確認用の絵に描き出します。これも、コードです。 |
| 31 | s4_side | 229.6 | 8.0 | ところが、2人を並べると、ハコブくんの角だけが硬く見えました。|1人だけ、別の絵から切り抜いてきたみたいに。 |
| 32 | s4_fix | 237.9 | 9.6 | そこで、体の角を丸めて、タイヤを太くしました。|顔の画面のまわりは丸めると白い線が出たので、マンガの形のまま残しています。 |
| 33 | s4_tip | 247.9 | 4.7 | ここが、手順4のコツです。1人ずつではなく、並べて見る。 |
| 34 | s4_oshiro | 252.9 | 3.5 | そして、大城さんの、最初の形がこちら。 |
| 35 | ei_first | 256.8 | 2.2 | エイイチの、最初のひと言です。 |
| 36 | ei_first | 259.3 | 2.7 | 首長すぎ、肩がいかつすぎ。 |
| 37 | ei_first2 | 262.8 | 2.3 | 正直な感想も、聞いてみました。 |
| 38 | ei_first2 | 265.5 | 2.2 | 人の描写のバランス悪っ! |
| 39 | s4_ff | 268.4 | 7.8 | ここから、首を短く、なで肩に、腕を短く、目を大きく。|……このあたりは、早送りでどうぞ。 |
| 40 | s4_ff2 | 276.6 | 2.6 | 作り直しは、全部で15回でした。 |
| 41 | s4_tip2 | 279.6 | 6.3 | 直す所は、言葉で言ってもらえば十分です。それを数字に直すのは、AI の仕事です。 |
| 42 | s5 | 287.1 | 3.0 | 手順5、骨と、顔を入れます。 |
| 43 | s5_bone | 291.3 | 10.1 | 人の3Dを動かすには、体の中に、骨を入れます。骨といっても、見えない棒です。|大城さんには、Blender で45本入れました。 |
| 44 | s5_name | 301.7 | 9.8 | ポイントは、骨の名前を、Unity の人型の決まりどおりに付けること。|そうしておくと、よそで作った歩く動きなどを、そのまま当てはめられます。 |
| 45 | s5_face | 311.9 | 8.4 | 顔には、まばたきの目と、困った眉。口は、笑う・話す・驚くなど、5つの形を用意しました。 |
| 46 | s5_joke | 320.7 | 8.3 | ちなみにハコブくんの顔は、画面です。眉は、ありません。|……困った顔は、気持ちでがんばっています。 |
| 47 | s6 | 330.1 | 5.8 | 手順6、ポーズを付けて、確かめます。今日いちばん手こずったところです。 |
| 48 | s6_pose | 337.2 | 10.2 | 差し出す、両手で受け取る、引き出しの物をつかむ、おじぎ、困った顔など、8つのポーズを付けて、服や肌が破れないかを見ます。 |
| 49 | ei_sleeve | 347.8 | 2.7 | すると、エイイチから、こう言われました。 |
| 50 | ei_sleeve | 350.8 | 3.2 | 体が動いた時に、服の袖が切れてるよ。 |
| 51 | s6_try1 | 354.8 | 11.3 | 1回目。腕を前に出すと、袖と胴のつなぎ目が裂けていました。|胴と袖が、別々の骨に引っぱられていたんです。袖を、別の部品に分けました。 |
| 52 | s6_try2 | 366.5 | 10.8 | 2回目。まだ裂けて見える。今度は、袖の中の腕の肌が、外に飛び出していました。|袖の中に入る所の肌は、作らないことにしました。 |
| 53 | s6_joke | 377.7 | 5.9 | 見えない所は、作らない。……3Dの世界は、なかなか、割り切っています。 |
| 54 | s6_try3 | 383.9 | 4.3 | 3回目。腕を上げると、袖の肩の所がゆがむ。 |
| 55 | s6_fix | 388.6 | 7.9 | 答えは、袖をまるごと、腕の骨に付けること。これで、腕を上げても、袖の形が変わらなくなりました。 |
| 56 | s6_tip | 396.8 | 7.8 | 動かすと、止まっている時には見えない所が壊れます。だから、ポーズを付けて確かめる手順を、飛ばさないでください。 |
| 57 | s6_hakobu | 405.0 | 4.5 | ちなみにハコブくんは、服を着ていないので、袖の悩みはありません。 |
| 58 | s7 | 410.7 | 3.5 | 手順7、Unity に運んで、動かします。 |
| 59 | s7_fbx | 415.4 | 9.0 | ここで、Blender から Unity へ、バトンタッチです。形と骨を、FBX という、Unity がそのまま読めるファイルにして渡します。 |
| 60 | ei_unity | 424.7 | 4.3 | Unity に入った3Dのハコブくんを見て、エイイチは、ひと言。 |
| 61 | ei_unity | 429.3 | 2.7 | Unityでここまでできるの、熱いっ! |
| 62 | s7_mixamo | 432.9 | 14.0 | 歩く・うなずく・おじぎなどの動きは、Mixamo という、人の動きを無料で借りられる Adobe のサービスから、33本借りました。|借りた動きのファイルは、決まりにより、そのまま配ることはしません。 |
| 63 | s7_scene | 447.2 | 3.9 | こうして、Unity の場面の中で、2人が動き出しました。 |
| 64 | s7_scene2 | 451.4 | 9.0 | 薬剤部で、大城さんが、ハコブくんに薬を積む。|届け先で、認証のカードをかざすと、引き出しが開き、薬を取る。 |
| 65 | s7_ff | 460.8 | 3.5 | ここにたどり着くまでの細かい直しも、早送りでどうぞ。 |
| 66 | s7_end | 464.6 | 4.2 | 筒と箱だった世界に、やっと、手と顔が出てきました。 |
| 67 | sum | 470.0 | 2.0 | 7つの手順を、もう一度。 |
| 68 | sum2 | 472.4 | 11.4 | 使い道を決める。元の絵と大きさ。数字で形。並べて直す。骨と顔。ポーズで確かめる。Unity で動かす。 |
| 69 | sum_code | 484.1 | 7.0 | 2人の形の作り方のコードは、記事に載せています。同じコードを動かせば、同じ形ができます。 |
| 70 | next | 492.3 | 5.5 | では、この3Dで、何を見せていくのか。エイイチは、こう話していました。 |
| 71 | ei_next | 498.2 | 7.2 | モノを渡す、受け取る、トラブルの時の動き、コミュニケーションの姿などを、表現できたらと思います。 |
| 72 | next2 | 506.2 | 6.2 | まだ、作りはじめたばかりです。動きが本物の看護師さんに近いかは、これから確かめます。 |
| 73 | next_joke | 512.7 | 5.8 | 次は、廊下ですれ違う場面です。ハコブくん、ぶつからないように、がんばります。 |
| 74 | site | 519.7 | 8.2 | 作り方のコードと、くわしい記録は、サイトで毎日公開しています。pixelstomotors.com で、どうぞ。 |
| 75 | outro | 529.1 | 4.2 | この動画が役に立ったら、高評価とチャンネル登録をお願いします。 |
| 76 | outro | 533.7 | 5.7 | ロボットの開発や導入の相談は、概要欄の連絡先から、エイイチに直接どうぞ。 |
| 77 | outro | 539.8 | 3.9 | コメントは、エイイチが全部読んでいます。それではまた。 |
場面の作り方(scenes.py)
大文字型のカード・道具の札(C_list の tool)・画像を先に見せる bg_card の img_first・早送りの場面を書いた、場面の定義。共通の部品(scene_kit.py・motion_kit.py)は動画の作業フォルダの _制作ベース にある。
# -*- coding: utf-8 -*-
# 動画「ハコブくんの3D」(3Dを作る順番の7手順)の場面。2026-11-13 1版
PATTERN = 2 # 大文字型(4-4c)。2026-11-13 エイイチが決定(大文字型+動きあり)
MOVE = True
# 背景の映像は Unity の場面の寄り(KIOXIA service_sim/unity/closeup/ 依頼162・166・171)と、病院の1日(hospital161 1便の通し)
# 出どころの札は使わない(全部エイイチの記録)
import os as _os, sys as _sys, json as _json, base64 as _b64
_here = _os.path.dirname(_os.path.abspath(__file__))エイイチのドット絵を話させる部品(ei_talk.py)
# エイイチ(ドット絵)が話している間、口と目を動かす部品(2026-10-28 エイイチの指示「話している時はおれの口や目が動くように」)
# 口は3段(閉じる・いつもの笑顔・大きく開く)を、声の大きさで 0.1 秒ごとに選ぶ(1段ずつしか変えない)。
# 目は、話し始めと、話している間ときどきまばたきする。
# どれも 100 ドットの絵の「その部分だけ」を描いた透明な PNG を、時間で重ねていく(motion_kit の data-a="fade")。
import os, io, base64, wave
import numpy as np
from PIL import Image
音の置き方(sound.py)
# 音の置き方(audio_mix.py が読む。書き方は audio_mix.py の先頭)
# 2026-11-13 「ハコブくんの3D」: 「入口の待ちが減らない」の sound.py を写した(同じ曲・同じ決まり。章の場面は7つの手順に合わせた)
BGM = [
dict(file='sound/bgm_明るいB_2.mp3', start=0, end=None, level=-23, gap=-16, fade_in=0.6, fade_out=3.0),
]
SE = [
# (文番号, 文の頭から何秒後, 音, ナレーションより何dB)
]
# 場面が切り替わるたびに「ホワーン」。同じ場面が続く所・エイイチの声の所は鳴らさない
SCENE_SE = dict(file='se_rise', level=-6, offset=-0.15, skip=['title_eiichi', 'ei_first2'])
# 大きな流れの変わり目(自己紹介・7つの手順の頭・まとめ・アウトロ)は、ホワーンの代わりに別の音
CHAPTER_SE = dict(file='se_chapter_marimba', files={'title': 'se_chapter_glock'}, level=-8, offset=-0.3,
scenes=['title', 's1', 's2', 's3', 's4', 's5', 's6', 's7', 'sum', 'outro'])
背景の静止画の映像と、早送りの寄りの映像(make_bg.py)
# 静止画から背景用の映像を作る(ゆっくり寄る)と、早送りの寄りの映像を作る
import subprocess, sys, os
from PIL import Image
W, H, FPS = 1920, 1080, 30
BG = (245, 245, 240)
def pipe(out, n, frame_fn):
p = subprocess.Popen(['ffmpeg','-v','error','-y','-f','rawvideo','-pix_fmt','rgb24','-s',f'{W}x{H}','-r',str(FPS),'-i','-',袖の描き出し直しのポーズと描き出し(pose.py)
"""骨の動きを確かめる:決めた姿勢を付けて描く。
python3 nurse_pose.py <nurse_clay.blend> <出力フォルダ> [姿勢の名前...]
姿勢:rest give receive drawer point bow worried talk
(Unity では Humanoid の動き・腕の IK で動かす。ここの姿勢は、骨と重みで服や肌が破れないかの確認用)
"""
import math
import os
import sys直す前の版と、e3daa10 の nurse_build.py の違い
3回目の前(v3)は、p2m-site のコミット e3daa10 の tools/sim_people/ の nurse_build.py そのもの。そこから1回目の前(v1)と2回目の前(v2)を作った違いを、diff で載せる。
v3(e3daa10)と v2(2回目の前)の違い
--- /home/claude/torn/v3/nurse_build.py 2026-11-13 19:06:48.297392271 +0900
+++ /home/claude/torn/v2/nurse_build.py 2026-11-13 19:06:48.355579785 +0900
@@ -175,7 +175,7 @@
proj = np.sum(q * d1.reshape(3, 1), axis=0)
radial = length(q - d1.reshape(3, 1) * proj)
inside = np.maximum(np.maximum(-0.12 - proj, proj - 0.134), radial - 0.065)
- d = smax(d, -inside, 0.005)
+ pass # 2回目の前:袖の中の肌を消していない
return d
v3(e3daa10)と v1(1回目の前)の違い
--- /home/claude/torn/v3/nurse_build.py 2026-11-13 19:06:48.297392271 +0900
+++ /home/claude/torn/v1/nurse_build.py 2026-11-13 19:06:56.777392775 +0900
@@ -175,7 +175,7 @@
proj = np.sum(q * d1.reshape(3, 1), axis=0)
radial = length(q - d1.reshape(3, 1) * proj)
inside = np.maximum(np.maximum(-0.12 - proj, proj - 0.134), radial - 0.065)
- d = smax(d, -inside, 0.005)
+ pass # 2回目の前:袖の中の肌を消していない
return d
@@ -479,6 +479,8 @@
for side, L in ((1, "Left"), (-1, "Right")):
sh, _, _, _, _ = arm_points(side)
R[L + "Shoulder"] = capsule(p, (side * 0.045, 0.012, 1.33), sh.tolist(), 0.045, 0.045)
+ _, _, _, d1, _ = arm_points(side)
+ R[L + "UpperArm"] = capsule(p, (sh + d1 * 0.06).tolist(), (sh + d1 * 0.2).tolist(), 0.055, 0.055) # 1回目の前:袖の側は腕の骨
elif kind == "pants":
R["Hips"] = ellipsoid(p, (0, 0.012, 0.86), (0.148, 0.086, 0.10))
for side, L in ((1, "Left"), (-1, "Right")):
@@ -593,8 +595,8 @@
parts = [
("Skin", skin, (-0.34, -0.18, 0.58), (0.34, 0.15, 1.67), VOX, SKIN, 0.55, 0.12, 0.07, ("mesh", "skin")),
("Hair", hair, (-0.15, -0.16, 1.32), (0.15, 0.21, 1.69), VOX, HAIR, 0.5, 0, 0.06, ("whole", "Head")),
- ("Top", top, (-0.30, -0.15, 0.78), (0.30, 0.15, 1.40), VOX, ROYAL, 0.75, 0, 0.025, ("mesh", "top")),
- ("Sleeves", sleeves, (-0.30, -0.12, 1.08), (0.30, 0.12, 1.40), VOX, ROYAL, 0.75, 0, 0.05, ("sleeves", None)),
+ ("Top", lambda p: np.minimum(top(p), sleeves(p)), (-0.30, -0.15, 0.78), (0.30, 0.15, 1.40), VOX, ROYAL, 0.75, 0, 0.025, ("mesh", "top")),
+ # 1回目の前:袖は胴と1つの面
("Pants", pants, (-0.20, -0.13, 0.05), (0.20, 0.14, 1.0), VOX * 1.4, ROYAL, 0.75, 0, 0.04, ("mesh", "pants")),
("Shoes", shoes, (-0.17, -0.17, -0.01), (0.17, 0.10, 0.11), VOX, WHITE, 0.5, 0, 0.05, ("mesh", "shoes")),
("Eyes", eyes, FACE_LO, FACE_HI, 0.0008, DARK, 0.35, 0, 0.15, ("side", "Eye_")),
1回目の前(v1)を描き出した時の記録(log.txt の最後)
Nurse_Top 8248 faces
Nurse_Pants 4546 faces
Nurse_Shoes 1758 faces
Nurse_Eyes 2616 faces
Nurse_Brows 1004 faces
Nurse_Mouth_smile 1190 faces
Nurse_Mouth_flat 878 faces
Nurse_Mouth_worried 938 faces
Nurse_Mouth_talk 1120 faces
Nurse_Mouth_surprised 1286 faces
Info: Saved as "nurse_clay.blend"
FBX export starting... 'out/nurse_oshiro.fbx'
export finished in 0.1420 sec.
{"Nurse_Skin": 12368, "Nurse_Hair": 3468, "Nurse_Top": 8248, "Nurse_Pants": 4546, "Nurse_Shoes": 1758, "Nurse_Eyes": 2616, "Nurse_Brows": 1004, "Nurse_Mouth_smile": 1190, "Nurse_Mouth_flat": 878, "Nurse_Mouth_worried": 938, "Nurse_Mouth_talk": 1120, "Nurse_Mouth_surprised": 1286, "_total_triangles": 39420}
サムネイルの文言(thumb.py)
# サムネイルの文言と背景(thumbnail.py が読む)。2026-11-13「ハコブくんの3D」
# 背景は A=記事の受け渡しの3DCG(Blender で描いた絵)/B=直す前のコードで描き出し直した、袖が裂けた絵。生成AIは使っていない
import os
V = os.environ.get('THUMB_V', 'A')
PHOTO = {'A': 'サムネ素材/A_handover.png', 'B': 'サムネ素材/B_torn1.png'}[V]
PHOTO3 = None
PHOTO_POS_FULL = '50% 50%'
HAKOBU = True
LABEL = {'A': '体ができた!', 'B': '裂けた!'}[V]
KICKER = {'A': 'Blender × Unity', 'B': 'Blender で3D'}[V]
LINES = {'A': ['マンガのキャラを', '<span class="red">3Dにする</span>', '7つの手順'],
'B': ['袖が', '<span class="red">3回裂けた</span>', '3Dキャラの作り方']}[V]
VARIANTS = ['photo']
SIZE_L1, SIZE_L2, SIZE_L3 = 120, 170, 100
TXT_TOP = 70
HK_BOTTOM = -300
LABEL_BOTTOM = 158
LABEL_RIGHT = 450
LABEL_TAIL = 'bubble'
LABEL_FS = 60
概要欄(概要欄.txt)
病院で薬を運ぶロボットと看護師さんの受け渡しを、近くから見せたい。そのために、4コママンガ『ハコブくん』のロボット・ハコブくんと、看護師の大城さんを3Dにしました。この動画では、作った順番を7つの手順に分けて、真似できる形でお伝えします。首が長すぎた、肩がいかつすぎた、袖が3回裂けた、という失敗も、そのまま見せます。
▼7つの手順
1. 使い道と見た目の決まりを先に決める(準備)
2. 元の絵(三面図)と大きさをそろえる(準備)
3. 形を数字で作る(Blender を Python で動かす)
4. 絵に描き出して、2人を並べて直す(Blender)
5. 骨と顔を入れる(Blender・骨は Unity の人型の決まりどおりの名前)
6. ポーズを付けて、服や肌が破れないか確かめる(Blender)
7. FBX で Unity に渡し、借りた動きで動かして撮る(Unity)
▼目次
0:00 何に使うための3Dか
0:55 7つの手順
1:21 手順1 使い道を決める
2:05 手順2 元の絵と大きさ
2:40 手順3 形を数字で作る(Blender)
3:37 手順4 並べて直す
4:47 手順5 骨と顔
5:30 手順6 ポーズで確認(袖が裂けた話)
6:50 手順7 Unity で動かす
7:50 まとめ
8:12 これから
8:49 エンディング
▼この動画で扱う範囲
・ハコブくんは4コママンガのロボットで、実物はありません。動画の中は、ぜんぶ3DCGです
・形を作ったのは Blender(3Dの形を作る無料のソフト)で、画面は開かずに Python のコードで動かしました。コードを書いたのは AI の Claude、見て直す所を決めたのはエイイチです
・袖が裂けた1回目と2回目の絵は、当時の絵が残っていなかったため、直す前のコードから描き出し直したものです。当時の絵とまったく同じではないかもしれません
・歩く・うなずく・おじぎなどの動きは、Adobe の Mixamo から33本借りました。借りた動きのファイルは、決まりにより配っていません
・Unity の場面は、病院の1日のシミュレーションとは別に作った、受け渡しを近くで見せるための場面です。動きが本物の看護師さんに近いかは、これから確かめます
▼作り方の記録(2人の形の作り方のコードも載せています)
LOG496 受け渡しを寄りで見せる、ハコブくんと看護師の3D:https://pixelstomotors.com/record/hakobu-nurse-3d-models-for-handover-closeups
▼サービスロボット導入シミュレーション
https://pixelstomotors.com/series8
ナレーションは AI 音声(ElevenLabs)です。エイイチの声も AI 音声で、本人の声ではありません。
4コママンガ『ハコブくん』の絵は、生成AIで作っています。
出典
- 動画: マンガのキャラを3Dにする7つの手順 Blender と Unity で作ってみた(Pixels to Motors の YouTube)
- LOG496: サービスロボット導入シミュレーション Log#45 | 受け渡しを寄りで見せる、ハコブくんと看護師の3D
- Blender
- Unity
- ElevenLabs
- Mixamo