Duplicating the Cells

结果展示

准备下载...

过程记录

这一节全部基于 特殊复制 功能,把单个电池复制到如图所示的电池组。视频中的一句话说的很好,即使不进行复杂的细节刻画,简单的复制操作同样能够创造出令人注意的效果。

为了操作更加清晰,可以将需要进行特殊复制的物体进行分组,并在大纲视图中为这些组进行明确的命名。这样做不仅便于在项目中快速定位和管理这些物体,还能使整个场景的结构更加有序。

导出 obj 显示的时候,发现位置有点问题,需要批量对物体进行移动。但目前还不清楚怎么可视化操作,使用的脚本进行操作。

代码清单 1 物体中心移动到坐标原点
  1. import maya.cmds as cmds
  2.  
  3. # 获取当前选中的所有物体
  4. selected_objects = cmds.ls(selection=True, long=True) or []
  5.  
  6. if selected_objects:
  7.     # 计算选中物体的组合边界框
  8.     bbox = cmds.exactWorldBoundingBox(selected_objects)
  9.    
  10.     # 计算边界框中心点
  11.     center_x = (bbox[0] + bbox[3]) / 2.0
  12.     center_y = (bbox[1] + bbox[4]) / 2.0
  13.     center_z = (bbox[2] + bbox[5]) / 2.0
  14.    
  15.     # 计算移动到原点所需的偏移量
  16.     offset_x = 0 - center_x
  17.     offset_y = 0 - center_y
  18.     offset_z = 0 - center_z
  19.    
  20.     # 对每个选中的物体应用偏移量,移动到世界坐标原点
  21.     for obj in selected_objects:
  22.         cmds.move(offset_x, offset_y, offset_z, obj, relative=True, worldSpace=True)
  23. else:
  24.     print("没有选中的物体。")
代码清单 2 按物体中心旋转
  1. import maya.cmds as cmds
  2.  
  3. # 获取当前选中的所有物体
  4. selected_objects = cmds.ls(selection=True, long=True) or []
  5.  
  6. if selected_objects:
  7.     # 计算选中物体的组合边界框
  8.     bbox = cmds.exactWorldBoundingBox(selected_objects)
  9.    
  10.     # 计算边界框中心点
  11.     center_x = (bbox[0] + bbox[3]) / 2.0
  12.     center_y = (bbox[1] + bbox[4]) / 2.0
  13.     center_z = (bbox[2] + bbox[5]) / 2.0
  14.    
  15.     # 在边界框中心创建一个定位器
  16.     locator_name = cmds.spaceLocator(position=(center_x, center_y, center_z))[0]
  17.    
  18.     # 将所有选中的物体临时父级到定位器
  19.     for obj in selected_objects:
  20.         cmds.parent(obj, locator_name, relative=True)
  21.    
  22.     # 指定旋转角度,例如旋转30度绕Y轴
  23.     cmds.rotate(0, '30deg', 0, locator_name)
  24.    
  25.     # 解除父级关系
  26.     for obj in selected_objects:
  27.         cmds.parent(obj, world=True)
  28.    
  29.     # 删除定位器
  30.     cmds.delete(locator_name)
  31. else:
  32.     print("没有选中的物体。")