フェース上にオブジェクトを配置するPythonスクリプト

明けましておめでとうございます。
Rhinoです。

当ブログをご覧頂きましてありがとうございます!
ほぼほぼ自分の勉強用に立ち上げたもので、稚拙な文章でお恥ずかしい限りですが、
今年もできる限り役立ちそうな情報を発信していきたいと思っておりますので、不定期更新ですが
よろしくお願いいたします。

今日は複数選択したフェース上にオフジェクトを配置するPythonスクリプトを年末年始で作りましたので、それをご紹介したいと思います。
選択したフェース上に最後に選択したオブジェクトを複製して配置するスクリプトになります。

# -*- coding: utf-8 -*-
import maya.cmds as cmds

def getCenterOfVertices( vrts ):
	px = 0
	py = 0
	pz = 0
	
	for v in vrts:
		points =  cmds.pointPosition( v, w=True )
		px += points[0]
		py += points[1]
		pz += points[2]

	result = [ px/len(vrts), py/len(vrts), pz/len(vrts) ]
	
	return result

selection = cmds.ls( sl=True, fl=True )

orgObject = selection[-1]

for s in selection:
	if s != orgObject:
		vrts = cmds.ls( cmds.polyListComponentConversion( s, ff=True, tv=True ), fl=True )
		center = getCenterOfVertices( vrts )
		copyedObject = cmds.duplicate( orgObject )[0]
		cmds.setAttr( copyedObject + '.translate', center[0], center[1], center[2], type="double3")
		cmds.select( s, r=True )
		nrlConst = cmds.normalConstraint(  s, copyedObject, aim=[0,0,1], u=[0,1,0] )
		cmds.delete( nrlConst )

フェースの中心を取得する

今回は選択したフェースの中心にオブジェクトを配置したいと思いますので、まずはフェースの中心の座標を取得します。

選択したフェースのそれぞれの頂点の座標をコンポーネントエディターで見てます。

これだけではちょっと分かりづらいでしょうか?
中心点は次のように求めることができます。

中心点の座標 = 各頂点の座標の合計 / 頂点数

getCenterOfVerticesという関数を作成してその中で求めています。
頂点の座標はpointPosition関数で取得できますので、その合計を頂点数で割って中心を求めています。

def getCenterOfVertices( vrts ):
	px = 0
	py = 0
	pz = 0
	
	for v in vrts:
		points =  cmds.pointPosition( v, w=True )
		px += points[0]
		py += points[1]
		pz += points[2]

	result = [ px/len(vrts), py/len(vrts), pz/len(vrts) ]
	
	return result

中心に配置する

フェースの中心の座標を求めることができましたので、最後に選択した配置オブジェクトを複製して、その中心の座標に移動します。
複製にはduplicate関数、移動にはsetAttr関数を使います。

copyedObject = cmds.duplicate( orgObject )[0]
cmds.setAttr( copyedObject + '.translate', center[0], center[1], center[2], type="double3")

コンストレインを使って向きを変える

配置しただけでは向きがおかしいと思いますので、ノーマルコンストレインで向きを変えます。
配置オブジェクトの軸次第では上手くいかないこともあるかとは思いますので、その場合はエイムベクターやアップベクターの数値を変更してみて下さい。
normalConstraint関数を使って向きを変更します。
最後に使用したコンストレインのアトリビュートを削除して終了です。

nrlConst = cmds.normalConstraint(  s, copyedObject, aim=[0,0,1], u=[0,1,0] )
cmds.delete( nrlConst )

ヘッダー画像を作成する際に結構な数のネジを配置する為に考えてみたものです。簡単な内容ですが意外と役に立ちました!
向きに乱数を入れたり、軸の設定ができるようUIを作成するとより使い易いツールになりそうですね。
では、また!

コメント

タイトルとURLをコピーしました