normalize a vector with python (Maya)
2079 ワード
mayaにはnormalizeコマンドがあり、python版のnormalizeコマンドがなく、normalizeのサイズが3の浮動小数点配列に使用され、python自体もVectorの組み込み関数を処理していないので、自分で実現するしかありません.
mayaではnormalizeを実現する方法がある.
melバージョンのnormalizeコマンドを比較するために、melバージョンのサンプルを先に示します.
mayaにlocator(他の行)を作成し、勝手に移動して次のコードを実行します.
純python実現normalize
mayaでの使用
pymelを使用すると、pymelにはVectorタイプがありますが、実はAPIを継承するMVectorです
python APIの使用
あなたに役に立つことを願っています.
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)
あなたに役に立つことを願っています.