1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PythonSCAD】重なりが見える!半透明と色分けで複雑な3D交差を可視化するデバッグテクニック

1
Last updated at Posted at 2026-07-29

機械部品や建築モデルをプログラミングで設計しているとき、「複数のパーツがどう重なっていて、最終的にどんな形になるのか?」が頭の中だけではイメージしにくいことがあると思います。

特に、共通部分だけを残す intersection(交差)を使うと、削る前の元の図形が消えてしまうため、自分のプログラムが合っているのか確認が難しくなります。

result = intersection(result, part)

スクリーンショット 2026-07-29 103055.png

result = union(result, part)

スクリーンショット 2026-07-29 102916.png

今回は、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)

スクリーンショット 2026-07-29 103428.png


2. 結合時の罠:「足し算(+)」で色が潰れてしまう!?

全体の重なり具合(Union)と、中心の交差部分(Intersection)を同時に見比べるため、プログラムの中で2つのパーツを作ります。

  1. 半透明の全体像(union_result
  2. 色のついた中心部分(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回に分けて実行することで、ビューアーはそれぞれを別のオブジェクトとして認識し、半透明のボックスの奥に、真っ赤な交差部分がくっきりと浮かび上がるようになります。

スクリーンショット 2026-07-29 103855.png


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)

スクリーンショット 2026-07-29 104015.png

5. まとめ

3D CADとプログラミングを組み合わせたものづくりでは、「頭の中の計算」と「実際の形状」にズレが生じることが多々あります。

今回のように、プログラムが上手く動かない・見えないときに、「どうすれば視覚的に確認できるか?」「どうすればエラーを回避できるか?」 を考え、表示方法やデータ構造(リスト)を工夫する姿勢は、エンジニアリングにおいて非常に重要です。
複雑な部品を設計するときは、ぜひこの「半透明可視化テクニック」を使って、自分のコードが正しく形を作れているか確認しながら進めてみてください。

追記:練習帳です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?