maya 检查uv面的重叠

maya 检查uv面的重叠

最近准备写一个maya的场景检查工具,觉得这个检查uv面的重叠挺有意思的,所以写个小分享。

<center>判断两条边是否相互跨越

  这个检查UV面的重叠问题其实就是一道向量问题或者线性方程问题,解法有两种:

  • 第一种就是通过向量叉积判断两条边是否有焦点
  • 第二种就是求两条线段的直线方程进行求焦点进而判断是否相交

因为第二种情况求斜率的时候会有精度损失,所以我们就使用第一种方法,这样我们就可以避免除法造成的精度损失。

使用向量的叉积判断两条边是否跨越


a的坐标是x1,y1


b的坐标是x2,y2

a×b = |a||b| sin <a,b>

a×b = \left[\begin{matrix}
   x1 & y1  \\
   x2 & y2  \\
  \end{matrix}
  \right] = x1y2 - x2y1



<a,b>表示向量a与向量b之间的夹角

根据上面的公式由正弦可知:

  • 当叉积x1y2 - x2y1等于零的时候两个向量的夹角为0或者180

  • 当叉积x1y2 - x2y1小于零的时候两个向量的夹角大于180

  • 当叉积x1y2 - x2y1大于零的时候两个向量的夹角小于180

在我们需要判断两个向量是否相互跨越的时候,我们需要判断向量a的两个端点在向量b的两侧,同时向量b的两个端点也在向量a的两侧。

判断\overrightarrow {AB}与\overrightarrow {CD}是否相互跨越,就要判断AB两点是否在\overrightarrow {CD}两侧


这个时候我们就可以使用叉积进行判断了

\overrightarrow {CA} X \overrightarrow {CD}与
\overrightarrow {CB} X \overrightarrow {CD}异号的话就说明两点在向量\overrightarrow {CD}的两侧

转换成坐标的公式就是

(x1 * y2 - x2 * y1) * (x1 * y3 - x3 * y1) < 0.0

def judge_edge(edges_point, edges_point_ju):
    """
    judge edge intersect
    :param list edges_point: edges point uv value
    :param list edges_point_ju: edges point uv value
    :return: bool
    """

    x1 = edges_point[0][0] - edges_point[1][0]
    y1 = edges_point[0][1] - edges_point[1][1]

    x2 = edges_point_ju[0][0] - edges_point[1][0]
    y2 = edges_point_ju[0][1] - edges_point[1][1]

    x3 = edges_point_ju[1][0] - edges_point[1][0]
    y3 = edges_point_ju[1][1] - edges_point[1][1]

    x4 = edges_point_ju[0][0] - edges_point_ju[1][0]
    y4 = edges_point_ju[0][1] - edges_point_ju[1][1]

    x5 = edges_point[0][0] - edges_point_ju[1][0]
    y5 = edges_point[0][1] - edges_point_ju[1][1]

    x6 = edges_point[1][0] - edges_point_ju[1][0]
    y6 = edges_point[1][1] - edges_point_ju[1][1]

    if (x1 * y2 - x2 * y1) * (x1 * y3 - x3 * y1) < 0.0 and (x4 * y5 - x5 * y4) * (x4 * y6 - x6 * y4) < 0.0:
        return True
    else:
        return False

判断不可能相交的面

  在进行判断两条边是否相互跨越之前,可以先进行判断这两个面是否肯定不会相交,在二维坐标系内,如果一个多边形的X 或者 Y轴的最小值比另一个多边形的X 或者 Y轴的最大值要大的话,那他们根本不可能相交

def judge_face_position(edges_point, edges_point_ju):
    """
    Determine if two faces may intersect
    :param tuple edges_point: edges point uv value
    :param tuple edges_point_ju: edges point uv value
    :return:
    """

    if edges_point[0] >= edges_point_ju[1] or \
            edges_point_ju[0] >= edges_point[1] or \
            edges_point[2] >= edges_point_ju[3] or \
            edges_point_ju[2] >= edges_point[3]:
        return True
    elif (edges_point[0] == edges_point_ju[0] and edges_point[1] == edges_point_ju[1]) and \
            (edges_point[2] == edges_point_ju[2] and edges_point[3] == edges_point_ju[3]):

        return True
    else:
        return False

判断不可能相交的边

  在进行判断两条边是否相互跨越之前,可以先进行判断这两个边是否肯定不会相交,在二维坐标系内,如果一个边的X 或者 Y轴的最小值比另一个边的X 或者 Y轴的最大值要大的话,那他们根本不可能相交

# 欢迎关注微信供公众号CGPipeline获取更多干货
def judge_edge_position(edges_point, edges_point_ju):
    """
    Determine if two edges may intersect
    :param edges_point:
    :param edges_point_ju:
    :return:
    """
    # judge u
    if min(edges_point[0][0], edges_point[1][0]) > max(edges_point_ju[0][0], edges_point_ju[1][0]) or \
            min(edges_point_ju[0][0], edges_point_ju[1][0]) > max(edges_point[0][0], edges_point[1][0]):
        return True
    # judge v
    elif min(edges_point[0][1], edges_point[1][1]) > max(edges_point_ju[0][1], edges_point_ju[1][1]) or\
            min(edges_point_ju[0][1], edges_point_ju[1][1]) > max(edges_point[0][1], edges_point[1][1]):
        return True
    else:
        return False

原文链接
源代码我放在了我的GitHub上面,如果你有更好的想法或者对代码的优化,欢迎交流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351