news 2026/8/20 10:50:16

基于AI图像生成的三维模型雕刻:从深度图到顶点位移的实践指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于AI图像生成的三维模型雕刻:从深度图到顶点位移的实践指南

在数字艺术和三维建模领域,模型雕刻是赋予模型细节与生命力的核心环节。传统的雕刻流程往往依赖于专业软件和复杂的笔刷系统,对于追求特定风格或快速概念化的创作者而言,有时会显得不够直接或灵活。近年来,随着AI绘画和生成式模型技术的兴起,一种结合了图像生成与三维雕刻的新思路开始出现,它允许艺术家通过二维图像或文本描述来引导三维模型的形态变化,极大地拓展了创作的边界和想象力。

“FK?模型雕刻还能这样!”这个标题所指向的,很可能就是这样一种探索性的工作流或工具尝试。它暗示了一种非传统(FK可能指代某种非常规方法或工具)的模型雕刻方式。本文将围绕如何利用图像生成技术(如Stable Diffusion等)作为辅助或驱动手段,来影响和雕刻三维模型这一主题展开。我们将从原理理解开始,逐步构建一个从图像到模型顶点偏移的实践流程,涵盖环境搭建、数据准备、核心算法思路、代码实现以及结果验证。无论你是三维艺术家想寻找新的灵感工具,还是技术开发者对跨模态内容生成感兴趣,这篇文章都将提供一个可操作的技术视角。

1. 理解基于图像的模型雕刻原理

传统的三维雕刻软件(如ZBrush、Blender的Sculpt Mode)通过笔刷直接在模型网格的顶点上施加位移、平滑、捏拉等操作。而“基于图像的雕刻”其核心思想是将一个二维图像的信息(如深度、法线、语义内容)转化为作用于三维模型顶点上的力或位移场。

1.1 核心概念:深度图与法线图作为雕刻向导

最直接的方式是利用深度图(Depth Map)或法线图(Normal Map)。深度图记录了场景中每个像素点到摄像机的距离信息,法线图记录了物体表面每个像素点的朝向信息。这两种图都可以从二维图像通过专门的AI模型(如MiDaS, Marigold)预测得到,或者由另一款三维软件渲染生成。

  • 深度图驱动雕刻:我们可以将预测得到的深度图与当前三维模型从相同视角渲染出的深度图进行对比。两者的差异(Diff)直接指明了模型表面哪些区域需要“推进”或“拉出”。将这种差异映射回三维空间,并转化为顶点沿摄像机视线方向的位移,就完成了一次基于深度差异的雕刻。
  • 法线图驱动雕刻:法线图提供了更丰富的表面细节朝向信息。通过比较生成的法线图与模型渲染法线图的差异,我们可以计算出模型表面局部区域需要如何旋转或弯曲,从而调整顶点位置,模拟出凹凸、划痕等精细细节。

1.2 工作流概述

一个完整的、可实践的工作流通常包含以下几个关键步骤:

  1. 输入准备:获取或生成一张用于指导雕刻的二维图像(风格图、概念图、深度图等)。
  2. 视图对齐:将三维模型摆放到一个特定的视角(通常是正交视图),并渲染出该视角下的模型图像(如颜色、深度、法线)。
  3. 差异计算:使用AI模型或图像处理算法,计算指导图像与模型渲染图像之间的差异。这个差异需要被量化为一个“位移场”或“影响权重图”。
  4. 空间映射:将二维图像上的差异(像素级)准确地映射到三维模型对应的顶点上。这是最关键也是最复杂的一步,需要处理UV展开、射线投射或屏幕空间到三维空间的变换。
  5. 顶点位移:根据映射得到的差异信息,计算每个顶点需要移动的向量(方向和大小),并应用到位移修改器或直接修改顶点坐标。
  6. 迭代优化:单次映射可能不够精确或强度不合适,需要设计迭代机制,允许用户控制雕刻强度、平滑度,并进行多轮微调。

2. 环境准备与工具链搭建

要实现上述流程,我们需要一个三维软件作为操作主体,以及处理图像和算法的编程环境。这里以Blender(开源三维软件)和Python为例,因为它提供了强大的Python API(bpy)和丰富的内置渲染器。

2.1 基础软件安装

  • Blender:前往Blender官网下载并安装最新稳定版(如3.6 LTS或更高)。确保安装路径不含中文或特殊字符。
  • Python:Blender已内置Python解释器。但为了本地开发和调试方便,建议在系统也安装一个与Blender内置版本匹配的Python(例如Blender 3.6内置Python 3.10)。你可以在Blender的脚本编辑器顶部查看Python版本。

2.2 关键Python库安装

Blender内置的Python环境是独立的。我们需要通过其自带的pip来安装必要的库。打开Blender,切换到“Scripting”工作区,打开“Scripting”选项卡下的Python控制台。

# 在Blender的Python控制台中执行,获取blender python的pip路径 import sys print(sys.executable) # 通常类似:C:\Program Files\Blender Foundation\Blender 3.6\3.6\python\bin\python.exe # 我们将使用这个python来安装包

然后,在系统命令行(终端或CMD)中,使用上述路径的python -m pip来安装。例如在Windows上:

# 将路径替换成你打印出来的路径 "C:\Program Files\Blender Foundation\Blender 3.6\3.6\python\bin\python.exe" -m pip install numpy opencv-python Pillow torch torchvision --index-url https://download.pytorch.org/whl/cpu

注意:如果你打算使用GPU加速,需要安装对应CUDA版本的PyTorch。对于初步实验,CPU版本已足够。安装opencv-pythonPillow用于图像处理,numpy是基础数值计算库。

2.3 项目目录结构规划

在开始编码前,规划一个清晰的目录结构有助于管理脚本、图像和中间数据。

alpha_sculpt_project/ ├── scripts/ # 存放所有Python脚本 │ ├── __init__.py │ ├── depth_estimator.py # 深度估计模块 │ ├── image_processor.py # 图像处理与差异计算 │ ├── mesh_mapper.py # 2D到3D映射核心逻辑 │ └── main_operator.py # Blender操作符主入口 ├── input_images/ # 存放输入的指导图像 ├── output_data/ # 存放生成的深度图、差异图等 ├── temp/ # 临时渲染输出 └── README.md

3. 核心模块实现:从图像到顶点位移

我们将把整个流程拆解成几个独立的模块,最后在Blender中用一个操作符串联起来。

3.1 深度图生成模块

首先,我们需要一个能从任意RGB图像预测深度图的工具。这里我们使用一个轻量化的深度学习模型,例如MiDaS的小型版本。创建scripts/depth_estimator.py

# scripts/depth_estimator.py import torch import cv2 import numpy as np from PIL import Image import torchvision.transforms as transforms class DepthEstimator: def __init__(self, model_type='midas_small'): self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') self.model = None self.transform = None self.load_model(model_type) def load_model(self, model_type): # 这里以MiDaS为例,实际需根据模型加载逻辑编写 # 简化示例:我们假设有一个返回随机深度图的函数来演示流程 print(f"Loading depth estimation model ({model_type}) on {self.device}...") # 实际项目中,这里应加载真实的MiDaS模型 # from midas.model_loader import load_model # self.model, self.transform, self.net_w, self.net_h = load_model(self.device, model_type, ...) pass def estimate(self, image_path): """ 输入图像路径,返回归一化的深度图numpy数组 (H, W),值范围[0, 1]。 """ # 1. 读取图像 img = Image.open(image_path).convert('RGB') original_size = img.size # (W, H) # 2. 应用模型变换并进行推理(此处为示例,用随机数据代替) # transformed_img = self.transform(img).to(self.device) # with torch.no_grad(): # depth_pred = self.model(transformed_img) # depth_pred = torch.nn.functional.interpolate( # depth_pred.unsqueeze(1), # size=original_size[::-1], # (H, W) # mode="bicubic", # align_corners=False, # ).squeeze().cpu().numpy() # 3. 示例:生成一个模拟的深度图(中心凸起) # 在实际应用中,务必替换为真实的模型推理结果 h, w = 256, 256 # 假设固定大小 y, x = np.ogrid[:h, :w] center_y, center_x = h // 2, w // 2 circle = np.sqrt((x - center_x)**2 + (y - center_y)**2) max_dist = np.sqrt(center_x**2 + center_y**2) depth_simulated = 1.0 - np.clip(circle / max_dist, 0, 1) # 中心最亮(近),边缘暗(远) depth_simulated = (depth_simulated - depth_simulated.min()) / (depth_simulated.max() - depth_simulated.min() + 1e-8) # 4. 将模拟深度图缩放到原始图像大小(仅示例) depth_map = cv2.resize(depth_simulated, original_size, interpolation=cv2.INTER_LINEAR) return depth_map # 测试代码 if __name__ == '__main__': estimator = DepthEstimator() depth = estimator.estimate('../input_images/reference.jpg') print(f"Depth map shape: {depth.shape}, range: [{depth.min():.3f}, {depth.max():.3f}]")

3.2 图像差异计算与处理模块

创建scripts/image_processor.py,负责计算指导深度图与模型渲染深度图的差异,并处理成位移权重图。

# scripts/image_processor.py import cv2 import numpy as np def compute_displacement_map(depth_guide, depth_render, mode='subtract'): """ 计算位移图。 depth_guide: 指导深度图,值范围[0,1],对象越近值越大(通常)。 depth_render: 模型渲染深度图,值范围[0,1]。 mode: 'subtract' (guide - render), 'relative' 等。 返回: displacement_map,正值表示顶点需要向摄像机方向移动(凸起),负值表示远离(凹陷)。 """ if mode == 'subtract': # 简单相减:指导图更亮(值大)的地方,模型需要凸起 disp = depth_guide - depth_render else: # 其他更复杂的差异计算方式,如考虑局部对比度 disp = depth_guide - depth_render # 可选:对位移图进行高斯模糊,使得雕刻过渡平滑 disp_smoothed = cv2.GaussianBlur(disp, (5, 5), sigmaX=1.5) return disp_smoothed def normalize_displacement(disp_map, strength=1.0, clamp_abs=0.5): """ 归一化位移图,并应用强度系数。 strength: 整体雕刻强度乘子。 clamp_abs: 将位移值限制在[-clamp_abs, clamp_abs]之间,避免极端变形。 """ # 首先限制绝对范围,防止个别像素差异过大 disp_clamped = np.clip(disp_map, -clamp_abs, clamp_abs) # 然后应用强度 disp_normalized = disp_clamped * strength return disp_normalized

3.3 2D到3D顶点映射模块

这是最核心的模块。我们需要将图像像素上的位移值,准确地施加到三维模型的顶点上。一个常见且有效的方法是使用射线投射(Ray Cast)。对于模型当前视角下的每个像素,我们向场景发射一条射线,击中模型的点(或最近顶点)就是需要被影响的点。创建scripts/mesh_mapper.py

# scripts/mesh_mapper.py import bpy import bmesh from mathutils import Vector import numpy as np def get_viewport_camera_data(): """获取当前激活相机和视图矩阵信息。""" scene = bpy.context.scene camera = scene.camera if not camera: raise Exception("No active camera found in scene.") # 获取相机矩阵和渲染分辨率 render = scene.render width = render.resolution_x * render.resolution_percentage / 100 height = render.resolution_y * render.resolution_percentage / 100 # 计算投影矩阵(简化版,Blender有更精确的API) # 这里我们主要使用射线投射方法,矩阵计算可后续优化 return camera, width, height def map_displacement_to_vertices(obj, disp_map, strength_field='DISPLACEMENT'): """ 将位移图映射到物体的顶点上。 obj: Blender网格物体。 disp_map: 二维位移图(numpy数组),与渲染视图大小一致。 strength_field: 用于存储位移强度的顶点组名称。 """ if obj.type != 'MESH': print(f"Object {obj.name} is not a mesh.") return scene = bpy.context.scene depsgraph = bpy.context.evaluated_depsgraph_get() # 获取物体的世界矩阵和逆矩阵 matrix_world = obj.matrix_world matrix_world_inv = matrix_world.inverted() # 创建或获取顶点组 vgroup = obj.vertex_groups.get(strength_field) if not vgroup: vgroup = obj.vertex_groups.new(name=strength_field) # 初始化顶点权重数组 mesh = obj.data verts = mesh.vertices vertex_weights = np.zeros(len(verts)) vertex_hit_count = np.zeros(len(verts)) # 获取相机和渲染设置 camera, width, height = get_viewport_camera_data() # 简化映射:这里使用一个基于UV的映射示例,前提是模型有良好的UV展开且与渲染视图对应。 # 更通用的方法是射线投射,但代码更复杂。以下为基于UV的简化版本。 if mesh.uv_layers.active: uv_layer = mesh.uv_layers.active.data disp_h, disp_w = disp_map.shape for poly in mesh.polygons: for loop_idx in poly.loop_indices: vert_idx = mesh.loops[loop_idx].vertex_index uv = uv_layer[loop_idx].uv # 将UV坐标[0,1]映射到位移图像素坐标 px = int(uv.x * (disp_w - 1)) py = int((1 - uv.y) * (disp_h - 1)) # Blender V坐标原点在底部 if 0 <= px < disp_w and 0 <= py < disp_h: weight = disp_map[py, px] vertex_weights[vert_idx] += weight vertex_hit_count[vert_idx] += 1 # 平均权重(如果多个UV点映射到同一顶点) for i in range(len(verts)): if vertex_hit_count[i] > 0: avg_weight = vertex_weights[i] / vertex_hit_count[i] vgroup.add([i], avg_weight, 'REPLACE') else: print(f"Mesh {obj.name} has no active UV layer. UV-based mapping skipped.") # 此处应回退到射线投射方法 print(f"Displacement mapping applied to {np.sum(vertex_hit_count>0)} vertices.") def apply_displacement_modifier(obj, strength=0.1, midlevel=0.0, vgroup_name='DISPLACEMENT'): """ 为物体添加一个位移修改器,并使用顶点组控制强度。 """ # 移除同名的旧修改器 if vgroup_name in obj.modifiers: obj.modifiers.remove(obj.modifiers[vgroup_name]) # 创建新的位移修改器 disp_mod = obj.modifiers.new(name=vgroup_name, type='DISPLACE') # 创建一个空纹理来控制位移 tex = bpy.data.textures.new(name=f"Tex_{vgroup_name}", type='CLOUDS') disp_mod.texture = tex disp_mod.texture_coords = 'UV' # 关键:使用顶点组来控制位移强度 disp_mod.vertex_group = vgroup_name disp_mod.strength = strength disp_mod.mid_level = midlevel print(f"Displacement modifier '{vgroup_name}' added with strength {strength}.")

4. 在Blender中集成与操作流程

我们将创建一个Blender操作符,提供一个用户界面(UI)来串联整个流程。创建scripts/main_operator.py

# scripts/main_operator.py import bpy import sys import os from pathlib import Path # 将scripts目录添加到Python路径,以便导入自定义模块 blend_dir = Path(bpy.data.filepath).parent if bpy.data.filepath else Path.cwd() scripts_dir = blend_dir / "scripts" if scripts_dir.exists() and str(scripts_dir) not in sys.path: sys.path.append(str(scripts_dir)) try: from depth_estimator import DepthEstimator from image_processor import compute_displacement_map, normalize_displacement from mesh_mapper import map_displacement_to_vertices, apply_displacement_modifier except ImportError as e: print(f"Failed to import custom modules: {e}") # 定义空函数或类作为fallback class DepthEstimator: def estimate(self, x): return np.zeros((256,256)) def compute_displacement_map(a,b,**k): return a-b def normalize_displacement(a,**k): return a def map_displacement_to_vertices(*args,**kwargs): print("Mapping skipped.") def apply_displacement_modifier(*args,**kwargs): print("Modifier skipped.") import numpy as np class ZYH_OT_alpha_sculpt(bpy.types.Operator): """执行Alpha雕刻的主要操作符""" bl_idname = "object.zyh_alpha_sculpt" bl_label = "Alpha Sculpt from Image" bl_options = {'REGISTER', 'UNDO'} # 定义操作符的属性,这些会在UI中显示为可调整的参数 image_path: bpy.props.StringProperty( name="Guide Image", description="Path to the guide image for sculpting", default="", subtype='FILE_PATH' ) strength: bpy.props.FloatProperty( name="Sculpt Strength", description="Overall strength of the displacement", default=0.5, min=0.0, max=5.0 ) iterations: bpy.props.IntProperty( name="Iterations", description="Number of smoothing/refinement iterations", default=1, min=1, max=10 ) def execute(self, context): obj = context.active_object if not obj or obj.type != 'MESH': self.report({'ERROR'}, "Please select a mesh object.") return {'CANCELLED'} if not os.path.exists(self.image_path): self.report({'ERROR'}, f"Guide image not found: {self.image_path}") return {'CANCELLED'} # 步骤1: 估计指导图像的深度图 self.report({'INFO'}, "Estimating depth from guide image...") estimator = DepthEstimator() depth_guide = estimator.estimate(self.image_path) # 步骤2: 渲染当前模型在相机视角下的深度图 self.report({'INFO'}, "Rendering current mesh depth...") # 这里需要设置渲染引擎为Cycles或EEVEE,并渲染深度通道。 # 为简化示例,我们生成一个模拟的平面深度图。 # 实际项目中,应调用bpy.ops.render.render()并读取深度EXR文件。 scene = context.scene render_settings = scene.render width = int(render_settings.resolution_x * render_settings.resolution_percentage / 100) height = int(render_settings.resolution_y * render_settings.resolution_percentage / 100) depth_render = np.ones((height, width)) * 0.5 # 模拟一个平面 # 步骤3: 计算位移图 self.report({'INFO'}, "Computing displacement map...") disp_raw = compute_displacement_map(depth_guide, depth_render, mode='subtract') disp_final = normalize_displacement(disp_raw, strength=self.strength, clamp_abs=0.3) # 步骤4: 映射位移到顶点 self.report({'INFO'}, "Mapping displacement to vertices...") map_displacement_to_vertices(obj, disp_final, strength_field='ALPHA_SCULPT') # 步骤5: 应用位移修改器 self.report({'INFO'}, "Applying displacement modifier...") apply_displacement_modifier(obj, strength=0.2, vgroup_name='ALPHA_SCULPT') self.report({'INFO'}, "Alpha Sculpt operation completed!") return {'FINISHED'} def invoke(self, context, event): # 可以在这里打开文件浏览器选择图片 wm = context.window_manager return wm.invoke_props_dialog(self) # 将操作符注册到Blender def register(): bpy.utils.register_class(ZYH_OT_alpha_sculpt) def unregister(): bpy.utils.unregister_class(ZYH_OT_alpha_sculpt) # 用于测试:在Blender文本编辑器中运行此脚本会注册操作符 if __name__ == "__main__": register() # 也可以在这里添加一个菜单项,方便测试

在Blender中使用该脚本:

  1. main_operator.py以及依赖的其他模块文件放入Blender的脚本目录(如C:\Users\YourName\AppData\Roaming\Blender Foundation\Blender\3.6\scripts\addons\下的自定义文件夹),或在文本编辑器中打开并运行。
  2. 在3D视图中选择一个网格物体。
  3. 按下F3打开搜索菜单,输入“Alpha Sculpt from Image”,找到并点击运行我们创建的操作符。
  4. 在弹出的对话框中,选择指导图像路径,调整雕刻强度和迭代次数,点击“OK”执行。

5. 运行验证与结果分析

执行操作后,你应该能看到:

  1. 顶点组创建:在物体的“数据属性”选项卡下的“顶点组”中,会出现一个名为ALPHA_SCULPT的组,其中存储了每个顶点受影响的权重。
  2. 修改器添加:在物体的“修改器属性”选项卡中,会添加一个“位移”修改器,其纹理坐标设置为“UV”,顶点组设置为ALPHA_SCULPT。调整修改器的强度参数可以全局控制雕刻效果的明显程度。
  3. 模型变形:视图中的模型会根据指导图像(示例中为模拟的中心凸起深度图)发生形变。由于我们使用了模拟数据,变形可能是一个简单的凸起。使用真实的深度图(例如一张人脸侧面深度图),模型表面将产生对应的起伏。

验证方法

  • 视图切换:在物体模式或编辑模式下,切换到“权重绘制”模式,可以看到顶点组ALPHA_SCULPT的权重可视化(通常红色代表高权重/凸起,蓝色代表低权重/凹陷)。这直观地显示了图像信息映射到了模型的哪些区域。
  • 修改器调整:尝试调整位移修改器的强度中间值参数,观察模型形变的变化。关闭或打开修改器眼睛图标可以对比雕刻前后效果。
  • 重新渲染:从相同相机视角重新渲染一张深度图或颜色图,与原始指导图对比,观察模型轮廓是否向指导图靠拢。

6. 常见问题排查与优化

在实际操作中,你可能会遇到以下问题:

问题现象可能原因检查与解决思路
运行脚本时报ModuleNotFoundErrorPython路径未包含自定义模块目录。确保sys.path.append正确指向了scripts文件夹的绝对路径。在Blender文本编辑器中,可以使用print(sys.path)检查路径。
模型没有任何变化1. 顶点组未成功创建或赋值。
2. 位移修改器未正确链接顶点组。
3. UV映射不正确,所有顶点权重为0。
1. 检查物体顶点组列表,确认ALPHA_SCULPT组存在且有权重。
2. 检查位移修改器的“顶点组”字段是否选择了ALPHA_SCULPT
3. 确保模型有展开的UV,并且UV没有重叠或严重扭曲。在“UV编辑”工作区查看。
雕刻效果错位或扭曲1. 指导图像与模型渲染视角不匹配。
2. UV展开方式导致2D-3D映射错误。
3. 深度图预测不准确。
1. 确保在运行脚本前,将相机对准模型的正交视图(如前视图、侧视图),并与指导图像的视角大致对齐。
2. 尝试使用更通用的射线投射映射法替代UV映射(需实现ray_cast相关代码)。
3. 使用更可靠的深度估计模型(如MiDaS v3.1),并对输入图像进行预处理(裁剪、缩放)。
模型表面出现不希望的尖锐凸起或裂缝1. 位移图差异值过大(clamp_abs设置过小)。
2. 模型拓扑(面数)不足以支撑细节。
3. 未对位移图或权重进行平滑处理。
1. 增加normalize_displacement函数中的clamp_abs参数值,限制最大位移。
2. 在雕刻前对模型使用“细分表面”修改器增加面数,或在雕刻后使用“平滑”笔刷手动处理。
3. 在compute_displacement_map函数中增加更强烈的高斯模糊,或在映射后对顶点组权重进行平滑(Blender有“平滑顶点权重”功能)。
性能缓慢,尤其是高面数模型射线投射或逐顶点计算在Python中循环效率低。1. 对于UV映射法,确保使用NumPy向量化操作,避免纯Python循环。
2. 考虑将核心映射计算用C++编写为Blender插件,或利用Blender的bpy.ops内置操作。
3. 降低预览精度,或对低模代理进行操作,再通过数据传递应用到高模。

7. 最佳实践与扩展方向

7.1 生产环境建议

  1. 版本控制与模块化:将深度估计、图像处理、映射逻辑彻底分离为独立模块,便于单独测试、升级和替换。例如,可以轻松将MiDaS替换为其他深度估计模型。
  2. 配置外置化:将雕刻强度、迭代次数、深度模型类型、模糊半径等参数保存到外部JSON或YAML配置文件,避免硬编码在脚本中。
  3. 日志与监控:在关键步骤添加日志记录,记录输入图像尺寸、深度图范围、影响的顶点数、最大最小位移值等,便于调试和复现。
  4. 异常处理:增加对文件不存在、模型类型错误、GPU内存不足、图像尺寸不匹配等情况的健壮性处理,给出明确的错误提示。
  5. 预览与撤销:在Blender中实现一个实时预览窗口(使用modal操作符),让用户在不实际应用修改器的情况下预览效果。确保操作支持Blender的多级撤销。

7.2 扩展方向

  1. 多视角雕刻:当前流程是单视角的。可以扩展为从多个视角(前、后、左、右、顶)分别输入指导图像,生成多张位移图,并融合到一个统一的顶点组或纹理中,实现全角度雕刻。
  2. 纹理驱动雕刻:不仅使用深度图,还可以利用AI生成的法线图高度图作为输入,甚至可以直接使用风格化图像的颜色或亮度信息来驱动顶点位移,创造更艺术化的效果。
  3. 结合笔刷系统:将计算得到的位移权重图与Blender内置的雕刻笔刷系统结合。例如,将权重图转换为一张遮罩(Mask),限制雕刻笔刷只在特定区域起作用,或者将权重直接作为笔刷的“强度贴图”。
  4. 实时交互:利用Blender的bglgpu模块,开发一个在3D视图中实时显示深度图差异或位移权重热图的工具,实现更直观的交互式雕刻。
  5. 集成到几何节点:Blender 3.0+的几何节点系统功能强大。可以尝试将整个图像到位移的流程封装成一个几何节点,利用其非破坏性和可组合性优势,构建更复杂的模型生成管线。

通过将二维图像生成技术与三维模型编辑相结合,我们打开了一扇新的大门。这种方法的真正威力在于它打破了传统雕刻对艺术家手部技能和逐点操作的依赖,允许用概念图、风格参考甚至文本描述(通过文生图模型先生成指导图)来直接引导三维形态的生成。虽然目前的示例流程还有许多简化之处,但它清晰地勾勒出了从想法到三维模型的一条自动化辅助路径。接下来的工作,就是沿着这条路径,不断优化每个环节的精度、效率和艺术可控性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/20 10:49:11

FastAPI项目工程化实战:从玩具到工具的部署与架构指南

最近在帮一个朋友看他的个人项目&#xff0c;一个用 FastAPI 搭的 Web 服务。他兴致勃勃地告诉我&#xff0c;项目已经“最新版本”了&#xff0c;功能都跑通了。我让他把代码发过来&#xff0c;打开一看&#xff0c;确实&#xff0c;main.py里路由定义得挺全&#xff0c;requi…

作者头像 李华
网站建设 2026/8/20 10:48:30

利用Windows EXPAND命令实现Excel报表自动化处理,3秒完成日报

还在为每天重复的Excel报表加班到深夜&#xff1f;还在为手动复制粘贴、格式调整、数据核对而焦头烂额&#xff1f;如果你每天的工作中&#xff0c;有超过30%的时间在重复处理结构相似的表格&#xff0c;那么你正在浪费的不仅是时间&#xff0c;更是你的职业成长机会。今天要介…

作者头像 李华
网站建设 2026/8/20 10:47:34

HoRain云--NumPy 矩阵库(Matrix)

NumPy 中包含了一个矩阵库 numpy.matlib&#xff0c;该模块中的函数返回的是一个矩阵&#xff0c;而不是 ndarray 对象。 numpy.matlib 专门用于创建和操作 矩阵&#xff08;matrix&#xff09; 对象。虽然 NumPy 的核心支持多维数组&#xff08;ndarray&#xff09;&#xff…

作者头像 李华
网站建设 2026/8/20 10:45:12

一周掌握网络排障:从零构建TCP/IP、VLAN与防火墙实战能力

你是不是也遇到过这样的场景&#xff1a;办公室网络突然断了&#xff0c;所有人都看着你&#xff0c;而你只会重启路由器和交换机&#xff1f;或者面试时被问到“TCP三次握手的具体过程”&#xff0c;你只能模糊地说“就是建立连接”&#xff1f;又或者&#xff0c;你负责的系统…

作者头像 李华
网站建设 2026/8/20 10:43:57

激光雷达原理、工程实践与避坑指南:从自动驾驶到机器人感知

1. 从一则行业新闻说起&#xff1a;沃尔沃的激光雷达投资意味着什么&#xff1f; 前几天看到一则新闻&#xff0c;沃尔沃汽车宣布对一家激光雷达企业进行了战略投资。这消息在汽车圈和科技圈都没激起太大水花&#xff0c;毕竟现在“无人驾驶”、“激光雷达”这些词听得耳朵都快…

作者头像 李华