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)

希望对你有帮助。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值