機械部品や建築モデルをプログラミングで設計しているとき、「複数のパーツがどう重なっていて、最終的にどんな形になるのか?」が頭の中だけではイメージしにくいことがあると思います。
特に、共通部分だけを残す intersection(交差)を使うと、削る前の元の図形が消えてしまうため、自分のプログラムが合っているのか確認が難しくなります。
result = intersection(result, part)
result = union(result, part)
今回は、Pythonのリスト(配列)と色指定を応用して、「外側の元の図形を半透明にしつつ、中心の完成形をくっきりと可視化する」 という、プログラマ視点での素晴らしいデバッグ(確認・修正)テクニックを紹介します!
1. エラーから学ぶ:RGBAでの確実な色指定
3Dモデルに色や透明度をつける際、alpha(透明度)という引数がうまく認識されずエラーになることがあります。
そんな時は、コンピュータの世界の標準である RGBA(赤・緑・青・透明度) のリストを使って指定しましょう。
PythonSCADでは、[1.0, 0.0, 0.0, 0.31] のように 0.0 から 1.0 の数値のリストを作ることで、確実に関数に色と透明度を伝えることができます。
# [赤, 緑, 青, 透明度(アルファ)]
tomato_color = [1.0, 0.39, 0.28, 1.0] # 不透明な赤橙色
以下、各直方体を薄く表示しました。
# 各パーツに割り当てる色のリスト(RGBA形式: [赤, 緑, 青, アルファ値])
# 値は 0.0 〜 1.0 の範囲で指定します
color_list = [
[1.0, 0.0, 0.0, 0.3], # 赤 (Red=1.0, 透明度=0.31)
[0.0, 1.0, 0.0, 0.3], # 緑 (Green=1.0, 透明度=0.31)
[0.0, 0.0, 1.0, 0.3], # 青 (Blue=1.0, 透明度=0.31)
[1.0, 0.5, 0.0, 0.3], # オレンジ (Red=1.0, Green=0.5, 透明度=0.31)
2. 結合時の罠:「足し算(+)」で色が潰れてしまう!?
全体の重なり具合(Union)と、中心の交差部分(Intersection)を同時に見比べるため、プログラムの中で2つのパーツを作ります。
- 半透明の全体像(
union_result) - 色のついた中心部分(
core_colored)
ここで初心者が陥りやすい罠があります。この2つを final_result = union_result + core_colored のように + 演算子で結合してしまうと、全体が後から足した色(今回ならTomato色)に塗りつぶされてしまう ことがあるのです。
これは、同じ座標に複数の面が存在したときに、3D描画エンジンがどちらの色を表示すべきか迷ってしまう「Zファイティング」や、色の計算の競合が原因です。
3. 解決策:show() を分けて「重ね描き」する
この問題を解決する賢いアプローチが、「結合せずに、独立したパーツとして別々に show() に渡す」 という工夫です。
# ✕ 失敗例(+ で1つの物体にまとめてしまう)
# final_result = union_result + core_colored
# show(final_result)
# 〇 成功例(別々の物体としてビューアーに重ねて描画させる)
show(core_colored) # 中心の不透明なパーツを表示
show(union_result) # その上から外側の半透明パーツを表示
このように show() を2回に分けて実行することで、ビューアーはそれぞれを別のオブジェクトとして認識し、半透明のボックスの奥に、真っ赤な交差部分がくっきりと浮かび上がるようになります。
4. 完成コード(実践用テンプレート)
実際にこの工夫を取り入れた PythonSCAD のコードです。工業科や情報科の実習でもすぐに試せるよう、パラメータを先頭にまとめています。
# ==========================================
# 複数の直方体の重なりと交差部分(Intersection)の可視化
# ==========================================
from pythonscad import *
# --- パラメータ設定 (単位: mm) ---
cube_x = 100 # 直方体のX方向サイズ
cube_y = 20 # 直方体のY方向サイズ
cube_z = 20 # 直方体のZ方向サイズ
# 回転角度のリスト
rot_list = [
[0, 0, 0],
[10, 20, 300],
[200, 40, 57],
[20, 88, 57],
]
# 各パーツの色(RGBA形式: [R, G, B, Alpha])
# 外側の直方体用(半透明 0.31)
color_list = [
[1.0, 0.0, 0.0, 0.31],
[0.0, 1.0, 0.0, 0.31],
[0.0, 0.0, 1.0, 0.31],
[1.0, 0.5, 0.0, 0.31],
]
# 中心の交差部分用色(Tomato色: 不透明)
tomato_color = [1.0, 0.39, 0.28, 1.0]
# --- メイン処理 ---
# 1. 基本形状(原点を中心に配置)
base = cube([cube_x, cube_y, cube_z], center=True)
# 回転させた基本形状のリストを作成
rotated_parts = []
for rot in rot_list:
rotated = rotate(base, rot)
rotated_parts.append(rotated)
# 2. 外側の半透明モデル(Union)を作成
colored_parts = []
for i in range(len(rot_list)):
colored = color(rotated_parts[i], color_list[i])
colored_parts.append(colored)
union_result = colored_parts[0]
for part in colored_parts[1:]:
union_result = union_result + part # + 演算子で結合
# 3. 中心の交差部分(Intersection)を作成
intersect_result = rotated_parts[0]
for part in rotated_parts[1:]:
intersect_result = intersection(intersect_result, part)
core_colored = color(intersect_result, tomato_color)
# 4. 3Dプレビュー表示(可視化の工夫:分けて表示する)
show(core_colored)
show(union_result)
5. まとめ
3D CADとプログラミングを組み合わせたものづくりでは、「頭の中の計算」と「実際の形状」にズレが生じることが多々あります。
今回のように、プログラムが上手く動かない・見えないときに、「どうすれば視覚的に確認できるか?」「どうすればエラーを回避できるか?」 を考え、表示方法やデータ構造(リスト)を工夫する姿勢は、エンジニアリングにおいて非常に重要です。
複雑な部品を設計するときは、ぜひこの「半透明可視化テクニック」を使って、自分のコードが正しく形を作れているか確認しながら進めてみてください。
追記:練習帳です。




