C4D材质快速定位脚本+高版本地面对齐脚本V4.3_支持各大C4D版本

2025-09-22 15:53 发布 | 作品版权归原作者所有,仅供参考学习,禁止商业使用!

插件脚本 /[脚本预设]
461 1 0
C4D材质快速定位脚本+高版本地面对齐脚本V4.3_支持各大C4D版本 - C4D之家 - Snap-To-Floor大-拷贝.jpg 材质定位脚本:你的场景很复杂,材质很多,你在列表的顶部已经看不见它了,这个时候我们选中对象,点击脚本,这个对象的材质就会快速移动到列表最前面,这样我们就不需要去列表慢慢找了地面对齐:因为作者很喜欢使用旧版C4D R25的这个对齐地面插件然后呢我最近用2025这个版本的时候发现它不能用,所以作者做了一个2025版本可用的地面对齐脚本
【版本支持】理论上支持所有C4D版本!!!
地面对齐V4.3更新
支持细分曲面修改器
支持体积网格修改器
添加选中已经对齐的对象时执行插件提示窗
材质定位V2 无更新

该脚本由设计师“米夏小雨”开发并投稿,如您喜欢,欢迎多多支持作者
米夏小雨视频地址:https://space.bilibili.com/27815800
地面对齐v4.3代码:
  1. #对面对齐插件由B站米夏小雨编写



  2. import c4d

  3. # 定义一个小的阈值,用于判断是否已经对齐地面
  4. THRESHOLD = 1e-5

  5. def get_deformed_points(obj):
  6. """获取对象变形后的所有点坐标(考虑曲面细分等变形器)"""
  7. if obj is None:
  8. return None

  9. # 获取对象的变形数据
  10. deformed = obj.GetDeformCache()
  11. if deformed is None:
  12. deformed = obj.GetCache() # 如果没有变形缓存,尝试获取普通缓存
  13. if deformed is None:
  14. deformed = obj # 如果没有缓存,直接使用对象本身

  15. # 获取变形后的点坐标
  16. try:
  17. points = deformed.GetAllPoints()
  18. return points
  19. except AttributeError:
  20. return None

  21. def is_object_aligned_to_ground(obj):
  22. """检查对象是否已经对齐地面"""
  23. points = get_deformed_points(obj)
  24. if points is None or len(points) == 0:
  25. return abs(obj.GetMg().off.y) < THRESHOLD

  26. min_y = float('inf')
  27. for point in points:
  28. world_point = obj.GetMg() * point
  29. if world_point.y < min_y:
  30. min_y = world_point.y

  31. return abs(min_y) < THRESHOLD

  32. def main():
  33. # 获取选中的对象列表
  34. selected_objects = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER)
  35. if not selected_objects:
  36. # 当没有选中对象时弹出提示
  37. c4d.gui.MessageDialog("请选中对象后再使用", c4d.GEMB_OK)
  38. return

  39. all_aligned = True
  40. for obj in selected_objects:
  41. if not is_object_aligned_to_ground(obj):
  42. all_aligned = False
  43. break

  44. if all_aligned:
  45. c4d.gui.MessageDialog("对象已对齐地面", c4d.GEMB_OK)
  46. return

  47. # 记录撤销点
  48. doc.StartUndo()

  49. for obj in selected_objects:
  50. try:
  51. # 尝试获取变形后的点
  52. points = get_deformed_points(obj)

  53. # 如果获取点失败或者点数量为 0,采用原本代码逻辑处理
  54. if points is None or len(points) == 0:
  55. if obj.GetType() == c4d.Ospline:
  56. editable_obj = obj.GetRealSpline()
  57. if hasattr(editable_obj, 'GetAllPoints'):
  58. points = editable_obj.GetAllPoints()
  59. else:
  60. c4d.gui.MessageDialog("无法支持此操作,请尝试将对象转换成多边形对象再进行操作", c4d.GEMB_OK)
  61. continue
  62. elif obj.GetType() == c4d.Opolygon:
  63. # 对于多边形对象,使用 SendModelingCommand 进行转换
  64. res = c4d.utils.SendModelingCommand(c4d.MCOMMAND_CURRENTSTATETOOBJECT, list=[obj],
  65. mode=c4d.MODELINGCOMMANDMODE_ALL, bc=c4d.BaseContainer(),
  66. doc=doc)
  67. if res:
  68. editable_obj = res[0]
  69. if hasattr(editable_obj, 'GetAllPoints'):
  70. points = editable_obj.GetAllPoints()
  71. else:
  72. c4d.gui.MessageDialog("无法支持此操作,请尝试将对象转换成多边形对象再进行操作", c4d.GEMB_OK)
  73. continue
  74. else:
  75. print("Failed to convert object to editable.")
  76. print(f"SendModelingCommand result: {res}")
  77. continue
  78. elif obj.GetType() == 5140: # 处理对象类型 5140
  79. # 直接处理 5140 类型对象的 Y 轴归零
  80. offset = c4d.Vector(0, -obj.GetMg().off.y, 0)
  81. offset_matrix = c4d.Matrix()
  82. offset_matrix.off = offset
  83. # 记录撤销操作
  84. doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
  85. obj.SetMg(offset_matrix * obj.GetMg())
  86. continue
  87. elif obj.GetType() == 5100: # 处理对象类型 5100
  88. # 先判断是否有点
  89. if hasattr(obj, 'GetAllPoints'):
  90. points = obj.GetAllPoints()
  91. else:
  92. c4d.gui.MessageDialog("无法支持此操作,请尝试将对象转换成多边形对象再进行操作", c4d.GEMB_OK)
  93. continue
  94. elif obj.GetType() == 5166: # 处理对象类型 5166
  95. # 直接处理 5166 类型对象的 Y 轴归零
  96. offset = c4d.Vector(0, -obj.GetMg().off.y, 0)
  97. offset_matrix = c4d.Matrix()
  98. offset_matrix.off = offset
  99. # 记录撤销操作
  100. doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
  101. obj.SetMg(offset_matrix * obj.GetMg())
  102. continue
  103. elif isinstance(obj, c4d.BaseObject): # 处理一般对象类型
  104. # 尝试使用 SendModelingCommand 进行转换
  105. res = c4d.utils.SendModelingCommand(c4d.MCOMMAND_CURRENTSTATETOOBJECT, list=[obj],
  106. mode=c4d.MODELINGCOMMANDMODE_ALL, bc=c4d.BaseContainer(),
  107. doc=doc)
  108. if res:
  109. editable_obj = res[0]
  110. if hasattr(editable_obj, 'GetAllPoints'):
  111. points = editable_obj.GetAllPoints()
  112. else:
  113. c4d.gui.MessageDialog("无法支持此操作,请尝试将对象转换成多边形对象再进行操作", c4d.GEMB_OK)
  114. continue
  115. else:
  116. print("Failed to convert c4d.BaseObject to editable.")
  117. continue
  118. else:
  119. continue

  120. # 处理对象点数量为 0 的情况
  121. if 'points' not in locals() or len(points) == 0:
  122. # 直接按全局坐标 Y 归零
  123. offset = c4d.Vector(0, -obj.GetMg().off.y, 0)
  124. offset_matrix = c4d.Matrix()
  125. offset_matrix.off = offset
  126. # 记录撤销操作
  127. doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
  128. obj.SetMg(offset_matrix * obj.GetMg())
  129. continue

  130. # 对于有多个点的对象进行以下处理
  131. if len(points) == 1:
  132. # 只有一个点的情况,直接以世界坐标轴来计算 Y 轴归零
  133. offset = c4d.Vector(0, -obj.GetMg().off.y, 0)
  134. offset_matrix = c4d.Matrix()
  135. offset_matrix.off = offset
  136. # 记录撤销操作
  137. doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
  138. obj.SetMg(offset_matrix * obj.GetMg())
  139. continue
  140. else:
  141. # 选择对齐方式,这里以最小 Y 坐标点为例
  142. # 初始化最小 Y 坐标和最小 Y 坐标点
  143. min_y = float('inf')
  144. min_y_point = None
  145. for point in points:
  146. world_point = obj.GetMg() * point
  147. if world_point.y < min_y:
  148. min_y = world_point.y
  149. min_y_point = world_point

  150. if min_y_point is None:
  151. print("No valid min Y point found.")
  152. continue

  153. # 计算 Y 轴偏移量
  154. offset = c4d.Vector(0, -min_y, 0)

  155. # 计算全局坐标偏移矩阵
  156. offset_matrix = c4d.Matrix()
  157. offset_matrix.off = offset
  158. # 记录撤销操作
  159. doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
  160. # 移动对象
  161. obj.SetMg(offset_matrix * obj.GetMg())
  162. except Exception as e:
  163. print(f"Error occurred: {e}")

  164. # 完成撤销操作记录
  165. doc.EndUndo()

  166. c4d.EventAdd()

  167. if __name__ == "__main__":
  168. main()
复制代码

材质定位V2代码:
  1. #对面对齐插件由B站米夏小雨编写

  2. import c4d
  3. import c4d.gui

  4. def main():
  5. try:
  6. # 获取活动文档
  7. doc = c4d.documents.GetActiveDocument()
  8. # 获取选中的对象
  9. selected_objects = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER)
  10. if not selected_objects:
  11. c4d.gui.MessageDialog("没有选中对象,请选择对象。")
  12. return

  13. # 存储选中对象的材质
  14. materials = []
  15. for obj in selected_objects:
  16. # 获取对象的材质标签
  17. tags = obj.GetTags()
  18. for tag in tags:
  19. if isinstance(tag, c4d.TextureTag):
  20. # 获取纹理标签的材质
  21. mat = tag[c4d.TEXTURETAG_MATERIAL]
  22. if mat:
  23. materials.append(mat)

  24. # 确保材质列表不为空
  25. if not materials:
  26. c4d.gui.MessageDialog("未找到任何材质,请检查。")
  27. return

  28. # 获取第一个材质
  29. first_material = doc.GetFirstMaterial()
  30. if not first_material:
  31. print("材质列表为空。")
  32. return

  33. # 将找到的材质移到第一个材质的最前面
  34. for mat in materials:
  35. # 确保材质不是插入到自己之前
  36. if mat != first_material:
  37. # 将材质插入到第一个材质的前面
  38. mat.InsertBefore(first_material)

  39. # 滚动到第一个材质
  40. c4d.CallCommand(100004768) # 滚动材质列表,使其可见

  41. except Exception as e:
  42. print(f"发生异常: {e}")

  43. if __name__ == "__main__":
  44. main()
复制代码




B Color Smilies

Comment :1

插件脚本
软件性质: 脚本
适用版本: C4D R15 - C4D 2026
软件版本: Version: V4.3
系统平台: Win MAC
软件语言: 中文
插件来源: https://www.c4d.com.cn/c4dsoft.html
百套精美Kitbash3D模型专题合集下载
时尚卡通办公室人物C4D立体图标工程下载Cinema 4D Fashion Cartoon Office Character 3D Icon Project Download
C4D科技新闻片头电视栏目频道包装动画工程下载Cinema 4D Technology News Headline TV Program Channel Packaging Animation Project Download
关闭

C4D精选推荐 /10

知识
问答
快速回复 返回顶部 返回列表