normalize a vector with python (Maya)

  在maya中有个normalize命令用来normalize一个大小为3的浮点数组,而没有python版的normalize命令,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)

希望对你有帮助。

你可能感兴趣的:(python)