QQ登录 微博登录 帐号登录 我已阅读并接受《用户协议》
QQ、微博及系统账号均为独立账号,账号信息不互通
欢迎来到C4D素材网
赞助会员下载VIP模型
立即加入
您的VIP会员开通成功!
您的VIP会员开通成功!
今日下载数已用完
赞助会员
感谢您留下宝贵的建议
下载提示!请输入验证码验证哦!
看不清,重新获取
提交验证码
首页 > 插件下载 > 捕捉/对齐 >

C4D点对齐脚本Alignment V1.0

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, int1bVC4D模型
1bVC4D模型
intersection["tri_face_id"]  # If first half of quad or triangle face_id + 1, else -(face_id + 1), int1bVC4D模型
1bVC4D模型
intersection["hitpos"]  # Position of the intersection, c4d.Vector1bVC4D模型
1bVC4D模型
intersection["distance"]  # Distance to the intersection, float1bVC4D模型
1bVC4D模型
intersection["s_normal"]  # Same as f_normal (reserved for phong normal at the intersection (Not normalized)), c4d.Vector1bVC4D模型
1bVC4D模型
intersection["f_normal"]  # Face normal (Not normalized), c4d.Vector1bVC4D模型
1bVC4D模型
intersection["barrycoords"]  # Barycentric coordinates of the intersection (x = u, y = v, z = d), c4d.Vector1bVC4D模型
1bVC4D模型
intersection["backface"]  # True if the intersected face's normal points away from the camera, otherwise False, bool1bVC4D模型
1bVC4D模型
如果射线没有碰撞到任何面会返回None,我这里还通过intersection["backface"]排除掉了点选集对自己的碰撞结果。在多个点发射射线的情况下找到一个最小距离,然后将最小距离分别设置给选集中的点向量即可。1bVC4D模型
除此之外,如果所有点选集发射的射线的返回结果都为None,那么将对齐到选中对象自己的BBox边界值,可以实现与自身外轮廓对齐的效果。1bVC4D模型
1bVC4D模型
class Align(c4d.gui.GeDialog):1bVC4D模型
    def __init__(self):1bVC4D模型
        pass1bVC4D模型
    #创建发射器,并获得碰撞点信息设置给目标的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模型
                    continue1bVC4D模型
                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.0011bVC4D模型
                        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 = 01bVC4D模型
            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_dis1bVC4D模型
        else:1bVC4D模型
            c4d.gui.MessageDialog("Please select the point of the c4d.polygonObject!")1bVC4D模型
            return False1bVC4D模型
            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 打 开 【 命 令 管 理 器 】, 在 搜 索 框 中 输 入 Alignment1bVC4D模型
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。

立即下载
收藏
360
0
5
  • 提供者:
  • 插件评分:
  • 编号:
    7614
  • 权限:
  • 模点:
    0点
  • 属性:
    捕捉/对齐脚本
  • 语言:
    中文
  • 平台:
    PC(Windows) / MAC(Mac OS)
  • 版本:
    Alignment V1.0
  • 位置:
    脚本菜单下拉
  • 大小:
    319.43 KB
  • 下载方式:
    本地下载
  • 更新时间:
    2023-09-28 20:26:16
您可能还喜欢其他相关插件