3D Workspace
Home
Assets
Affiliate Program
Creator Program
Sign up/Log in
View Plans
DCC Bridge
chankit
12-01 17:58
Model Name
jesus figure 3d model
Tags
3d printing
3d printing stylized
character
character 3d printing
character 3d printing stylized
character stylized
jesus figure
stylized
Input
Prompt
import numpy as np from PIL import Image import struct def make_stl(image_path, output_filename, width_mm=80, depth_mm=5, invert=False): print(f"正在讀取圖片: {image_path} ...") try: img = Image.open(image_path).convert('L') # 轉灰階 except FileNotFoundError: print(f"錯誤:找不到檔案 {image_path},請確認檔名是否正確。") return # 計算尺寸 width_px, height_px = img.size scale = width_mm / width_px height_mm = height_px * scale print(f"圖片尺寸: {width_px}x{height_px} 像素") print(f"模型尺寸: {width_mm}x{height_mm:.2f} mm") # 建立高度圖 img_array = np.array(img) if invert: img_array = 255 - img_array # 轉換為 Z 軸高度 z_heights = (img_array / 255.0) * depth_mm # 建立 X, Y 網格 x = np.linspace(0, width_mm, width_px) y = np.linspace(0, height_mm, height_px) # 翻轉 Y 讓圖片方向正確 y = y[::-1] X, Y = np.meshgrid(x, y) Z = z_heights print("正在生成幾何網格 (Vectorized)...") # 準備頂點數據 (利用 Numpy 向量化運算,比 for 迴圈快 100 倍) # 定義每個網格的四個角 v1_x, v1_y, v1_z = X[:-1, :-1], Y[:-1, :-1], Z[:-1, :-1] v2_x, v2_y, v2_z = X[:-1, 1:], Y[:-1, 1:], Z[:-1, 1:] v3_x, v3_y, v3_z = X[1:, :-1], Y[1:, :-1], Z[1:, :-1] v4_x, v4_y, v4_z = X[1:, 1:], Y[1:, 1:], Z[1:, 1:] # 建立兩個三角形 (Triangle A: v1-v2-v3, Triangle B: v2-v4-v3) # STL 格式需要法向量(Normal),這裡簡化設為 (0,0,0) 讓切片軟體自行計算 # 組合數據用於二進位寫入 # 每個三角形有 12 個 float32 (3個法向量 + 3個頂點 * 3座標) # 這裡我們手動寫入 Binary STL 以避免依賴 numpy-stl 套件 num_triangles = (height_px - 1) * (width_px - 1) * 2 header = b'\x00' * 80 print("正在寫入 STL 檔案...") with open(output_filename, 'wb') as f: f.write(header) f.write(struct.pack('<I', num_triangles)) # 為了寫入效率,我們將數據展平 # Triangle 1: v1, v2, v3 t1_x = np.stack((v1_x, v2_x, v3_x), axis=2).flatten() t1_y = np.stack((v1_y, v2_y, v3_y), axis=2).flatten() t1_z = np.stack((v1_z, v2_z, v3_z), axis=2).flatten() # Triangle 2: v2, v4, v3 t2_x = np.stack((v2_x, v4_x, v3_x), axis=2).flatten() t2_y = np.stack((v2_y, v4_y, v3_y), axis=2).flatten() t2_z = np.stack((v2_z, v4_z, v3_z), axis=2).flatten() # 合併所有三角形 all_x = np.empty(t1_x.size + t2_x.size, dtype=np.float32) all_x[0::2] = t1_x all_x[1::2] = t2_x all_y = np.empty(t1_y.size + t2_y.size, dtype=np.float32) all_y[0::2] = t1_y all_y[1::2] = t2_y all_z = np.empty(t1_z.size + t2_z.size, dtype=np.float32) all_z[0::2] = t1_z all_z[1::2] = t2_z # 重組為 STL 二進位結構: [Normal(3), V1(3), V2(3), V3(3), Attr(1 uint16)] # 這裡比較 tricky,為了簡單,我們用迴圈寫入 struct 或者使用 buffer # 為了最快速度,我們使用 struct.pack_into 的緩衝區方法 (略微複雜), # 這裡改用簡單的逐塊寫入,雖然 Python 寫迴圈慢,但比計算幾何快。 # 建立 zeros 作為法向量 zeros = np.zeros(num_triangles, dtype=np.float32) attr = b'\x00\x00' # 重新整理 shape 以便寫入: (Num_Triangles, 3 vertices, 3 coords) # 為了代碼極簡化,我們退回使用 numpy 結構化陣列寫入 dtype_stl = np.dtype([ ('normal', '<f4', (3,)), ('v1', '<f4', (3,)), ('v2', '<f4', (3,)), ('v3', '<f4', (3,)), ('attr', '<u2') ]) mesh_data = np.zeros(num_triangles, dtype=dtype_stl) # 填入數據 (Reshape data for bulk assignment) # T1 mesh_data['v1'][0::2, 0] = v1_x.flatten(); mesh_data['v1'][0::2, 1] = v1_y.flatten(); mesh_data['v1'][0::2, 2] = v1_z.flatten() mesh_data['v2'][0::2, 0] = v2_x.flatten(); mesh_data['v2'][0::2, 1] = v2_y.flatten(); mesh_data['v2'][0::2, 2] = v2_z.flatten() mesh_data['v3'][0::2, 0] = v3_x.flatten(); mesh_data['v3'][0::2, 1] = v3_y.flatten(); mesh_data['v3'][0::2, 2] = v3_z.flatten() # T2 mesh_data['v1'][1::2, 0] = v2_x.flatten(); mesh_data['v1'][1::2, 1] = v2_y.flatten(); mesh_data['v1'][1::2, 2] = v2_z.flatten() mesh_data['v2'][1::2, 0] = v4_x.flatten(); mesh_data['v2'][1::2, 1] = v4_y.flatten(); mesh_data['v2'][1::2, 2] = v4_z.flatten() mesh_data['v3'][1::2, 0] = v3_x.flatten(); mesh_data['v3'][1::2, 1] = v3_y.flatten(); mesh_data['v3'][1::2, 2] = v3_z.flatten() mesh_data.tofile(f) print(f"成功!檔案已儲存為: {output_filename}") # --- 設定區 --- # 請將 'jesus.jpg' 改為您上傳的圖片檔名 input_image = 'jesus.jpg' output_stl = 'jesus_relief.stl' # 執行 if __name__ == "__main__": # 需要先安裝 Pillow: pip install pillow numpy make_stl(input_image, output
Detailed Info
Related Models
Enter invite code
Enter invite code to get credits!