1bVC4D模型
1bVC4D模型
在C4D中建模难免会碰到使用点对齐这个功能,横板与竖板顶上,用吸附来回切换视图太麻烦,所以写了这个脚本,可以实现像SketchUp那样快速地对齐点和面。
1bVC4D模型
1bVC4D模型
1bVC4D模型
1bVC4D模型
使用方法 1bVC4D模型
-1.选中C掉的对象面或者点。
1bVC4D模型
1bVC4D模型
1bVC4D模型
-2.选择要对齐的轴-x或者其他轴即可对齐。需要注意的一点是这里的轴方向是指世界轴的方向,不是选集轴的方向。点选集会自动按选中轴的方向贴合。
1bVC4D模型
1bVC4D模型
1bVC4D模型
另外一个例子,选集点只有一半对齐到了面:
1bVC4D模型
1bVC4D模型
1bVC4D模型
1bVC4D模型
1bVC4D模型
当选择的轴方向上没有面可以对齐,点选集会对齐到物体自身的边界框。如下图所示:
1bVC4D模型
1bVC4D模型
1bVC4D模型
1bVC4D模型
1bVC4D模型
-3.如果Fixed to window没有勾选,则窗口在执行完命令会自动关闭。
1bVC4D模型
1bVC4D模型
脚本实现方法 1bVC4D模型
在选中的点对象上,发射一条指定方向的射线。这条射线如果与自己的面相交,那么把交点的坐标记录下来,以此作为目标位置移动到这里。
1bVC4D模型
1bVC4D模型
1bVC4D模型
好在C4D中已经有这个类和相关的方法了,可以直接拿来用。
1bVC4D模型
ge = c4d.utils.GeRayCollider()
1bVC4D模型
ge.Init(op, force=False)
1bVC4D模型
_ = ge.Intersect(pos + vector * 0.001, vector, d, only_test=False)
1bVC4D模型
z = ge.GetNearestIntersection()
1bVC4D模型
1bVC4D模型
我这里pos + vector * 0.001是在pos位置的vector方向上做了0.1%的偏移,因为测试时发现产生的射线会跟自己的发射点有碰撞(无语)。
1bVC4D模型
z会返回一些碰撞的信息,可以参考C4D的文档:
1bVC4D模型
1bVC4D模型
intersection["face_id"] # The polygon index, int
1bVC4D模型
1bVC4D模型
intersection["tri_face_id"] # If first half of quad or triangle face_id + 1, else -(face_id + 1), int
1bVC4D模型
1bVC4D模型
intersection["hitpos"] # Position of the intersection, c4d.Vector
1bVC4D模型
1bVC4D模型
intersection["distance"] # Distance to the intersection, float
1bVC4D模型
1bVC4D模型
intersection["s_normal"] # Same as f_normal (reserved for phong normal at the intersection (Not normalized)), c4d.Vector
1bVC4D模型
1bVC4D模型
intersection["f_normal"] # Face normal (Not normalized), c4d.Vector
1bVC4D模型
1bVC4D模型
intersection["barrycoords"] # Barycentric coordinates of the intersection (x = u, y = v, z = d), c4d.Vector
1bVC4D模型
1bVC4D模型
intersection["backface"] # True if the intersected face's normal points away from the camera, otherwise False, bool
1bVC4D模型
1bVC4D模型
如果射线没有碰撞到任何面会返回None,我这里还通过intersection["backface"]排除掉了点选集对自己的碰撞结果。在多个点发射射线的情况下找到一个最小距离,然后将最小距离分别设置给选集中的点向量即可。
1bVC4D模型
除此之外,如果所有点选集发射的射线的返回结果都为None,那么将对齐到选中对象自己的BBox边界值,可以实现与自身外轮廓对齐的效果。
1bVC4D模型
1bVC4D模型
class Align(c4d.gui.GeDialog):
1bVC4D模型
def __init__(self):
1bVC4D模型
pass
1bVC4D模型
#创建发射器,并获得碰撞点信息设置给目标的
1bVC4D模型
def shot(self,op, vector, d=99999):
1bVC4D模型
if op.GetRealType() == 5100:
1bVC4D模型
c4d.CallCommand(12139)
1bVC4D模型
ge = c4d.utils.GeRayCollider()
1bVC4D模型
ge.Init(op, force=False)
1bVC4D模型
points = op.GetPointS()
1bVC4D模型
sel = points.GetAll(op.GetPointCount())
1bVC4D模型
dis = []
1bVC4D模型
selections = []
1bVC4D模型
pos_list = []
1bVC4D模型
for index, selected in enumerate(sel):
1bVC4D模型
if not selected:
1bVC4D模型
continue
1bVC4D模型
pos = op.GetPoint(index)
1bVC4D模型
pos_list.append(pos)
1bVC4D模型
_ = ge.Intersect(pos + vector * 0.001, vector, d, only_test=False)
1bVC4D模型
z = ge.GetNearestIntersection()
1bVC4D模型
selections.append(index)
1bVC4D模型
if z:
1bVC4D模型
# hitpos = z['hitpos']
1bVC4D模型
if not z['backface']:
1bVC4D模型
distance = z['distance'] + 0.001
1bVC4D模型
dis.append(distance)
1bVC4D模型
try:
1bVC4D模型
if len(dis):
1bVC4D模型
min_dis = min(dis)
1bVC4D模型
else:
1bVC4D模型
level,d = self.get_dis(op,vector,pos_list)
1bVC4D模型
min_dis = abs(level - d)
1bVC4D模型
except ValueError:
1bVC4D模型
min_dis = 0
1bVC4D模型
if min_dis > 0:
1bVC4D模型
doc.StartUndo()
1bVC4D模型
for i in selections:
1bVC4D模型
op.SetPoint(i, op.GetPoint(i) + vector * min_dis)
1bVC4D模型
doc.AddUndo(c4d.UNDOTYPE_CHANGE, op)
1bVC4D模型
doc.EndUndo()
1bVC4D模型
c4d.EventAdd()
1bVC4D模型
return min_dis
1bVC4D模型
else:
1bVC4D模型
c4d.gui.MessageDialog("Please select the point of the c4d.polygonObject!")
1bVC4D模型
return False
1bVC4D模型
1bVC4D模型
#获取最值点
1bVC4D模型
def get_dis(self,op,vector,pos_list):
1bVC4D模型
all_pos = op.GetAllPoints()
1bVC4D模型
if vector[0] > 0:
1bVC4D模型
return max([dec[0] for dec in all_pos]),max([vec[0] for vec in pos_list])
1bVC4D模型
elif vector[0] < 0:
1bVC4D模型
return min([dec[0] for dec in all_pos]),min([vec[0] for vec in pos_list])
1bVC4D模型
elif vector[1] > 0:
1bVC4D模型
return max([dec[1] for dec in all_pos]),max([vec[1] for vec in pos_list])
1bVC4D模型
elif vector[1] < 0:
1bVC4D模型
return min([dec[1] for dec in all_pos]),min([vec[1] for vec in pos_list])
1bVC4D模型
elif vector[2] > 0:
1bVC4D模型
return max([dec[2] for dec in all_pos]),max([vec[2] for vec in pos_list])
1bVC4D模型
elif vector[2] < 0:
1bVC4D模型
return min([dec[2] for dec in all_pos]),min([vec[2] for vec in pos_list])
1bVC4D模型
1bVC4D模型
【脚本安装】 1bVC4D模型
1.打开 C4D,shift+F11 打开【脚本管理器】,点击“文件”→“导入脚本”,选择文件夹中 的 Alignment _V1.0.py 文件。
1bVC4D模型
2.导入 .py 文件之后, shift+F12 打 开 【 命 令 管 理 器 】, 在 搜 索 框 中 输 入 Alignment
1bVC4D模型
3.将词条拖入 C4D 的窗口合适的位置,并保存窗口布局方便使用。 4.也可以设置快捷键。
1bVC4D模型
1bVC4D模型
【使用步骤】 1bVC4D模型
1.点击脚本图标(如未安装请参考上面的脚本安装方法添加到窗口中。)
1bVC4D模型
2.选择要对齐的点。
1bVC4D模型
3.选择对齐轴(世界轴)即可。
1bVC4D模型
1bVC4D模型
【版本信息】C4D R19及以上。
1bVC4D模型
【作者信息】西技大神
C4D脚本:C4D点对齐脚本Alignment V1.0(点对齐,C4D对齐,Alignment,C4D脚本),版本为Alignment V1.0,分类属于捕捉/对齐,软件语言为中文,支持PC(Windows) , MAC(Mac OS)系统平台,安装好的脚本会出现在CINEMA 4D软件的脚本菜单下拉位置,附件大小约319.43 KB,下载方式为本地下载。更多不错捕捉/对齐下载,尽在C4D模型-C4D.COM。
[使用声明]:《C4D点对齐脚本Alignment V1.0》插件仅供个人或学生测试试用,商业用途请前往插件官网购买正版。该插件严禁商用、传播或转载,请在下载后24小时内予以删除。捕捉/对齐脚本来源于网络,如果侵犯了你的权利,请提供作品书面证明,请联系网站客服:2427120@qq.com删除下架处理。