簡體   English   中英

Maya Python:匹配兩個不同對象的邊界框

[英]Maya Python: matching the bounding boxes of two different objects

我有兩個對象,它們總是具有隨機不同的邊界框大小,尤其是高度。 但兩者都將在原點有支點。

我想通過縮放將一個對象的邊界框高度與另一個對象相匹配。 但我只能想到以很小的增量逐漸擴大較小的一個。 這似乎有點乏味和次優。

Python 和 Maya 中是否有更好的方法來匹配兩個邊界框的高度?

您應該能夠獲取較大對象的高度並將其除以較小對象的高度,以獲得用於較小對象的比例因子。

非常非常簡單的例子(偽代碼):

objectA height = 20  
objectB height = 10  
20 / 10 = 2 (so, scale objectB by 2 to match the height)

您的實際代碼是從每個邊界框提取高度,比較高度以確定較小的對象和比例因子,然后縮放較小的對象。 希望有幫助!

這里有兩個函數可以將給定的一組對象縮放到第二組對象的組合邊界框大小。 (也適用於單個對象)

第一個函數將單獨縮放每個給定的對象以匹配第二組對象的邊界框:

def matchScale(to, frm):
'''Scale each of the given objects to the bounding box of a second set of objects.

:Parameters:
    to (str)(obj)(list) = The object(s) to scale.
    frm (str)(obj)(list) = The object(s) to get a bounding box size from.

:Return:
    (list) scale as x,y,z.
'''
xmin, ymin, zmin, xmax, ymax, zmax = pm.exactWorldBoundingBox(frm)
ax, ay, az = aBoundBox = [xmax-xmin, ymax-ymin, zmax-zmin]

for obj in pm.ls(to, flatten=True):

    xmin, ymin, zmin, xmax, ymax, zmax = pm.exactWorldBoundingBox(obj)
    bx, by, bz = bBoundBox = [xmax-xmin, ymax-ymin, zmax-zmin]

    oldx, oldy, oldz = bScaleOld = pm.xform(obj, q=1, scale=1)
    diffx, diffy, diffz = boundDifference = [ax/bx, ay/by, az/bz]
    bScaleNew = [oldx*diffx, oldy*diffy, oldz*diffz]

    pm.xform(obj, scale=bScaleNew)

return bScaleNew

第二個函數稍微改變了行為,因為對象被縮放為一個組:

def matchScale(to, frm):
'''Scale combined objects to the bounding box of a second set of objects.

:Parameters:
    to (str)(obj)(list) = The object(s) to scale.
    frm (str)(obj)(list) = The object(s) to get a bounding box size from.

:Return:
    (list) scale as x,y,z.
'''
xmin, ymin, zmin, xmax, ymax, zmax = pm.exactWorldBoundingBox(frm)
ax, ay, az = aBoundBox = [xmax-xmin, ymax-ymin, zmax-zmin]

xmin, ymin, zmin, xmax, ymax, zmax = pm.exactWorldBoundingBox(to)
bx, by, bz = bBoundBox = [xmax-xmin, ymax-ymin, zmax-zmin]

frm = pm.ls(frm, flatten=True)
oldx, oldy, oldz = bScaleOld = [
    sum([pm.xform(o, q=1, s=1)[0::3][0] for o in frm]), 
    sum([pm.xform(o, q=1, s=1)[1::3][0] for o in frm]),     
    sum([pm.xform(o, q=1, s=1)[2::3][0] for o in frm])
]

diffx, diffy, diffz = boundDifference = [ax/bx, ay/by, az/bz]
bScaleNew = [oldx*diffx, oldy*diffy, oldz*diffz]

[pm.xform(o, scale=bScaleNew) for o in pm.ls(to, flatten=True)]

return bScaleNew

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM