normalize a vector with python (Maya)

2079 ワード

mayaにはnormalizeコマンドがあり、python版のnormalizeコマンドがなく、normalizeのサイズが3の浮動小数点配列に使用され、python自体もVectorの組み込み関数を処理していないので、自分で実現するしかありません.
mayaではnormalizeを実現する方法がある.
melバージョンのnormalizeコマンドを比較するために、melバージョンのサンプルを先に示します.
mayaにlocator(他の行)を作成し、勝手に移動して次のコードを実行します.
float $locPos[] = `getAttr locator1.translate`;
// Result: -6.743036 3.618447 2.797823 // 
normalize($locPos);
print $locPos;

// Result: 
-0.827572
0.444091
0.343376

純python実現normalize
def normalize(v=[]):
    if len(v) == 3:
        length = lambda v: (v[0]*v[0] + v[1]*v[1] + v[2]*v[2]) ** 0.5
        return ( v[0] / length(v), v[1] / length(v), v[2] / length(v) )
    else:
        return 0

mayaでの使用
import maya.cmds as mc
locPos = mc.getAttr("locator1.translate")[0]
print(locPos)
# (-6.7430359036937162, 3.6184465390115115, 2.7978227410646745)
normalize(locPos)
# Result: (-0.82757196706231873, 0.44409149866149278, 0.34337644087676383) # 

pymelを使用すると、pymelにはVectorタイプがありますが、実はAPIを継承するMVectorです
import pymel.core as pc
loc = pc.PyNode("locator1")
locpos = loc.translate.get()
print(locpos)
# [-6.74303590369, 3.61844653901, 2.79782274106]
type(locpos)
# Result: <class 'pymel.core.datatypes.Vector'> # 

locpos.normalize()

print(locpos)
# [-0.827571967062, 0.444091498661, 0.343376440877]

python APIの使用
import maya.OpenMaya as om
import maya.cmds as mc

locPos = mc.getAttr("locator1.translate")[0]
print(locPos)
# [-6.74303590369, 3.61844653901, 2.79782274106]
locVet = om.MVector(locPos[0], locPos[1], locPos[2])
locVet.normalize()
norLoc = (locVet.x, locVet.y, locVet.z)
print(norLoc)
# (-0.82757196706231873, 0.44409149866149278, 0.34337644087676383)

あなたに役に立つことを願っています.