首页/在线代码库/demo31_3d_automodel.py

demo31_3d_automodel.py

1. 左: 程序化建模 — 用参数(旋转体/挤出)生成复杂形状, 展示"参数→模型" 2. 中: 参数化建模 — 一个参数变化 → 模型连续变形 (控制柄) 3. 右: 生成式建模 (VAE/Diffusion) 流程图示意

Python 72 行 系列:识别系列 🔒 源码仅供在线学习,不提供文件下载
完整源码 · 在线查看demo31_3d_automodel.py
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
"""演示4: 三维自动化建模 — 程序化/参数化建模 + 生成式对比.

1. 左: 程序化建模 — 用参数(旋转体/挤出)生成复杂形状, 展示"参数→模型"
2. 中: 参数化建模 — 一个参数变化 → 模型连续变形 (控制柄)
3. 右: 生成式建模 (VAE/Diffusion) 流程图示意
"""
import os
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from figure_style import figures_dir, configure

configure()
OUT = figures_dir()
os.makedirs(OUT, exist_ok=True)


def lathe_profile(t, a=1.0, b=1.0):
    """旋转体: 母线 r(t) 绕 z 轴旋转生成曲面. 参数 a,b 控制形状."""
    n = 40
    r = a * (1 + 0.3 * np.sin(b * t))   # 母线半径随 t 变化
    return r


def lathe_mesh(a, b, nz=40, nt=40):
    """参数化旋转体: 母线 r(z) 绕 z 轴. (花瓶/杯子/铃铛等)"""
    z = np.linspace(0, 1, nz)
    r = a * (0.4 + 0.6 * np.sin(b * z * np.pi + 0.3) ** 2)   # 母线条纹
    th = np.linspace(0, 2 * np.pi, nt)
    Z, T = np.meshgrid(z, th)
    R = np.tile(r, (nt, 1))
    X = R * np.cos(T); Y = R * np.sin(T)
    return X, Y, Z


# ============ 可视化 ============
fig = plt.figure(figsize=(15, 5))

# 左: 程序化建模 (旋转体)
ax = fig.add_subplot(1, 3, 1, projection='3d')
X, Y, Z = lathe_mesh(1.0, 1.0)
ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)
ax.set_title('程序化建模: 旋转体\n(母线绕轴旋转)')

# 中: 参数化变形 (a 参数变化 → 形状连续变化)
ax = fig.add_subplot(1, 3, 2, projection='3d')
for a, alpha in [(0.8, 0.35), (1.2, 0.7)]:
    X, Y, Z = lathe_mesh(a, 1.0)
    ax.plot_surface(X + a * 2 - 1.8, Y, Z, cmap='plasma', alpha=alpha)
ax.set_title('参数化建模: 参数 a 驱动形状变形\n(0.8 → 1.2 连续)')

# 右: 生成式建模流程
ax = fig.add_subplot(1, 3, 3)
ax.set_xlim(0, 10); ax.set_ylim(0, 6); ax.axis('off')
boxes = [("随机噪声 z", 0.5, "tab:blue"), ("编码器", 3.2, "tab:green"),
         ("隐空间\n(形状语义)", 5.5, "tab:orange"), ("解码器", 7.8, "tab:green"),
         ("输出模型\n(Mesh/点云)", 9.0, "tab:red")]
for name, x, c in boxes:
    ax.add_patch(plt.Rectangle((x, 2.2), 1.2, 1.6, fc=c, ec='k', alpha=0.8))
    ax.text(x+0.6, 3.0, name, ha='center', va='center', fontsize=8, color='white')
for i in range(len(boxes)-1):
    x0 = boxes[i][1]+1.2; x1 = boxes[i+1][1]
    ax.annotate('', xy=(x1, 3.0), xytext=(x0, 3.0),
                arrowprops=dict(arrowstyle='-|>', lw=1.5))
ax.set_title('生成式建模 (VAE/Diffusion)\n随机向量 → 新形状')

fig.suptitle('三维自动化建模: 程序化 / 参数化 / 生成式', fontsize=14)
fig.tight_layout(rect=(0, 0, 1, 0.92))
out = os.path.join(OUT, 'fig3d_automodel.png')
fig.savefig(out, dpi=150)
print(f"-> {out}")

输出图

fig3d_automodel.png
输出图 · fig3d_automodel.png