PythonSCADコミュニティ・開発者に感謝申し上げます。ありがとうございます。
今回は、redditのサンプルを参考に解説をしてみました。ありがとうございます。
人型ロボットやキャラクターのような形を作るプログラム
1. 元のコード
from pythonscad import *
# 円や球の滑らかさ(分割数)
# ※ PythonSCAD では $fn は使えないので、必要なら各形状に fn=... を渡します
fn = 30
# ------------------------------------------------------------
# 1) 中央の「支柱(base)」を作る
# ------------------------------------------------------------
# 直径1mm、高さ10mm の円柱(center=True なので中心が原点に来る)
base = cylinder(d=1, h=10, center=True, fn=fn)
# 「位置合わせ(align)」で使える基準点を自分で登録しておく
# base.origin は支柱の中心点(原点)
# up/down(点, 距離) で、その点をZ方向にずらした点を作れる
base.top = up(base.origin, 5) # 上端中心(Z=+5)
base.bot = down(base.origin, 5) # 下端中心(Z=-5)
# ------------------------------------------------------------
# 2) 横向きの「腕(arms)」を作る
# ------------------------------------------------------------
# 直径1mm、高さ5mm の円柱を作り、roty(90) でY軸回転して横向きにする
# (円柱は標準でZ方向に伸びるので、90°回してX方向に寝かせるイメージ)
arms = cylinder(d=1, h=5, center=True, fn=fn).roty(90)
# arms についても align 用の基準点を登録
# right/left(点, 距離) は X方向に点をずらす
arms.right = right(arms.origin, 2.5) # 右端の目安点(X=+2.5)
# 左端の目安点(X=-2.5)を作りたいので、いったん scale(..., -1) で点を反転させてから left
# ※「左右対称に点を作る」ためのテクニック(ややトリッキーなのでコメント重要)
arms.left = left(scale(arms.origin, -1), 2.5)
# ------------------------------------------------------------
# 3) パーツを合成(union)していく
# ------------------------------------------------------------
result = base # まずは支柱からスタート
# 支柱の上端に半径2mmの球を「位置合わせ」して追加
# align(base.top) で球の原点を base.top に合わせる
result |= sphere(2, fn=fn).align(base.top)
# 横向きの腕を追加(支柱中心で交差する)
result |= arms
# 腕の右端・左端に「キャップ」みたいな円柱(直径2, 高さ1)を付ける
# align(result.right / result.left) で、いま作っている全体(result)に登録された基準点を使える
result |= cylinder(d=2, h=1, center=True, fn=fn).align(result.right)
result |= cylinder(d=2, h=1, center=True, fn=fn).align(result.left)
# 支柱の下端に、5×5×1 の板を付ける(台座のイメージ)
result |= cube([5, 5, 1], center=True).align(base.bot)
# ------------------------------------------------------------
# 4) 表示
# ------------------------------------------------------------
show(result)
2. コードを変更してみる
元のコードの書き方(.align や .roty など)でも形は作れますが、プログラミングや3Dモデリングの基礎である「座標の計算」や「基本の移動・回転関数」をしっかりマスターできるように、PythonSCADの標準的なルールに従って書き直しました。
寸法を変数にまとめ、パーツごとにわかりやすくコメントをつけました。
1. 完成コード(PythonSCAD)
# ==========================================
# [作品名/パーツ名] 人型キャラクターモデル
# 作成日: 2026/08/02
# ==========================================
from pythonscad import *
# --- パラメータ設定 (単位: mm) ---
# ※数値を直接書かず、変数にしておくと後からサイズ変更が簡単になるよ!
body_d = 1 # 胴体の直径
body_h = 10 # 胴体の高さ
head_r = 2 # 頭の半径
arm_d = 1 # 腕の直径
arm_l = 5 # 腕の長さ
hand_d = 2 # 手の直径
hand_h = 1 # 手の厚み
pedestal_w = 5 # 台座の幅と奥行き
pedestal_h = 1 # 台座の厚み
fn_val = 30 # 円や球の滑らかさ (元の fn=30 と同じ役割)
# --- メイン処理 ---
# 1. 胴体の作成
# 胴体は高さ10の円柱。原点 [0,0,0] を中心(center=True)に配置します。
body = cylinder(d=body_d, h=body_h, center=True, fn=fn_val)
# 2. 頭の作成と配置
# 頭は半径2の球体です。
# 胴体の一番上(高さ10の半分 = Z軸方向に +5)に移動(translate)させます。
head = sphere(r=head_r, fn=fn_val)
head_moved = translate(head, [0, 0, body_h / 2])
# 3. 腕の作成と配置
# 円柱は最初「Z軸(上)方向」を向いて作られます。
# Y軸を中心に90度回転(rotate)させて、X軸(横)方向に倒します。
arm = cylinder(d=arm_d, h=arm_l, center=True, fn=fn_val)
arm_rotated = rotate(arm, [0, 90, 0])
# 4. 手の作成と配置
# 右手と左手を作ります。
# 腕の長さ5の半分(X軸方向に +2.5 と -2.5)の位置にそれぞれ移動させます。
hand_right = cylinder(d=hand_d, h=hand_h, center=True, fn=fn_val)
hand_right_moved = translate(hand_right, [arm_l / 2, 0, 0])
hand_left = cylinder(d=hand_d, h=hand_h, center=True, fn=fn_val)
hand_left_moved = translate(hand_left, [-arm_l / 2, 0, 0])
# 5. 台座の作成と配置
# 台座は 5x5x1 の直方体(cube)です。
# 胴体の一番下(Z軸方向に -5)に移動させます。
pedestal = cube([pedestal_w, pedestal_w, pedestal_h], center=True)
pedestal_moved = translate(pedestal, [0, 0, -body_h / 2])
# 6. 全パーツの結合
# + 演算子を使って、バラバラのパーツを1つの形に合体させます!
result = body + head_moved + arm_rotated + hand_right_moved + hand_left_moved + pedestal_moved
# 3Dプレビュー表示
# 必ず最後に show() の中に最終的な形を入れて表示させます。
show(result)
cylinder は作られた直後は常に「Z軸(上)方向」を向いているので、そのまま移動させただけだと、腕(X軸方向に伸びている)の先端にお皿が上を向いて乗っているような、ちょっと不自然な向きになってしまいました。
腕と同じように、手(円柱)もY軸を中心に90度回転([0, 90, 0])させてから移動させるのが正解です。こうすることで、腕の先端にピタッと合う「パンチ」のような手の向きになります。
4. 完成コード(PythonSCAD)
# ==========================================
# [作品名/パーツ名] 人型キャラクターモデル(手首の向き修正版)
# 作成日: 2026/08/02
# ==========================================
from pythonscad import *
# --- パラメータ設定 (単位: mm) ---
body_d = 1 # 胴体の直径
body_h = 10 # 胴体の高さ
head_r = 2 # 頭の半径
arm_d = 1 # 腕の直径
arm_l = 5 # 腕の長さ
hand_d = 2 # 手の直径
hand_h = 1 # 手の厚み
pedestal_w = 5 # 台座の幅と奥行き
pedestal_h = 1 # 台座の厚み
fn_val = 30 # 円や球の滑らかさ
# --- メイン処理 ---
# 1. 胴体の作成
# 胴体は高さ10の円柱。原点 [0,0,0] を中心(center=True)に配置します。
body = cylinder(d=body_d, h=body_h, center=True, fn=fn_val)
# 2. 頭の作成と配置
# 頭は半径2の球体。胴体の一番上(Z方向に +5)に移動させます。
head = sphere(r=head_r, fn=fn_val)
head_moved = translate(head, [0, 0, body_h / 2])
# 3. 腕の作成と配置
# 円柱(Z軸向き)を、Y軸を中心に90度回転させてX軸(横)方向に倒します。
arm = cylinder(d=arm_d, h=arm_l, center=True, fn=fn_val)
arm_rotated = rotate(arm, [0, 90, 0])
# 4. 手の作成と配置【修正ポイント!】
# 手も円柱なので最初はZ軸を向いています。
# 腕と同じようにY軸を中心に90度回転させて、X軸方向に向けます。
hand = cylinder(d=hand_d, h=hand_h, center=True, fn=fn_val)
hand_rotated = rotate(hand, [0, 90, 0])
# 回転させた手を、腕の長さの半分(X軸方向に +2.5 と -2.5)の位置に移動させます。
hand_right_moved = translate(hand_rotated, [arm_l / 2, 0, 0])
hand_left_moved = translate(hand_rotated, [-arm_l / 2, 0, 0])
# 5. 台座の作成と配置
# 台座は直方体(cube)。胴体の一番下(Z方向に -5)に移動させます。
pedestal = cube([pedestal_w, pedestal_w, pedestal_h], center=True)
pedestal_moved = translate(pedestal, [0, 0, -body_h / 2])
# 6. 全パーツの結合
# + 演算子を使って、すべてのパーツを1つに合体!
result = body + head_moved + arm_rotated + hand_right_moved + hand_left_moved + pedestal_moved
# 3Dプレビュー表示
show(result)
- 腕の長さに変化。調整が必要ですね。
解説ポイント! 💡
-
基本は
center=Trueから!
すべての基本形状(cylinderやcube)にcenter=Trueを指定しているのがポイントです。こうすることで、形が原点[0, 0, 0]を中心に作られるため、「胴体の高さの半分だけ上(body_h / 2)に頭を置く」といった座標の計算がとても直感的で簡単になります。 -
**関数としての
translateとrotate**
元のコードで使われていたup()や.alignなども便利ですが、基本となるのはtranslate(動かす物, [X, Y, Z])とrotate(回す物, [X, Y, Z])です。「何を」「どの方向に」動かすのかを明確にプログラムに指示することで、エラーが起きにくくなり、複雑な形を作る応用力が身につきます。 -
基本形状の「初期の向き」を意識しよう
cylinder(円柱)は常にZ軸(上下方向)に向かって作られます。だから、前を向けたい(X軸方向)のか、横を向けたい(Y軸方向)のかによって、最初にどの軸を中心に何度回すか(rotate)を必ずセットで考える必要があります。 -
「回転」してから「移動」する順番の大切さ
コードを見ると、手をrotateで回転させてから、translateで腕の先端へ移動させているね。
もしこれを逆に「移動」してから「原点を中心に回転」させてしまうと、手が腕の先端から大きな円を描いて別の場所に飛んでいってしまいます。「形を作って、向きを直して(rotate)、最後に所定の場所へ置く(translate)」という順番が、安全で確実なプログラミングのコツになります。 -
変数化(パラメトリック設計)の力
コードの最初でbody_h = 10のように数字を変数に入れました。もし「もっと背の高いキャラクターにしたい!」と思ったら、ここの数字を15に変えるだけで、頭や台座の位置(body_h / 2)も自動で正しく再計算されます。これがプログラミングでものづくりをする最大の強みです。
プログラミングと数学の力が、3Dの形になって目の前に現れるのは楽しいです。ここから帽子をかぶせたり、足をつけたりして、どんどん自分だけのオリジナルモデルに進化させてみてください。
ありがとうございます。


