2015年6月21日日曜日

Corrective Shapeの考え方

お久しぶりです。
気づけば前回から半年も投稿が開いてました;;



今回は『corrective shape』というものをスクリプトで最近作ったので
自分のメモ的な意味も含めて書いておきます。

ここで言うcorrective shapeとは既にデフォームしているオブジェクトに対して
blend shapeをfront of chainで使用した時に目的の形状になるための
『逆算された形状』という意味です。


















(gif作ってから思いましたが分かりにくいww)


例えば、既にdeformerによってデフォームしているオブジェクトをduplicateし
形状を変化させてblend shapeを入れたいとします。

deformer → blendShape
とすると目標のオブジェクトの形状にはなりますが
これではdeformerの効力がなくなります。

なので
blendShape → deformer
の順にするとblendShapeで変形した後に
deformerが動作しますがdeformer変形後に形状を作っているので
目的の形状にはなりません。

それを
blendShape → deformer
のノードコネクションでも目的の形状になるよう逆算した形状を作るのが
今回のcorrective shapeです。

とまぁ偉そうに書いてますがcorrective shapeの考え方自体は私が考えたものではないです。
まぁ詳しくはcorrective shapeでググってみてくださいw



さて本題。
説明しやすくするために名前を決めます。

original ・・・ deformerが入っているオブジェクトの元々形状
target ・・・ deform後にduplicateして変化させた目的の形状
base ・・・ deformerが入ったあとのオブジェクトの形状

※baseはtargetをduplicateしたときと同じdeform状態です



作成するための考え方

1.baseの頂点の位置を取得
2.baseの頂点のxyz軸をmatrixとして取得
3.targetの頂点の位置を取得
4.3から1の値を減算しローカライズ
5.2のmatrixと4の値の積を求める(座標変換)
6.originalの頂点に5の値をセット
7.完成!

※今回作成したスクリプト自体は全てobject spaceでやりとりをしています



matrixつかうと座標変換がめちゃめちゃ楽ですね。

今回はopenmayaのMMatrixを使ってますが
書き方で
× MMatrix × MPoint
○ MPoint × MMatrix
という使い分けがあるようです。ややこしや。


今回のようなイテレートが必要なものはopenmayaとかapiの
ありがたみをすごく感じますね。



今回はこの辺でー
次回はまた気が向いたときに更新しますw

2015年1月19日月曜日

描いて動かすMaya tool

今回は久しぶりにtoolっぽいものを作ったのでご紹介します。


特に細かい設定とかは必要なく、選択して描いて動かすそれだけのtoolです。
まぁ過去素材も流用しつつ動画も作ってみたのでご覧頂ければと思います。


DOOTY from Takayuki Yanagisawa on Vimeo.

UIはPySideで中身はOpenMayaで書いてます。

割と簡単に実行部はできたので今回はUIをちゃんと作ってみました。
時間的に 中身 : 外身 = 3 : 7 って感じです。
















なんかチョコレートが食べたくなるUIって感じです(別に狙ってない)


ではまたー

2014年12月24日水曜日

PySideを使ってMayaでwebを表示してみる

今回は現在勉強中のPySideネタ書いてみます。
自分なりの言い回しで書いてるので本来の意味と違うかもしれませんがご容赦ください。

PySideはたしか2014からデフォルトで入ってるpythonのライブラリです。
詳しくはググってください(おきまり)


PySideを使ってMayaでwebを表示したい!とふと思ったので挑戦してみました。
qtDesignerという便利ツールもありますが今回は勉強のために一からPySideと向き合ってみます。

と言いつつも特に解説もせず、早速結論です。笑

####################################################################

# まずは必要なライブラリをインポートします。
from PySide import QtCore, QtGui, QtWebKit
from maya import OpenMayaUI, cmds
import shiboken

# QWidgetを継承してブラウザーを作成するクラス
class browserUI(QtGui.QWidget):
# 初期化関数
def __init__(self, parent=None):
# スーパークラス(QWidget)のインスタンスメソッドからparentを使いたいのでsuper関数を使う
super(browserUI, self).__init__(parent)
# showUIメソッドの呼び出し
self.showUI()

def showUI(self):
# レイアウトの作成
vbox = QtGui.QVBoxLayout(self)

# ブラウザの作成
self.browser = QtWebKit.QWebView(self)
# URLの設定
self.browser.load(QtCore.QUrl('http://null0218.blogspot.jp/'))
# レイアウトにアタッチ
vbox.addWidget(self.browser)

#親レイアウトに合わせて伸縮する設定
self.setSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)

# 実行関数
def viewBrowser():
# mayaの裏側に行かないように設定
# mayaのメインウィンドウを取得
mayaMain = OpenMayaUI.MQtUtil.mainWindow()
# 取得したメインウィンドウをPySideのUIとして取得
parent = shiboken.wrapInstance(long(mayaMain), QtGui.QWidget)
# mayaのメインウィンドウの子供としてUIを作成
mainUI = QtGui.QMainWindow(parent)

# 上で書いたのQWidgetの呼び出し
browser = browserUI()
# QWidgetをMenuとしてQMainWindowにアタッチ
mainUI.setMenuWidget(browser)
# QMainWindowの表示
mainUI.show()

# おまじない
if __name__ == '__main__':
viewBrowser()

####################################################################
タブがスペースになってしまった;;
試す方はインデント調整してください;;

今回はざっくりした解説も書いてるので参考にしてもらえればと思います。

↓とまぁこんな感じで意外とすんなりできちゃいました。
こだわったポイントはmayaの裏側に行かないように設定ってとこですかねー



















ただ、どうやら今のPySideの実行環境だとプラグインとかをロードしても
HTML5がダメみたいでyoutubeとかが見れない、うぬぬ。

↓こんな感じでmayaのレイアウトをちょっと改造してyoutube見たかったー






















見れる方法ご存知の方、是非ご教授ください。



それにしても、PySideはいろいろな場所で使えていいですねー
ちょっと環境を整えればmayaだけじゃなくて
独立したアプリケーションとして面白いことができます。

















ノードエディタっぽいのも作れちゃいます。

まだまだ勉強すること多いですがやってみると楽しいので皆さんもぜひー
ではでは。