tag:blogger.com,1999:blog-18545267665217351722024-02-19T15:36:48.590+09:00 Takayuki YanagisawaTakayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.comBlogger31125tag:blogger.com,1999:blog-1854526766521735172.post-46688806002446751872016-11-28T18:51:00.002+09:002016-11-28T18:54:11.279+09:00GitHubに登録してみました完全に半年に一回更新ペースになってますね笑 <br />
しかも最近はこんなツール作りましたってネタしか投稿してないw<br />
<br />
まぁ今回は久しぶりに技術ネタをやろうかなと。<br />
<br />
<br />
今までGitHubで色んな方々のコードは拝見してきたのですが<br />
自分ではあまりコードを公開してこなかったというか<br />
複数で開発していくような環境にいたことがなかったというのが<br />
自分の中の大きな要因でGitHubにのメリットを感じてなく<br />
やっていなかった原因だったのですが、<br />
少し時間もあったので登録して投稿してみました<br />
<br />
ただ、まだあまり使い方を理解してないので間違っていたら<br />
ご指摘頂けるとありがたいです!<br />
<br />
<br />
<br />
で、今回のネタ自体ですが<br />
以前メモ程度に公開していた<a href="http://null0218.blogspot.jp/2015/06/corrective-shape.html">correctiveShapeの記事</a>を書いていた<br />
当時のスクリプトを少し体裁を整えて公開してみようかなと。 <br />
<br />
correctiveShapeは先日の<span id="u28451">cgwcc2016の</span>ザ・リギング・マニアックス 2016セッション内でも<br />
・Shapes(Mayaの3rdPartyプラグイン)を使ってリガーがフェイシャルターゲットを作る方法<br />
・RBF補完を使ってクロスシミュレーションをブレンドシェイプターゲットに効率よく置き換える方法<br />
(引用)<br />
等で使われる技術?のひとつです。<br />
<br />
ポーズベースで形状を作成し、デフォーム前からの逆算された形状を作成することで<br />
front of chainのblendShape等を使うことでデフォーム後の形状変化を加えることができます。<br />
(↑なに言ってるかわからんww) <br />
以前公開していた<a href="http://null0218.blogspot.jp/2015/09/tysswe.html">TYSSWE</a>でも使ってます<br />
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="https://player.vimeo.com/video/139234273" webkitallowfullscreen="" width="500"></iframe> <br />
<a href="https://vimeo.com/139234273">TYSSWE</a> from <a href="https://vimeo.com/user17030417">Takayuki Yanagisawa</a> on <a href="https://vimeo.com/">Vimeo</a>.<br />
<br />
<br />
<br />
で、GitHubはココ→<a href="https://github.com/TakayukiYanagisawa0218/correctiveShape">correctiveShape</a><br />
考え方はChad Vernon氏のcvShapeInverterというplug-inを参考にさせて頂いてます。<br />
<a href="http://www.chadvernon.com/blog/resources/cvshapeinverter/">http://www.chadvernon.com/blog/resources/cvshapeinverter/</a><br />
<br />
何かスクリプト内で間違ってるとかもっとこっちが書き方良いとかあったら<br />
教えて頂けると嬉しいですー Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-20763248764157254952016-03-06T20:59:00.003+09:002016-03-06T20:59:55.466+09:00Rivet Brushたまにはrigネタ以外のツール作ってみました。 <br />
<br />
シュッとやってガッとやってバッでrivet配置できます。<br />
良かったら見てやってください。 <br />
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="https://player.vimeo.com/video/157905462" webkitallowfullscreen="" width="500"></iframe><br />
<a href="https://vimeo.com/157905462">Rivet Brush</a> from <a href="https://vimeo.com/user17030417">Takayuki Yanagisawa</a> on <a href="https://vimeo.com/">Vimeo</a>.<br />
<br />
たまにはツールとか公開してみようとも思いましたが<br />
そんな勇気もないので、需要あるかわかりませんが<br />
欲しい方いればひとまずご連絡くださいー<br />
Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-47830720532249949652015-09-15T01:41:00.000+09:002015-09-15T01:41:05.281+09:00TYSSWE新しいtool作りました。<br />
<br />
だいぶ前から中身は出来ていたんですが<br />
ちょっとした機能面とかUIとか動画とかをダラダラと作ってたら<br />
かなり経ってしまってました。<br />
<br />
ちょっとキャプチャーはやっつけ感が出ちゃってますかね笑<br />
<br />
<br />
一応、今回のはrig組む人向け?ですかね?<br />
何ができるのか動画で伝えきれてないかもしれませんが...<br />
<br />
plug-inとかは使ってないので気持ち的にも試しやすいと思います。<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="https://player.vimeo.com/video/139234273" webkitallowfullscreen="" width="500"></iframe> <br />
<a href="https://vimeo.com/139234273">TYSSWE</a> from <a href="https://vimeo.com/user17030417">Takayuki Yanagisawa</a> on <a href="https://vimeo.com/">Vimeo</a>.<br />
<br />
<br />
ではではーTakayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com2tag:blogger.com,1999:blog-1854526766521735172.post-91929684970926537162015-06-21T20:45:00.000+09:002015-06-21T20:53:00.616+09:00Corrective Shapeの考え方お久しぶりです。<br />
気づけば前回から半年も投稿が開いてました;;<br />
<br />
<br />
<br />
今回は『corrective shape』というものをスクリプトで最近作ったので<br />
自分のメモ的な意味も含めて書いておきます。<br />
<br />
ここで言うcorrective shapeとは既にデフォームしているオブジェクトに対して<br />
blend shapeをfront of chainで使用した時に目的の形状になるための<br />
『逆算された形状』という意味です。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5KcUV41ORp_D4k2kDJzj9e2JNAgo6w-VGgAG5wkEBaIeETela1yH8xeLm3FDCNj9FUBU1LFdFnddLx3aJFLt2I34nuaP5K4ThIfI8LWmLURctSHmBmHbWl9FAUUylBvI8_Of3rGfgGySm/s1600/correctiveShape.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5KcUV41ORp_D4k2kDJzj9e2JNAgo6w-VGgAG5wkEBaIeETela1yH8xeLm3FDCNj9FUBU1LFdFnddLx3aJFLt2I34nuaP5K4ThIfI8LWmLURctSHmBmHbWl9FAUUylBvI8_Of3rGfgGySm/s320/correctiveShape.gif" width="320" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(gif作ってから思いましたが分かりにくいww)<br />
<br />
<br />
例えば、既にdeformerによってデフォームしているオブジェクトをduplicateし<br />
形状を変化させてblend shapeを入れたいとします。<br />
<br />
deformer → blendShape<br />
とすると目標のオブジェクトの形状にはなりますが<br />
これではdeformerの効力がなくなります。<br />
<br />
なので<br />
blendShape → deformer<br />
の順にするとblendShapeで変形した後に<br />
deformerが動作しますがdeformer変形後に形状を作っているので<br />
目的の形状にはなりません。<br />
<div>
<br /></div>
<div>
それを</div>
blendShape → deformer<br />
のノードコネクションでも目的の形状になるよう逆算した形状を作るのが<br />
今回のcorrective shapeです。<br />
<br />
とまぁ偉そうに書いてますがcorrective shapeの考え方自体は私が考えたものではないです。<br />
まぁ詳しくはcorrective shapeでググってみてくださいw<br />
<br />
<br />
<br />
さて本題。<br />
説明しやすくするために名前を決めます。<br />
<br />
original ・・・ deformerが入っているオブジェクトの元々形状<br />
target ・・・ deform後にduplicateして変化させた目的の形状<br />
base ・・・ deformerが入ったあとのオブジェクトの形状<br />
<br />
※baseはtargetをduplicateしたときと同じdeform状態です<br />
<br />
<br />
<br />
作成するための考え方<br />
<br />
1.baseの頂点の位置を取得<br />
2.baseの頂点のxyz軸をmatrixとして取得<br />
3.targetの頂点の位置を取得<br />
4.3から1の値を減算しローカライズ<br />
5.2のmatrixと4の値の積を求める(座標変換)<br />
6.originalの頂点に5の値をセット<br />
7.完成!<br />
<br />
※今回作成したスクリプト自体は全てobject spaceでやりとりをしています<br />
<br />
<br />
<br />
matrixつかうと座標変換がめちゃめちゃ楽ですね。<br />
<br />
今回はopenmayaのMMatrixを使ってますが<br />
書き方で<br />
× MMatrix × MPoint<br />
○ MPoint × MMatrix<br />
という使い分けがあるようです。ややこしや。<br />
<br />
<br />
今回のようなイテレートが必要なものはopenmayaとかapiの<br />
ありがたみをすごく感じますね。<br />
<br />
<br />
<br />
今回はこの辺でー<br />
次回はまた気が向いたときに更新しますwTakayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-532508678199738782015-01-19T01:21:00.000+09:002015-01-19T01:21:48.173+09:00描いて動かすMaya tool<div>
今回は久しぶりにtoolっぽいものを作ったのでご紹介します。<br />
<br />
<br />
特に細かい設定とかは必要なく、選択して描いて動かすそれだけのtoolです。<br />
まぁ過去素材も流用しつつ動画も作ってみたのでご覧頂ければと思います。</div>
<div>
<br /></div>
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="//player.vimeo.com/video/117097605" webkitallowfullscreen="" width="500"></iframe> <br />
<a href="http://vimeo.com/73030319">DOOTY</a> from <a href="http://vimeo.com/user17030417">Takayuki Yanagisawa</a> on <a href="https://vimeo.com/">Vimeo</a>.<br />
<div>
<br />
UIはPySideで中身はOpenMayaで書いてます。<br />
<br />
割と簡単に実行部はできたので今回はUIをちゃんと作ってみました。<br />
時間的に 中身 : 外身 = 3 : 7 って感じです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3DCu5GrJUCYX2o41Q6l9EotNwC3jxraxGTXJLnAeDJ0JtI_j69CmPW9Kmqze5N1jMWKdAAi_0HmOAKOs98b-SsrQvOBSMN9uLzZoVW_xIK87veykageadwbcm4ddV_ud4pObyvWnxOQ-M/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3DCu5GrJUCYX2o41Q6l9EotNwC3jxraxGTXJLnAeDJ0JtI_j69CmPW9Kmqze5N1jMWKdAAi_0HmOAKOs98b-SsrQvOBSMN9uLzZoVW_xIK87veykageadwbcm4ddV_ud4pObyvWnxOQ-M/s1600/%E7%84%A1%E9%A1%8C.png" height="224" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
なんかチョコレートが食べたくなるUIって感じです(別に狙ってない)<br />
<br />
<br />
ではまたー</div>
Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-49689800115204100052014-12-24T01:37:00.001+09:002014-12-24T01:40:04.344+09:00PySideを使ってMayaでwebを表示してみる今回は現在勉強中のPySideネタ書いてみます。<br />
自分なりの言い回しで書いてるので本来の意味と違うかもしれませんがご容赦ください。<br />
<br />
PySideはたしか2014からデフォルトで入ってるpythonのライブラリです。<br />
詳しくはググってください(おきまり)<br />
<br />
<br />
PySideを使ってMayaでwebを表示したい!とふと思ったので挑戦してみました。<br />
qtDesignerという便利ツールもありますが今回は勉強のために一からPySideと向き合ってみます。<br />
<br />
と言いつつも特に解説もせず、早速結論です。笑<br />
<br />
####################################################################<br />
<br />
# まずは必要なライブラリをインポートします。<br />
from PySide import QtCore, QtGui, QtWebKit<br />
from maya import OpenMayaUI, cmds<br />
import shiboken<br />
<br />
# QWidgetを継承してブラウザーを作成するクラス<br />
class browserUI(QtGui.QWidget):<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># 初期化関数<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>def __init__(self, parent=None):<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># スーパークラス(QWidget)のインスタンスメソッドからparentを使いたいのでsuper関数を使う<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>super(browserUI, self).__init__(parent)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># showUIメソッドの呼び出し<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>self.showUI()<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>def showUI(self):<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># レイアウトの作成<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>vbox = QtGui.QVBoxLayout(self)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># ブラウザの作成<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>self.browser = QtWebKit.QWebView(self)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># URLの設定<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>self.browser.load(QtCore.QUrl('http://null0218.blogspot.jp/'))<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># レイアウトにアタッチ<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>vbox.addWidget(self.browser)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>#親レイアウトに合わせて伸縮する設定<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>self.setSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)<br />
<br />
# 実行関数<br />
def viewBrowser():<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># mayaの裏側に行かないように設定<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># mayaのメインウィンドウを取得<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mayaMain = OpenMayaUI.MQtUtil.mainWindow()<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># 取得したメインウィンドウをPySideのUIとして取得<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>parent = shiboken.wrapInstance(long(mayaMain), QtGui.QWidget)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># mayaのメインウィンドウの子供としてUIを作成<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mainUI = QtGui.QMainWindow(parent)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># 上で書いたのQWidgetの呼び出し<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>browser = browserUI()<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># QWidgetをMenuとしてQMainWindowにアタッチ<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mainUI.setMenuWidget(browser)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span># QMainWindowの表示<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mainUI.show()<br />
<br />
# おまじない<br />
if __name__ == '__main__':<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>viewBrowser()<br />
<br />
####################################################################<br />
タブがスペースになってしまった;;<br />
試す方はインデント調整してください;;<br />
<br />
今回はざっくりした解説も書いてるので参考にしてもらえればと思います。<br />
<br />
↓とまぁこんな感じで意外とすんなりできちゃいました。<br />
こだわったポイントはmayaの裏側に行かないように設定ってとこですかねー<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaoIuXuDs2Ac6PDJCehY4qfklvykbiW7vqwFgsnTzgdoj0AVkYeVbLC69iWAyASQylhVB7OvwI-wVyH5ctqFwY8AXFQJZF-OuO-j_8AD8rFeRlg8-8X-ecYwk1K5dMqI6TplPjuOsQSGXt/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaoIuXuDs2Ac6PDJCehY4qfklvykbiW7vqwFgsnTzgdoj0AVkYeVbLC69iWAyASQylhVB7OvwI-wVyH5ctqFwY8AXFQJZF-OuO-j_8AD8rFeRlg8-8X-ecYwk1K5dMqI6TplPjuOsQSGXt/s1600/%E7%84%A1%E9%A1%8C.png" height="267" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
ただ、どうやら今のPySideの実行環境だとプラグインとかをロードしても<br />
HTML5がダメみたいでyoutubeとかが見れない、うぬぬ。<br />
<br />
↓こんな感じでmayaのレイアウトをちょっと改造してyoutube見たかったー<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfpWlTe28KJdpUBB16wr-kgrA5O9nBgY2ayPOUj4tLszxJ_G64YoTMnNPVV_W5BU65EkEAReZ-NIJc-3yI4oLtmusVH6gYlGVjv0gFnzf9uJ-UYlI9L0QSbv_c34oKB8sspds5qp6hw2RA/s1600/aaa.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfpWlTe28KJdpUBB16wr-kgrA5O9nBgY2ayPOUj4tLszxJ_G64YoTMnNPVV_W5BU65EkEAReZ-NIJc-3yI4oLtmusVH6gYlGVjv0gFnzf9uJ-UYlI9L0QSbv_c34oKB8sspds5qp6hw2RA/s1600/aaa.png" height="320" width="228" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
見れる方法ご存知の方、是非ご教授ください。<br />
<br />
<br />
<br />
それにしても、PySideはいろいろな場所で使えていいですねー<br />
ちょっと環境を整えればmayaだけじゃなくて<br />
独立したアプリケーションとして面白いことができます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDHSHWDOUrRPZdIcHnddaFgg3cX-p3aMYmZ9wmyWP29jiAv31dMGDQtx6XXo0sKnZUMwiuHdFQW_y1q3QJjnIxxe0bTD-zy57zRhnsXcjFv6cPcmoyzxkYpRJsx4-Wf7A-PAuLqXXuj4/s1600/test.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDHSHWDOUrRPZdIcHnddaFgg3cX-p3aMYmZ9wmyWP29jiAv31dMGDQtx6XXo0sKnZUMwiuHdFQW_y1q3QJjnIxxe0bTD-zy57zRhnsXcjFv6cPcmoyzxkYpRJsx4-Wf7A-PAuLqXXuj4/s1600/test.png" height="228" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
ノードエディタっぽいのも作れちゃいます。<br />
<br />
まだまだ勉強すること多いですがやってみると楽しいので皆さんもぜひー<br />
ではでは。Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-75447139766054370452014-11-03T18:36:00.000+09:002014-11-03T18:36:40.162+09:00UV座標からワールド座標を求める云々を使ったツール<a href="http://null0218.blogspot.jp/2013/07/tygrassessetuptool.html">前回の記事</a>でご紹介してたMELを公開するだけという手抜き記事です。<br />
<br />
使い方は動画を見てください。<br />
最近使ってるわけでもないのでツールの<br />
エラーとかも対応しかねますので自己責任でお試しください。<br />
<br />
仕様としてはnearestPointOnMeshを使って<br />
UV座標 ⇔ ワールド座標 を行き来してjointを配置していくものだったと思います。<br />
※ペイントエフェクトのような規則正しいUVを使わないとうまくいかなかった気がします。<br />
<br />
jointはIKスプラインの仕込み、hairの仕込みなどが選択できたと思います。<br />
<br />
<br />
TYGrassesSetUpTool();<br />
global proc TYGrassesSetUpTool(){<br />
//同じウインドウが存在する場合は削除<br />
if(`window -exists TYGrassesSetUpToolWindow`){<br />
deleteUI TYGrassesSetUpToolWindow;<br />
}<br />
//ウインドウの作成<br />
window -t "草花セットアップツール" -w 250 TYGrassesSetUpToolWindow;<br />
string $windowRootLayout =`columnLayout -adj true`;<br />
string $stepTabs =`tabLayout -imw 5 -imh 5`;<br />
//STEP1<br />
string $step1 =`columnLayout -adj true`;<br />
text -fn "boldLabelFont" -bgc 0.18 0.18 0.18<br />
-l "\n ターゲットメッシュのUV座標を基に\n等間隔でジョイントを配置しします\n";<br />
columnLayout;<br />
text -l "\n ① 配置させるジョイントの数と半径を指定します\n";<br />
intFieldGrp -l "ジョイント " -v1 10 -el "個" jointQuantityField;<br />
floatFieldGrp -l "半径 " -v1 0.01 -pre 3 jointRadiusField;<br />
text -l "\n ② 配置させるUVマップの名前を指定します\n";<br />
rowLayout -nc 2;<br />
text -l " ";<br />
textField -tx "map1" UVmapNameField;<br />
setParent..;<br />
text -l "\n ③ 配置させるUV座標を指定します\n";<br />
floatFieldGrp -l "U座標位置の割合 " -v1 50.0 -el "%" -pre 2<br />
-ann "V座標上に一列で配置するときのU座標位置の割合です" uPerPositionField;<br />
text -l "\n ④ バインドするか指定します\n";<br />
rowLayout -nc 3;<br />
text -l " ";<br />
radioCollection bindSelectField;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -l "バインドする" -sl -w 100 bindSelectTrue;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -l "バインドしない" -w 100 bindSelectFalse;<br />
setParent..;<br />
text -l "\n ⑤ ヘアシステムとカーブを作成するか指定します\n";<br />
rowLayout -nc 3;<br />
text -l " ";<br />
radioCollection makeRigSelectField;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -l "作成する" -sl -w 100<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> -onc "text -e -en true nucleusText;\<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -e -en true makeNsysSelectTrue;\<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -e -en true makeNsysSelectFalse;"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> makeRigSelectTrue;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -l "作成しない" -w 100<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> -onc "text -e -en false nucleusText;\<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -e -en false makeNsysSelectTrue;\<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -e -en false makeNsysSelectFalse;"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> makeRigSelectFalse;<br />
setParent..;<br />
text -l "\n ヘアシステムにnucleusを接続するか指定します\n" nucleusText;<br />
rowLayout -nc 3;<br />
text -l " ";<br />
radioCollection makeNsysSelectField;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -l "接続する" -sl -w 100 makeNsysSelectTrue;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -l "接続しない" -w 100 makeNsysSelectFalse;<br />
setParent..;<br />
text -l "\n ⑥ meshノードを選択し、作成を実行します\n";<br />
setParent..;<br />
button -l "作成" -c "TYGrassesSetUp(\<br />
`intFieldGrp -q -v1 jointQuantityField`\<br />
,`floatFieldGrp -q -v1 jointRadiusField`\<br />
,`textField -q -tx UVmapNameField`\<br />
,`floatFieldGrp -q -v1 uPerPositionField`\<br />
,`radioCollection -q -sl bindSelectField`\<br />
,`radioCollection -q -sl makeRigSelectField`\<br />
,`radioCollection -q -sl makeNsysSelectField`)";<br />
setParent..;<br />
//STEP2<br />
string $step2 =`columnLayout -adj true`;<br />
text -fn "boldLabelFont" -bgc 0.18 0.18 0.18<br />
-l "\n バインドされたソースメッシュを基に\nジョイントを配置しバインドやnHair等を実行します\n";<br />
columnLayout;<br />
text -l "\n ① 配置させるジョイントの半径を指定します\n";<br />
floatFieldGrp -l "半径 " -v1 0.01 -pre 3 jointCopyRadiusField;<br />
text -l "\n ② 配置させるUVマップの名前を指定します\n";<br />
rowLayout -nc 2;<br />
text -l " ";<br />
textField -tx "map1" UVmapCopyNameField;<br />
setParent..;<br />
text -l "\n ③ バインドするか指定します\n";<br />
rowLayout -nc 3;<br />
text -l " ";<br />
radioCollection bindCopySelectField;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -l "バインドする" -sl -w 100 bindCopySelectTrue;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -l "バインドしない" -w 100 bindCopySelectFalse;<br />
setParent..;<br />
text -l "\n ③ ヘアシステムを継承し作成するか指定します\n";<br />
rowLayout -nc 3;<br />
text -l " ";<br />
radioCollection succeedNsysSelectField;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -l "継承し作成する" -sl -w 100<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> -onc "textField -e -en true hairSystemShapeNameField;\<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> text -e -en true succeedHairSysText;"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> succeedNsysSelectTrue;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> radioButton -l "作成しない" -w 100<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> -onc "textField -e -en false hairSystemShapeNameField;\<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> text -e -en false succeedHairSysText;"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> succeedNsysSelectFalse;<br />
setParent..;<br />
text -l "\n 継承するhairSystemShapeの名前を指定します\n" succeedHairSysText;<br />
rowLayout -nc 2;<br />
text -l " ";<br />
textField -tx "hairSystemShape1" hairSystemShapeNameField;<br />
setParent..;<br />
setParent..;<br />
button -l "実行" -c "TYGrassesSetUpCopy(\<br />
`floatFieldGrp -q -v1 jointCopyRadiusField`\<br />
,`textField -q -tx UVmapCopyNameField`\<br />
,`radioCollection -q -sl bindCopySelectField`\<br />
,`radioCollection -q -sl succeedNsysSelectField`\<br />
,`textField -q -tx hairSystemShapeNameField`)";<br />
setParent..;<br />
//タブレイアウトにペアレント<br />
tabLayout -e -tl $step1 "STEP1" -tl $step2 "STEP2" $stepTabs;<br />
setParent..;<br />
button -l "閉じる" -c "deleteUI TYGrassesSetUpToolWindow";<br />
setParent..;<br />
showWindow;<br />
}<br />
<br />
global proc TYGrassesSetUp(int $jointQuantity, float $jointRadius, string $UVmapName,<br />
float $uPerPosition, string $bindSelect, string $makeRigSelect, string $makeNsysSelect){<br />
pickWalk -d down;<br />
//選択されたオブジェクトのチェック<br />
string $targetMesh[] = `ls -sl -typ mesh`;<br />
if(`objExists $targetMesh[0]`){<br />
if(`objExists $targetMesh[1]`){<br />
error "複数選択されています。一度に作成できるベースセットアップは一つのみです。";<br />
}<br />
else;<br />
}<br />
else error "メッシュが選択されていません。";<br />
//uvSetの名前のチェック<br />
int $flag = 0;<br />
if(catch(size(`getAttr -s ($targetMesh[0] + ".uvSet[*].uvSetName")`))){<br />
if(`getAttr ($targetMesh[0] + ".uvSet[0].uvSetName")` == $UVmapName){<br />
$flag = 1;<br />
}<br />
else;<br />
}<br />
else{<br />
string $uvSetNameList[] = `getAttr ($targetMesh[0] + ".uvSet[*].uvSetName")`;<br />
int $j;<br />
for($j=0;$j<=(size($uvSetNameList)) && $flag!=1;$j++){<br />
if($uvSetNameList[$j] == $UVmapName){<br />
$flag = 1;<br />
}<br />
else;<br />
}<br />
}<br />
//指定した値のチェック<br />
if($jointQuantity <= 1 || $jointRadius <= 0 || $flag == 0){<br />
error "入力値が不正です。";<br />
}<br />
else;<br />
//transformノードの取得<br />
string $targetTransform[] = `pickWalk -d up`;<br />
//ジョイントの配置<br />
int $i;<br />
string $jointList[];<br />
for($i=1;$i<=$jointQuantity;$i++){<br />
select -cl;<br />
string $jointName = `joint -rad $jointRadius -n "TYGrassBaceJoint"`;<br />
//階層化<br />
$jointList[($i - 1)] = $jointName;<br />
if($i!=1){<br />
parent $jointName $jointList[($i - 2)];<br />
}<br />
//UV座標を基にジョイントを配置<br />
string $constName[] = `pointOnPolyConstraint $targetMesh[0] $jointName`;<br />
int $k,$UVmapNumber,$nFlag = 0;<br />
for($k=0;$nFlag!=1;$k++){<br />
string $selectUVmapName = `getAttr ($targetMesh[0] + ".uvSet[" + $k + "].uvSetName")`;<br />
if($selectUVmapName == $UVmapName){<br />
$UVmapNumber = $k;<br />
$nFlag = 1;<br />
}<br />
else;<br />
}<br />
connectAttr -f ($targetMesh[0] + ".uvSet[" + $UVmapNumber + "].uvSetName")<br />
($constName[0] + ".target[0].targetUVSetName");<br />
float $uvSize[] = `polyEvaluate -b2 -ae -uvs $UVmapName $targetMesh[0]`;<br />
float $uPosition = ($uvSize[1] - $uvSize[0]) * $uPerPosition * 0.01 + $uvSize[0];<br />
float $vPosition = ($uvSize[3] - $uvSize[2]) / ($jointQuantity - 1)<br />
* ($i - 1) + $uvSize[2];<br />
setAttr ($constName[0] + "." + $targetTransform[0] + "U0") $uPosition;<br />
setAttr ($constName[0] + "." + $targetTransform[0] + "V0") $vPosition;<br />
setAttr ($constName[0] + ".offsetRotateX") -90;<br />
setAttr ($constName[0] + ".offsetRotateY") 90;<br />
delete $constName[0];<br />
//回転値をジョイントの方向へ移行させ0にする<br />
float $jointRotateValue[] = `getAttr ($jointName + ".rotate")`;<br />
joint -e -o $jointRotateValue[0] $jointRotateValue[1] $jointRotateValue[2] $jointName;<br />
setAttr ($jointName + ".rotate") 0 0 0;<br />
}<br />
//バインドの実行<br />
if($bindSelect == "bindSelectTrue"){<br />
select $targetMesh[0] $jointList;<br />
SmoothBindSkin;<br />
}<br />
else;<br />
//nHairの作成<br />
if($makeRigSelect == "makeRigSelectTrue"){<br />
//ikHandleの作成<br />
string $ikHandleName[] = `ikHandle -sj $jointList[0]<br />
-ee $jointList[($jointQuantity -1)] -sol ikSplineSolver -scv false`;<br />
select $ikHandleName[2];<br />
//assignHairSystemのプロシージャから引用<br />
string $sel[] = `ls -sl`;<br />
string $hsys = `createNode hairSystem`;<br />
connectAttr time1.outTime (".currentTime");<br />
string $inCurveName[] = `ls -dag -type nurbsCurve $sel`;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>attachCurvesToHairSystem( $hsys, $inCurveName, false );<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>//作成したものを変数に代入<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>select $hsys;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>convertHairSelection( "follicles" );<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pickWalk -d down;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>select `listConnections -s false -t "nurbsCurve"`;<br />
string $outCurveShapeName[] = `pickWalk -d down`;<br />
select $inCurveName[0];<br />
string $inCurveShapeName[] = `pickWalk -d down`;<br />
//ikをhiarカーブに添わせる<br />
disconnectAttr ($inCurveShapeName[0] + ".worldSpace[0]") ($ikHandleName[0] + ".inCurve");<br />
connectAttr ($outCurveShapeName[0] + ".worldSpace[0]") ($ikHandleName[0] + ".inCurve");<br />
//hairのアトリビュート設定<br />
setAttr ($hsys + ".bendResistance") 50;<br />
setAttr ($hsys + ".startCurveAttract") 0.1;<br />
setAttr ($hsys + ".selfCollide") 1;<br />
setAttr ($hsys + ".selfCollideWidthScale") 0.1;<br />
//nucleusの接続<br />
if($makeNsysSelect == "makeNsysSelectTrue"){<br />
string $nucleusName = `createNode nucleus`;<br />
connectAttr time1.outTime (".currentTime");<br />
connectAttr ($hsys + ".currentState") ($nucleusName + ".inputActive[0]");<br />
connectAttr ($hsys + ".startState") ($nucleusName + ".inputActiveStart[0]");<br />
connectAttr ($nucleusName + ".outputObjects[0]") ($hsys + ".nextState");<br />
connectAttr ($nucleusName + ".startFrame") ($hsys + ".startFrame");<br />
setAttr ($hsys + ".active") 1;<br />
}<br />
}<br />
}<br />
<br />
global proc TYGrassesSetUpCopy(float $jointCopyRadius, string $UVmapCopyName<br />
, string $bindCopySelect, string $succeedNsysSelect, string $hairSystemShapeName){<br />
pickWalk -d down;<br />
string $meshList[] = `ls -sl `;<br />
//uvSetの名前のチェック<br />
int $k,$flag = 0;;<br />
for($k=1;$k<size($meshList);$k++){<br />
if(catch(size(`getAttr -s ($meshList[$k] + ".uvSet[*].uvSetName")`))){<br />
if(`getAttr ($meshList[$k] + ".uvSet[0].uvSetName")` == $UVmapCopyName){<br />
$flag = 1;<br />
}<br />
else;<br />
}<br />
else{<br />
string $uvSetNameList[] = `getAttr ($meshList[$k] + ".uvSet[*].uvSetName")`;<br />
int $j;<br />
for($j=0;$j<=(size($uvSetNameList)) && $flag!=1;$j++){<br />
if($uvSetNameList[$j] == $UVmapCopyName){<br />
$flag = 1;<br />
}<br />
else;<br />
}<br />
}<br />
}<br />
if(`objExists $hairSystemShapeName`){<br />
if(`nodeType $hairSystemShapeName` != "hairSystem"){<br />
$flag = 0;<br />
}<br />
else;<br />
}<br />
else{<br />
$flag = 0;<br />
}<br />
//指定した値のチェック<br />
if($flag == 0){<br />
error "入力値が不正です。";<br />
}<br />
else;<br />
//nearestPointOnMeshの作成<br />
loadPlugin -qt "nearestPointOnMesh.mll";<br />
string $nPOM = `createNode "nearestPointOnMesh"`;<br />
string $checker[] = `spaceLocator`;<br />
connectAttr ($checker[0] + ".translate") ($nPOM + ".inPosition");<br />
connectAttr ($meshList[0] + ".worldMesh[0]") ($nPOM + ".inMesh");<br />
//メッシュからジョイントを取得<br />
string $jointList[] =`skinCluster -q -inf $meshList[0]`;<br />
//ソースメッシュにバインドされたジョイントのソースメッシュ上UV位置を取得<br />
float $uPosition[],$vPosition[];<br />
for($jointName in $jointList){<br />
float $jointPosition[] = `xform -q -ws -t $jointName`;<br />
move -rpr $jointPosition[0] $jointPosition[1] $jointPosition[2] $checker[0];<br />
$uPosition[`size($uPosition)`] = `getAttr ($nPOM + ".parameterU")`;<br />
$vPosition[`size($vPosition)`] = `getAttr ($nPOM + ".parameterV")`;<br />
}<br />
delete $nPOM $checker[0];<br />
//ジョイントの配置<br />
int $i;<br />
string $ikHandleList[],$jointCopyList[];<br />
for($i=1;$i<size($meshList);$i++){<br />
float $uvboundingBox[] = `polyEvaluate -b2 -ae -uvs $UVmapCopyName $meshList[$i]`;<br />
string $jointName[] = {};<br />
for($j=0;$j<`size($jointList)`;$j++){<br />
//ソースのバウンディングボックス内にジョイントがあった場合ターゲットも作成(誤差0.0001)<br />
if(($uvboundingBox[3] + 0.0001) > $vPosition[$j]){<br />
select -cl;<br />
$jointName[$j] = `joint -rad $jointCopyRadius -n "TYGrassBaceJoint"`;<br />
string $constName[] = `pointOnPolyConstraint $meshList[$i] $jointName[$j]`;<br />
//指定したuvマップが何番目の配列にあるか確認<br />
int $l,$UVmapNumber,$nFlag = 0;<br />
for($l=0;$nFlag!=1;$l++){<br />
string $selectUVmapName = `getAttr ($meshList[$i] +<br />
".uvSet[" + $l + "].uvSetName")`;<br />
if($selectUVmapName == $UVmapCopyName){<br />
$UVmapNumber = $k;<br />
$nFlag = 1;<br />
}<br />
else;<br />
}<br />
connectAttr -f ($meshList[$i] + ".uvSet[" + $UVmapNumber + "].uvSetName")<br />
($constName[0] + ".target[0].targetUVSetName");<br />
select $meshList[$i];<br />
string $transformMesh[] = `pickWalk -d up`;<br />
setAttr ($constName[0] + "." + $transformMesh[0] + "U0") $uPosition[$j];<br />
setAttr ($constName[0] + "." + $transformMesh[0] + "V0") $vPosition[$j];<br />
setAttr ($constName[0] + ".offsetRotateX") -90;<br />
setAttr ($constName[0] + ".offsetRotateY") 90;<br />
delete $constName[0];<br />
//ソースを参考に階層化<br />
select $jointList[$j];<br />
int $m,$num = 0;<br />
string $sourceParentJoint[] =`pickWalk -d up`;<br />
if($jointList[$j] != $sourceParentJoint[0]){<br />
for($m=0;$m<size($jointList);$m++){<br />
if($jointList[$m] == $sourceParentJoint[0]){<br />
$num = $m;<br />
}<br />
}<br />
parent $jointName[$j] $jointName[$num];<br />
}<br />
}<br />
}<br />
$jointCopyList[size($jointCopyList)] = $jointName[0];<br />
//バインドの実行<br />
if($bindCopySelect == "bindCopySelectTrue"){<br />
select $meshList[$i] $jointName[0];<br />
SmoothBindSkin;<br />
}<br />
else;<br />
//ikHandleの作成<br />
if($succeedNsysSelect == "succeedNsysSelectTrue"){<br />
string $ikHandleName[] = `ikHandle -sj $jointName[0]<br />
-ee $jointName[(size($jointName) - 1)] -sol ikSplineSolver -scv false`;<br />
$ikHandleList[size($ikHandleList)] = $ikHandleName[0];<br />
//assignHairSystemから一部引用<br />
string $curves[] = `ls -dag -type nurbsCurve $ikHandleName[2]`;<br />
attachCurvesToHairSystem( $hairSystemShapeName, $curves, false );<br />
//hairSystemShapeから正しいfollicleshapeを取得<br />
select $hairSystemShapeName;<br />
convertHairSelection( "follicles" );<br />
string $follicleShapeList[] = `pickWalk -d down`;<br />
string $trueFollicleShape;<br />
for($follicleShapeName in $follicleShapeList){<br />
string $plugList[] = `listConnections -d false $follicleShapeName`;<br />
for($plugName in $plugList){<br />
if($plugName == $ikHandleName[2]){<br />
$trueFollicleShape = $follicleShapeName;<br />
}<br />
else;<br />
}<br />
}<br />
//follicleshapeの中から作られたカーブを取得<br />
select $trueFollicleShape;<br />
select `listConnections -s false -t "nurbsCurve"`;<br />
string $outCurveName[] = `pickWalk -d down`;<br />
//curveShapeを取得<br />
select $ikHandleName[2];<br />
string $inCurveName[] = `pickWalk -d down`;<br />
//ikをhiarカーブに添わせる<br />
disconnectAttr ($inCurveName[0] + ".worldSpace[0]") ($ikHandleName[0] + ".inCurve");<br />
connectAttr ($outCurveName[0] + ".worldSpace[0]") ($ikHandleName[0] + ".inCurve");<br />
}<br />
else;<br />
}<br />
group -n "TYGrassesIkHandleGp" $ikHandleList;<br />
group -n "TYGrassesJointGp" $jointCopyList;<br />
select -cl;<br />
}<br />
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
久しぶりにMELのツールを見るとpythonのほうが</div>
<div>
書きやすい感じがしますね。(慣れかな?)</div>
<div>
<br /></div>
<div>
最近はOpenMayaとかPySideと戯れているのでそういうのもあるんでしょうけど。</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
んーbloggerってtextファイルアップロードできないのかなー</div>
Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-31735958032761955842014-10-13T04:02:00.000+09:002014-10-13T04:02:07.695+09:00Google Maps APIさわってみたよ記事を書く度にお久しぶりですとか言ってる気がするw<br />
<br />
<br />
最近pythonとかmelとかをガリガリ書いていたので<br />
一年と三カ月ぶりにHTMLとかCSSとかJava Scriptとか触ってみます。<br />
<br />
といっても過去に作った簡単なプログラムを公開するだけなんですけどね(手抜き)<br />
<br />
<br />
<br />
やりたいことはgoogle map上でクリックしたところにマーカーを立てて<br />
経度、緯度を取得して表示 → csvファイルとして書きだし<br />
<br />
とまぁこんな感じです。<br />
<br />
ちなみにcsvファイルってのはカンマ( , )とかで情報を区切るだけで<br />
エクセル等のソフトでも枠を区切って認識してくれるファイル形式です。<br />
まぁ詳しくはぐぐってください。<br />
<br />
<br />
今回はソースコードの解説などは特にしません。←<br />
(べつに久しぶりに弄ったら結構忘れてて解説する自信がないとかではないですよ;;)<br />
<br />
まぁ結構この手の内容は一文づつググったらかなりの量の解説がヒットしますので<br />
まぁ詳しくはぐぐってください。w<br />
<br />
<br />
///////////////////////////////////////////////////////<br />
<br />
<!DOCTYPE html><br />
<html><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><head><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><style type="text/css"><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>html { height: 100% }<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>body { height: 100%; margin: 0px; padding: 0px }<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>#map { height: 100% }<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span></style><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><script src="http://maps.google.com/maps/api/js?v=3&sensor=false"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>type="text/javascript" charset="UTF-8"><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span></script><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><script type="text/javascript"><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>//<![CDATA[<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>var map;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>var markersArray = [];<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>var flag = 0;<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>function init() {<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>var latlng = new google.maps.LatLng(39, 138);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>var opts = {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>zoom: 6,<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mapTypeId: google.maps.MapTypeId.ROADMAP,<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>center: latlng<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>};<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>map = new google.maps.Map(document.getElementById("map"), opts);<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>google.maps.event.addListener(map, 'click', mylistener);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>function mylistener(event) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(flag == 0){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>document.getElementById("left_up_lat").innerHTML = event.latLng.lat();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>document.getElementById("left_up_lng").innerHTML = event.latLng.lng();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}else {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>document.getElementById("right_under_lat").innerHTML = event.latLng.lat();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>document.getElementById("right_under_lng").innerHTML = event.latLng.lng();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>var latlng=new google.maps.LatLng(event.latLng.lat(), event.latLng.lng());<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>var marker = new google.maps.Marker({position:latlng, map:map});<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>markersArray.push(marker);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>function writeText() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>var fs<span class="Apple-tab-span" style="white-space: pre;"> </span>= new ActiveXObject("Scripting.FileSystemObject");<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>var outf = fs.CreateTextFile("outText.csv", true);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>outf.Write(document.getElementById("file_name").value + "," + document.getElementById("left_up_lat").innerHTML + "," + document.getElementById("left_up_lng").innerHTML + "," + document.getElementById("right_under_lat").innerHTML + "," + document.getElementById("right_under_lng").innerHTML);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>outf.Close();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>function clearOverlays() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (markersArray) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>for (i in markersArray) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>markersArray[i].setMap(null);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>function leftUp() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>flag = 0;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>function rightUnder() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>flag = 1;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>//]]><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span></script><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span></head><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><body onload="init()"><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><div id="map" style="height:560px"></div><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><table border="1" cellspacing="2" width="100%"><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><tr><th>ファイル名</th><th><button onclick="leftUp()" type=button>LEFT UP</button></th><th><button onclick="rightUnder()" type=button>RIGHT UNDER</button></th></tr><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><tr><th rowspan="2"><input type="text" size=30 value="file name" id="file_name"></th><th id="left_up_lat"></th><th id="right_under_lat"><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><tr><th id="left_up_lng"></th><th id="right_under_lng"></th></tr><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span></table><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><form><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="button" value="マーカーを削除" onclick="clearOverlays()" /><button onclick="writeText()" type=button>書きこみ</button><br><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span></form><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span></body><br />
<br />
</html><br />
<br />
<br />
///////////////////////////////////////////////////////<br />
<br />
<br />
とまぁこんな感じなんですが<br />
これを書いてた頃はIEユーザーだったのでActiveXObjectという<br />
IEでファイルを書きだすやつを使ってたんですが<br />
現状IEユーザーが減っちゃったのと、バージョンアップによって<br />
IEでもたぶん使えないと思います←<br />
<br />
かきだすwriteText()の中身だけ書き変えたら動くはずですが<br />
使うタイミングがないので使いたい方は書き変えて使って下さい。<br />
firefoxやchromeなどでも確かそんなやつがあったと思います。<br />
<br />
まぁ一応コピーして.htmlで保存すればそれ以外は動くはずです。たぶん。<br />
<br />
<br />
<br />
<br />
はい、まぁ今回はかなり雑でしたがこんな感じで終わりますw<br />
今後も雑な感じで過去のスクリプトとか投下するかもしれませんが悪しからず。Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-28214222664603238062014-07-09T02:41:00.002+09:002014-07-09T02:41:41.584+09:00mayabatchを使ってちょっと効率upおひさしぶりです。<br />
ブログを書こうと思いつつもどんどん先延ばしになって、かなり期間が開いてしまいました(・へ・)<br />
<br />
4月からいっぱしのクリエーターになっていろいろな意味でこのブログも<br />
書きにくくなってしまいました;;<br />
<br />
<br />
とまぁあまり書いていると睡眠時間がどんどん無くなるので<br />
さっそくですが本題ですよ<br />
<br />
<br />
<br />
社会人になって友達の幅もかなり増えたりして仕事の色々な話を聞く機会がふえました<br />
そんな中で効率を上げたいという話をよく耳にします<br />
<br />
なので今回は同じ修正をカット毎しなければならないめんどくさい作業をもっと効率化しよう!<br />
という内容です。<br />
<br />
ちょっとこのブログではそこまでmel等のスクリプトを取り上げていませんが<br />
今回はmelありきになってしまうかもしれません。ご了承を。<br />
<br />
<br />
<br />
mayabatchというものをご存じでしょうか。<br />
GUIを立ち上げずにmayaの処理を行ってくれるヤツです。<br />
<br />
windowsのコマンドプロンプトからコマンドを打って実行します。<br />
<br />
例)<br />
C:\"Program Files"\Autodesk\Maya2013\bin\mayabatch.exe -file "C:\Users\ty\Desktop\test01.mb" -command "polyCube;file -save;"<br />
pause > nul<br />
<br />
こんな感じです。<br />
今回はキューブを作成し保存するという処理を行っています。<br />
一文ずつ解説します。<br />
<br />
<br />
C:\"Program Files"\Autodesk\Maya2014\bin\mayabatch.exe<br />
まずはmayabatch.exeまでのパスを書きます<br />
<br />
-file "C:\Users\ty\Desktop\test01.mb"<br />
続けてfileフラグでデータまでのフルパスを書きます。<br />
※フルパスでなくてもいけたはずですがまぁフルパスにこしたことはないです<br />
<br />
-command "polyCube;file -save;"<br />
commandフラグでmelコマンドを書いていきます。<br />
長くなる場合はmayaのmelのパスが通っている場所にプロシージャとして登録しておき<br />
それを読んできた方がスマートだと思います。<br />
※ここまでが↑一文です<br />
<br />
pause > nul<br />
これはコマンドプロンプトから実行したときに処理が終わるとすぐ実行画面が消えてしまうので<br />
確認しやすいようポーズしているだけです。まぁなくても問題はありません。<br />
<br />
<br />
<br />
こんな感じで実行すればGUIを立ち上げずに処理を行ってくれるので早いですし<br />
メモ帳等にこの文を保存して拡張子を.batにすればバッチファイルの出来上がりです。<br />
<br />
さらに改行して別データの処理を書けば上から順に実行していってくれます。<br />
<br />
<br />
batだけ作ってしまってPCに処理をさせておいて優雅にランチタイムなんてどうでしょうか<br />
効率的ってすばらしい!!<br />
<br />
<br />
<br />
<br />
まぁ簡単ですが今回はおわりです<br />
またそのうち更新しますねーTakayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-46466252680446386212014-03-11T14:46:00.000+09:002014-03-12T03:32:31.095+09:003.11 追悼<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqJb_Z6op1B37pOzbc-i9ZQS0FsuqpBpSjaoGbNkzDMsKheEobKsoicEbdg8fLRU6nmg4mQEJtX1sn0xy4bde8tZm4utTuRYXeEBA-h3knmCpggWJqrw_jp5B0SkF5pg0ZhOxYDNAoWDlK/s1600/20140311cg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqJb_Z6op1B37pOzbc-i9ZQS0FsuqpBpSjaoGbNkzDMsKheEobKsoicEbdg8fLRU6nmg4mQEJtX1sn0xy4bde8tZm4utTuRYXeEBA-h3knmCpggWJqrw_jp5B0SkF5pg0ZhOxYDNAoWDlK/s1600/20140311cg.png" height="180" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
なかなか更新出来ず申し訳ありません。</div>
また時間を見つけて更新します。<br />
<br />Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-22157609671623707972013-11-16T02:24:00.002+09:002013-11-16T02:24:28.081+09:00ただいま・・・ただいま、卒業制作の日々に追われておりまして<br />
なかなか更新できず、申し訳ないです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl3UV9mbt_RRCplmc8expTvE1PRnqsmYhqZmLFOpWcRoCWko-A73ZPjcYiQh3foS9X1Jqsh-LNiD_j9-_nw7dfb_4lXW9osWADZ4o7qDn8uISljDMWJKBIAFC4-WXQdaw-yh8NFyQbny9c/s1600/sneaker006.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl3UV9mbt_RRCplmc8expTvE1PRnqsmYhqZmLFOpWcRoCWko-A73ZPjcYiQh3foS9X1Jqsh-LNiD_j9-_nw7dfb_4lXW9osWADZ4o7qDn8uISljDMWJKBIAFC4-WXQdaw-yh8NFyQbny9c/s1600/sneaker006.png" height="180" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
また、時間の余裕を見つけ次第更新しますので<br />もうしばらくお待ちをー(ToT)/~~~<br /><br />あ、別に待ってないか。笑Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com3tag:blogger.com,1999:blog-1854526766521735172.post-68445374087882626332013-09-18T02:10:00.000+09:002013-09-18T02:10:11.349+09:00Egg man animationお久しぶりです。<br />
最近、2週間弱くらいで10秒のアニメーションを作りました。<br />
<div>
<br />
まぁ今回はモーションキャプチャーの検証と質感の検証など<br />
実験的にいろいろやってみました。<br />
<br />
<br /></div>
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="//player.vimeo.com/video/74733230" webkitallowfullscreen="" width="500"></iframe> <br />
<a href="http://vimeo.com/74733230">Eggman Animation</a> from <a href="http://vimeo.com/user17030417">Takayuki Yanagisawa</a> on <a href="https://vimeo.com/">Vimeo</a>.<br />
<div>
<br />
最近、いろいろたてこんでいてなかなかブログが更新出来てないです。<br />
せめて最低、月一では更新したい・・・<br />
<br />
一応、音はフリー素材を使わせて貰いました。<br />
<span style="background-color: #f4f5f7; color: #71767a; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 21px;">BGMはMusic is VFRさんより</span><br />
SEは聞き取りにくいのでイヤホン等をおススメします。<br />
<br />
次回はきちんと技術的なとこかけるといいな。<br />
ではでは。</div>
Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-67653668944316190672013-08-24T22:23:00.002+09:002013-08-24T22:23:53.635+09:00tyDisplaceDeformer今回は、pythonでmaya APIを触ってpluginを作ってみたのでご紹介します。<br />
<br />
まだ処理が重かったりで実装は難しいのでコードの公開は控えます。<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="//player.vimeo.com/video/73030319" webkitallowfullscreen="" width="500"></iframe> <br />
<a href="http://vimeo.com/73030319">tyDisplaceDeformer</a> from <a href="http://vimeo.com/user17030417">Takayuki Yanagisawa</a> on <a href="https://vimeo.com/">Vimeo</a>.<br />
<br />
pymelを使ったら遅くなった?んでしょうか?<br />
<br />
またpythonなどもblogでやっていけたらと思います。Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-6501481642614074662013-07-08T00:50:00.002+09:002013-07-08T00:50:57.444+09:00TYGrassesSetUpTool最近、DFさんのDF TALKの記事を参考にこんなツールを作ってみました。<br />
<br />
<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="http://player.vimeo.com/video/69818347" webkitallowfullscreen="" width="500"></iframe> <br />
<a href="http://vimeo.com/69818347">TYGrassesSetUpTool</a> from <a href="http://vimeo.com/user17030417">Takayuki Yanagisawa</a> on <a href="https://vimeo.com/">Vimeo</a>.Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com1tag:blogger.com,1999:blog-1854526766521735172.post-85278548803462695852013-07-07T13:45:00.003+09:002013-07-07T13:47:54.158+09:00サウンドウェーブをmayaのtlanslateに持っていくお久しぶりです。<br />
<br />
<br />
今回は音声ファイルをmayaにもっていこうと思います。<br />
<br />
単純に再生するだけならタイムラインにドラッグ&ドロップで出来ますが、<br />
サウンドウェーブを使ったアニメーション等はできません。<br />
<br />
なので今回はサウンドウェーブをmayaのtlanslateへもっていく方法を<br />
ご紹介したいと思います。<br />
<br />
<br />
まずは、サウンドウェーブをmayaからでも読み取れるカタチに<br />
しなければなりませんので、今回はAfter Effectsを使いたいとおもいます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyqrtSZlrlp6mNaf7VQy95lU9nEglPvbvS4Er2WRAk4svaQmSgu2cUctRp5CQirVWcBKQqs8l8YqRZkoioUbAuqs7PAWwHoFKdtsTTjXl2oyltVOJXj2w7LdrPSntEtjyNlfV5QMdthvEJ/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyqrtSZlrlp6mNaf7VQy95lU9nEglPvbvS4Er2WRAk4svaQmSgu2cUctRp5CQirVWcBKQqs8l8YqRZkoioUbAuqs7PAWwHoFKdtsTTjXl2oyltVOJXj2w7LdrPSntEtjyNlfV5QMdthvEJ/s1600/%E7%84%A1%E9%A1%8C.png" height="279" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
コンポジション設定はこんな感じです。<br />
デュレーションは音声ファイルの長さに合わせてください。<br />
<br />
タイムラインに音声ファイルをのっけたら<br />
真っ黒な平面を作成し、その上に真っ白な平面を作成します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivQMRJDkN7cPzoNOIO_t4pI6X0ZOvXQkdgMkuqWYpPp3byZaUXxyiPMczvCPE5_VF0nmn3RBpiIgo0iq5a702N-pk7DB5pU58_IZVcfxp6pbKhJqq5veMZWzVGasAFXPdSspmgiB52yjaQ/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivQMRJDkN7cPzoNOIO_t4pI6X0ZOvXQkdgMkuqWYpPp3byZaUXxyiPMczvCPE5_VF0nmn3RBpiIgo0iq5a702N-pk7DB5pU58_IZVcfxp6pbKhJqq5veMZWzVGasAFXPdSspmgiB52yjaQ/s1600/%E7%84%A1%E9%A1%8C.png" height="179" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
こんな感じです。<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2_hQ1eiI2lYqM8eX7P54kMzAjYGn1OgfWnbRRlLyv-OQxH1kFOPh5QZhNc4xV12qPWu0IdMykkWHqJH9kqs7wG0z_ezSfoBLTRHTBe5FtJMTPwmcsEY2E5bevINqEFyx94t95f_qpD-NR/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2_hQ1eiI2lYqM8eX7P54kMzAjYGn1OgfWnbRRlLyv-OQxH1kFOPh5QZhNc4xV12qPWu0IdMykkWHqJH9kqs7wG0z_ezSfoBLTRHTBe5FtJMTPwmcsEY2E5bevINqEFyx94t95f_qpD-NR/s1600/%E7%84%A1%E9%A1%8C.png" height="273" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
次に、音声ファイルを右クリックし<br />
キーフレーム補助 → オーディオをキーフレームに変換<br />
を実行します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJcsxF2mgGQLQE2nvzpSbBPlht6UxojOU68YPVafKANxMNMy0JaUoRLWE-U9-vOo_E0PPosJGl01KjVVMYQLWJgzJvXJbm9CCh3L0hSlYMMEjFH_qhsa_KIkCicGOncjcx60r8uiyuAPbV/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJcsxF2mgGQLQE2nvzpSbBPlht6UxojOU68YPVafKANxMNMy0JaUoRLWE-U9-vOo_E0PPosJGl01KjVVMYQLWJgzJvXJbm9CCh3L0hSlYMMEjFH_qhsa_KIkCicGOncjcx60r8uiyuAPbV/s1600/%E7%84%A1%E9%A1%8C.png" height="100" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
するとオーディオ振幅というレイヤーができ、<br />
右と左と両方のチャンネルがスライダとしてキーフレームに変換されています。<br />
<br />
次に、真っ白な平面の不透明度のストップウォッチのアイコンを<br />
Altキーを押しながらクリックします。<br />
すると、エクスプレッションが打てるようになります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-oiTwRqAIC3qG54NpRuDhlekhRVm___DTGHhg0wTV2Xc333jDbE7Q_QQAa9g0tT57Obqk2TfPoPk4L0xb5DvfdAOP9hfzJOh40J3md7Ow_feQEOci5ZD6ieFRll9blaFWJAcz7rI0VuFl/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-oiTwRqAIC3qG54NpRuDhlekhRVm___DTGHhg0wTV2Xc333jDbE7Q_QQAa9g0tT57Obqk2TfPoPk4L0xb5DvfdAOP9hfzJOh40J3md7Ow_feQEOci5ZD6ieFRll9blaFWJAcz7rI0VuFl/s1600/%E7%84%A1%E9%A1%8C.png" height="192" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
エクスプレッションの渦巻状のアイコンをドラッグして<br />
スライダの上でドロップします。<br />
<br />
では、再生してみてください。<br />
サウンドウェーブに合わせて白黒するアニメーションができていると思います。<br />
<br />
<br />
つまり、この白黒情報をmayaで読み取りtranslateにもっていこうという算段です。<br />
<br />
<br />
なので、これをレンダリングします。<br />
※注意 後でテクスチャアニメーションで読み込むので<br />
soundWave.[###].png のように連番の前は必ず.にして下さい。<br />
<br />
ファイルフォーマットは非可逆圧縮のpngとかをおススメします。<br />
<br />
<br />
<br />
ここからはmayaでの作業<br />
(maya 2013だと一部melがうまく実行されないので(バグ?)<br />
今回はmaya 2011を使っています)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-kaTzkzWOAbkfreq3p12WZM-N7S1koJ7o5PuN_DYeU9Z7o_6IoUWdbFJugsF-Z7YudOGIC9w9AsDTg4CunVbmOfa-11Wu1gDdIKzQP75OKBU5xBa-7wJIZDo9zMKToyWbQMCr4VIqdoCF/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-kaTzkzWOAbkfreq3p12WZM-N7S1koJ7o5PuN_DYeU9Z7o_6IoUWdbFJugsF-Z7YudOGIC9w9AsDTg4CunVbmOfa-11Wu1gDdIKzQP75OKBU5xBa-7wJIZDo9zMKToyWbQMCr4VIqdoCF/s1600/%E7%84%A1%E9%A1%8C.png" height="192" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
ハイパーシェードからファイルノードを作成します。<br />
<br />
ファイルノードに先ほど作成した画像を読み込みます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcidtsBaemoOO3O58Tt9rF8_oi5qBwcUdY5ePdSvHqaNe_m9RianLrAe01GV3PeTZrH4xGMQ7dPiXEnV6jUyTw_wg1V64dijTxnuGQbD0jMacSE8BcGRsfuW6iSDMq18hFMF5YrFAZezQN/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcidtsBaemoOO3O58Tt9rF8_oi5qBwcUdY5ePdSvHqaNe_m9RianLrAe01GV3PeTZrH4xGMQ7dPiXEnV6jUyTw_wg1V64dijTxnuGQbD0jMacSE8BcGRsfuW6iSDMq18hFMF5YrFAZezQN/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="308" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Use Image Sequenceにチェックを入れると連番で画像を読み込んでくれます。<br />
※注意 AEで書きだしたファイルは0から始まるので0フレーム目が<br />
1枚目のテクスチャになっています。<br />
これを変更したい時は紫色になっているImage Numberの<br />
エクスプレッションを変更する必要があります。<br />
<br />
次に、スクリプトエディタを開き以下のMELを実行します。<br />
<br />
//////////////////////////////////////////////////////<br />
{<br />
float $value[];<br />
string $loc[] =`spaceLocator`;<br />
for($i=開始フレーム;$i<=終了フレーム;$i++){<br />
currentTime $i;<br />
$value =`colorAtPoint -u 0.5 -v 0.5 -o A ファイルノード名`;<br />
setAttr ($loc[0] + ".ty") $value[0];<br />
setKeyframe ($loc[0] + ".ty");<br />
}<br />
<br />
}<br />
//////////////////////////////////////////////////////<br />
<br />
<br />
日本語のところは半角英数字に書き換えて使ってください。<br />
<br />
ちなみに今回の場合はこんな感じ。<br />
<br />
//////////////////////////////////////////////////////<br />
{<br />
float $value[];<br />
string $loc[] =`spaceLocator`;<br />
for($i=0;$i<=899;$i++){<br />
currentTime $i;<br />
$value =`colorAtPoint -u 0.5 -v 0.5 -o A file1`;<br />
setAttr ($loc[0] + ".ty") $value[0];<br />
setKeyframe ($loc[0] + ".ty");<br />
}<br />
<br />
}<br />
//////////////////////////////////////////////////////<br />
<br />
<br />
実行してうまくいけばlocatorが現れ、上下に動きます。<br />
<br />
これをスケールの値に入れたりなどして<br />
簡単なモーショングラフィックスなんかも作れますね!<br />
<br />
<br />
<br />
今回のMELの実行内容はこんな感じです。<br />
<br />
float $value[];<br />
//float型の配列を定義します<br />
<br />
string $loc[] =`spaceLocator`;<br />
//ロケーターを作成し、作成されたロケーター名を配列の0番目にいれます<br />
<br />
for($i=0;$i<=899;$i++){ 実行 }<br />
//$iの初期値(0)から$i<=899が成り立っている間ループし、毎回ループ終了後に$iに1を足します<br />
<br />
currentTime $i;<br />
//タイムスライダを$iに以降します<br />
<br />
$value =`colorAtPoint -u 0.5 -v 0.5 -o A file1`;<br />
//MELのcolorAtPointコマンドを実行し色情報を取得します(詳しくはMELコマンドヘルプへ)<br />
<br />
setAttr ($loc[0] + ".ty") $value[0];<br />
//ロケーターの移動Yに色情報から取得した値をいれます<br />
<br />
setKeyframe ($loc[0] + ".ty");<br />
//ロケーターの移動Yにキーフレームを打ちます<br />
<br />
<br />
<br />
このブログではMELの解説等を一切してなかったので<br />
MELってなんぞ?って方もいらっしゃるかもしれませんが<br />
簡単に言うとMaya専用のスクリプト言語です。<br />
繰り返し処理等をする時はとても便利です。<br />
<br />
もし興味のある方は意外と独学でgoogle先生に聞きながらでも出来ると思いますので<br />
チャレンジしてみてください。Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-46688370599618730182013-06-01T01:00:00.002+09:002013-06-01T01:00:21.749+09:00フェースにコンストレインする今回は、動画でチュートリアルを作ってみました。<br />
試験的にささっと作ったので見にくかったり、<br />
分かりにくかったりするかもしれませんがご容赦下さい。<br />
<br />
<br />
さて今回は、フェースにコンストレインするという事ですが<br />
用途は、服にボタン等のオブジェクトが付いている場合等に使えると思います。<br />
<br />
服のボタンはスキンウェイトを振るとオブジェクトが伸びてしまうが<br />
骨にコンストレインすると位置がずれる・・・<br />
なんて状況ありますよね?<br />
<br />
<br />
<br />
ちなみに先に書いておきますが今回の肝は<br />
アトリビュートの転送です。<br />
これを使ってUV座標からワールド座標に追従させます。<br />
まぁ見てもらえば分かると思いますが。<br />
<br />
<br />
ただ今回は最近発見したばっかりで簡単な検証しかおこなっておりません<br />
もし不具合などありましたらコメント頂けると嬉しいです。<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="313" mozallowfullscreen="" src="http://player.vimeo.com/video/67397981" webkitallowfullscreen="" width="500"></iframe> <br />
<a href="http://vimeo.com/67397981">face constraint tutorial</a> from <a href="http://vimeo.com/user17030417">Takayuki Yanagisawa</a> on <a href="http://vimeo.com/">Vimeo</a>.<br />
<br />
<br />
質問や感想等ありましたらコメントお願いします!Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-79380582680778959862013-05-22T01:44:00.001+09:002013-05-22T01:44:43.826+09:00membrane node今回は面白いmayaの隠しノード(?)を見つけたのでご紹介します。<br />
<br />
サスペンションのバネは現在、記事作成中です。<br />まぁそのうち書きます・・・<br />
<br />
<br />
タイトルの通りmayaの隠しノードとはmembrane nodeのことです。<br />
<br />
mayaの隠しノードは私の知っている限りいくつかあります。<br />
例えば<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;">implicit nodeです。</span><br />
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;">これは形のあるnullのようなもので3つの形状があり</span><br />
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;">更に形状を変更するアトリビュートがあります。</span><br />
<br />
maya2013以降であればノードエディタで簡単に作れますが<br />
それ以前ならMELで<br />
<br />
//球体<br />
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;">createNode implicitSphere;</span><br />
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;"><br /></span>
<span style="font-family: Consolas, Bitstream Vera Sans Mono, Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 15.390625px; white-space: pre;">//立方体</span></span><br />
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;">createNode implicitBox;</span><br />
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;"><br /></span>
<span style="font-family: Consolas, Bitstream Vera Sans Mono, Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 15.390625px; white-space: pre;">//円錐</span></span><br />
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;">createNode implicitCone;</span><br />
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;"><br /></span>
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;">とそれぞれ作ることができます。</span><br />
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;">まぁ使い道があるのかは知りませんが。</span><br />
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;"><br /></span>
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;"><br /></span>
<span style="background-color: white; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 14px; line-height: 15.390625px; white-space: pre;">さて、本題の</span>membrane nodeですが直訳で『皮膜』という意味だそうです。<br />
mesh同士のコリジョンや、布っぽい動きを非シュミレーション、<br />
リアルタイムで動かすことが出来ます。<br />
<br />
まぁイメージしにくいと思いますので実際に作ってみましょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5ypLMtYvom1WWokhGG2QuDNpzqSH930fWqAr23_hCWTSWiMwOlo32c9TGLu4iCAnC56qR4zoeBZqCM9B2KCybaxi8T5vnP6-VA7whY-mMr0fDDzYN9wVkfFZshz-Uiau-IvyygLiU2DZ8/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5ypLMtYvom1WWokhGG2QuDNpzqSH930fWqAr23_hCWTSWiMwOlo32c9TGLu4iCAnC56qR4zoeBZqCM9B2KCybaxi8T5vnP6-VA7whY-mMr0fDDzYN9wVkfFZshz-Uiau-IvyygLiU2DZ8/s1600/%E7%84%A1%E9%A1%8C.png" height="226" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
まずは、どんな形でも構いませんがメッシュの細かなオブジェクトを用意します。<br />
<br />
次にそのオブジェクトを選択し<br />
createMembrane;<br />
とMELを実行します。<br />
<br />
すると勝手にmembraneノードがコネクションされたり<br />
meshがコネクションされたりします。<br />
<br />
この状態でアトリビュートを弄っても面白いのですが<br />
他のオブジェクトとコリジョン(衝突)させてみましょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVcM6EkXKNWkLjrep7JQHb1nOuRVJSz1jYkUZKjlNfDGQBf7eX1eCOV8jKzCbotNlspJoefEBP321jlxFRoa6NNl8_rixmilxwItPwbpzpwI1Rd5e5N7smKRxS0BPC37rln2DJ0iaciU8J/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVcM6EkXKNWkLjrep7JQHb1nOuRVJSz1jYkUZKjlNfDGQBf7eX1eCOV8jKzCbotNlspJoefEBP321jlxFRoa6NNl8_rixmilxwItPwbpzpwI1Rd5e5N7smKRxS0BPC37rln2DJ0iaciU8J/s1600/%E7%84%A1%E9%A1%8C.png" height="232" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
先ほどのオブジェクトは置いといて<br />
コリジョンさせたいオブジェクトを新しく作ります。<br />
<br />
先ほどのオブジェクトと新しく作ったオブジェクトを選択し<br />
ハイパーシェードでコネクションを見てみます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6NxEa3LLeOlklQzRDibLgSu4Rtd7m2286AqvCfRank6qFSIw-se4BpmofHtYzeB1A8yqOPjVfJlhQM6gw_mGk_NrfsNnFicuthkZxkH_TMFGA5h4x-YEJV4r2aSo6bTAZOncQfjraT_Gk/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6NxEa3LLeOlklQzRDibLgSu4Rtd7m2286AqvCfRank6qFSIw-se4BpmofHtYzeB1A8yqOPjVfJlhQM6gw_mGk_NrfsNnFicuthkZxkH_TMFGA5h4x-YEJV4r2aSo6bTAZOncQfjraT_Gk/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="301" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
このようにシェイプが表示されると思います。<br />
<br />
これをコリジョンさせたいオブジェクトのシェイプノードからmembrane1へ<br />
中ボタンドラッグで引っ張り、その他を選択しコネクションエディタを開きます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY9yKLgdiz9CfXZKWacp0k31YTtTir4vnHIFYX7GANUW243XmTaSdo3ALvbOOKi71iWKPy7tOqI1SYYneV8gE7Vu6qFd0aKTqj3MbhFcXnR83gtVU9543vLTssC3jDWrgm7woWuz7S45KF/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY9yKLgdiz9CfXZKWacp0k31YTtTir4vnHIFYX7GANUW243XmTaSdo3ALvbOOKi71iWKPy7tOqI1SYYneV8gE7Vu6qFd0aKTqj3MbhFcXnR83gtVU9543vLTssC3jDWrgm7woWuz7S45KF/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="252" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
そしてこのようにworldMeshとcollideMeshをコネクションします。<br />
<br />
<br />
これで完成です!<br />
<br />
あとはお好みでアトリビュートを弄ってみてください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7U0ZaHmdLwGNsLrroooPCl744u5kWnppXqpBnl7-gjzrw4RvnU3-jj8BRIPvFIagvdBj83jWjx708EObKd80zEm8MGCZamU9e5m-OZ7XWtVv3t0cZVu8HHeHK6DN8rtum2Pt-X5dBpZTb/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7U0ZaHmdLwGNsLrroooPCl744u5kWnppXqpBnl7-gjzrw4RvnU3-jj8BRIPvFIagvdBj83jWjx708EObKd80zEm8MGCZamU9e5m-OZ7XWtVv3t0cZVu8HHeHK6DN8rtum2Pt-X5dBpZTb/s1600/%E7%84%A1%E9%A1%8C.png" height="250" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
するとこんな感じで動かしながらリアルタイムで<br />
コリジョンができたと思います。<br />
<br />
<br />
<br />
単純に乱気流や風圧を弄ってワイヤーフレームをレンダリングして<br />
モーショングラフィックスとかも作れそうですね。<br />
<br />
まぁ色々使い道はありそうですが、法線の反転等<br />
弄っているとmeshが崩壊してしまうことも・・・<br />
<br />
少々、脆弱性が気になるところが隠されている所以なのでしょうか・・・<br />
<br />
<br />
まぁ一度、試してみる価値アリです!!Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-17199422641075515062013-05-06T23:35:00.000+09:002013-05-06T23:35:45.571+09:00Suspension setup今回は車やロボットのセットアップの時に使えそうな<br />
サスペンションのリギングをご紹介します。<br />
<br />
毎度ですがこれはあくまで一つの方法ですので他にもたくさんの方法があると思いますし<br />
もっとスマートなセットアップがあかもしれませんので悪しからず。<br />
<br />
<br />
さて何はともあれモデルを作成しましょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcgXA6qVu8osw44V1_nkmNVXXIU9sFs8rUz5j3cf2xniKB8EQ6DE1IKRR8YHwTu_YqVn6Rwy-wdGbqBUrY5ye5GW4pGfE5-sJCy8TQAzdcsE_XUUjArvsGIIAO6IZqTYC-Qijb1gmgCXZU/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcgXA6qVu8osw44V1_nkmNVXXIU9sFs8rUz5j3cf2xniKB8EQ6DE1IKRR8YHwTu_YqVn6Rwy-wdGbqBUrY5ye5GW4pGfE5-sJCy8TQAzdcsE_XUUjArvsGIIAO6IZqTYC-Qijb1gmgCXZU/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="257" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
こんな感じでしょうか?<br />
<br />
今回は見て分かる通り2段階になっております。<br />
段階ごと別オブジェクトでやる方法もありますが今回はくっついています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOIbNJ79bQF7i7gWIjaOY1Ii6bslYJ4vbnwUNaHvan2AO5e36nxHoMyGhtVw9QrdKoY_QCzg6TpaRlWGM0gkNvWlLvmTzJzGeW3ztoydgdThDiivshJhTIZOMyy7dN4_4GQRNYeYV7P7Vx/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOIbNJ79bQF7i7gWIjaOY1Ii6bslYJ4vbnwUNaHvan2AO5e36nxHoMyGhtVw9QrdKoY_QCzg6TpaRlWGM0gkNvWlLvmTzJzGeW3ztoydgdThDiivshJhTIZOMyy7dN4_4GQRNYeYV7P7Vx/s1600/%E7%84%A1%E9%A1%8C.png" height="313" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
まずハイライトになっている部分をクラスタ化します。<br />
ちなみにクラスタ化の方法は<br />
コンポーネントを選択している状態で<br />
アニメーションタブ → デフォーマの作成 → クラスタ<br />
で出来ます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5MRjm31L95wv6iQPC7soxGEwPA-4yHzssh446tKKDeK4hgu02Ka0DNh6EXHokt-O8nyZb5TSr2yixHyzJJgY8BFaQkdcEW-JVmuIVjuzcKnf4ZMa-ips8sYuUorA_r85g7_gXjL0YqExt/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5MRjm31L95wv6iQPC7soxGEwPA-4yHzssh446tKKDeK4hgu02Ka0DNh6EXHokt-O8nyZb5TSr2yixHyzJJgY8BFaQkdcEW-JVmuIVjuzcKnf4ZMa-ips8sYuUorA_r85g7_gXjL0YqExt/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="285" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
お次はここです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzHj-u_iWTDHu6ockJp6egFUtNyrMyUVEXQ8j0FBCDZR-99G1P1pSoogrAnWnW1N5GAjUxkM7oumE2z4sscuwwZePp5Gp61EUGS4WCAQmCIMrmMx4fJx56duoEY3Lzzo0ivoP0JarhcjJu/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzHj-u_iWTDHu6ockJp6egFUtNyrMyUVEXQ8j0FBCDZR-99G1P1pSoogrAnWnW1N5GAjUxkM7oumE2z4sscuwwZePp5Gp61EUGS4WCAQmCIMrmMx4fJx56duoEY3Lzzo0ivoP0JarhcjJu/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="222" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
最後に残ったここです。<br />
<br />
次に三か所にロケーターを配置します。<br />
これは位置を取得する目的と<br />
もしもの時の為のかませです。<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtruI09i5gEUOrr6ZeO-2-MZhXSitTlmu8o3zZVulvAyM0Sp-FNOBBVmhWx9N4O2J6cSseT8sU_gq7gKuGnaA2n1zwsnTkbr5BAp-UFJnZmyAG6tOHyVYnWMpCn3DjnMMgBMvRCF2YzeeL/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtruI09i5gEUOrr6ZeO-2-MZhXSitTlmu8o3zZVulvAyM0Sp-FNOBBVmhWx9N4O2J6cSseT8sU_gq7gKuGnaA2n1zwsnTkbr5BAp-UFJnZmyAG6tOHyVYnWMpCn3DjnMMgBMvRCF2YzeeL/s1600/%E7%84%A1%E9%A1%8C.png" height="234" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
場所は画像参照です。</div>
①一番上の中心<br />
②2段目の中心<br />
③一番下の中心<br />
<br />
配置出来たらロケーターをトランスフォームのフリーズをして<br />
それぞれ上から順にロケーターとクラスタをペアレントコンストレインします。<br />
※順番は ロケーター → クラスタ です<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxZE4htyHxzi_TBaoRUgPZj-iuKb_F6baJ-wUNMAYS5iLWk3COgnPOnyJcDhJt1APZFfqO5GfuwWOHhsbM6mwbeoicFS7AYRPf4h5Gq6_BB2asjGX__h2toHxnf1ZaVkM1-A2zvYocsLlq/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxZE4htyHxzi_TBaoRUgPZj-iuKb_F6baJ-wUNMAYS5iLWk3COgnPOnyJcDhJt1APZFfqO5GfuwWOHhsbM6mwbeoicFS7AYRPf4h5Gq6_BB2asjGX__h2toHxnf1ZaVkM1-A2zvYocsLlq/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="192" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
次にこのようにロケーターを上のロケーターが親になるようペアレント化します。</div>
(上の①、②、③はそれぞれlocator1、2、3になっています)<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmaxkqNKqXjSs51TGhNUAaglMRtNK8goAyGirfLFoRPX6Gunl1abPXz7UWFy39j9GU_MAk37wFJnDzibvCgYmh4Kj7sFOynQPEwiRulmr3sNKSiSow4yYPezUO9AZdI2_pxMJb0xZl5RJz/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmaxkqNKqXjSs51TGhNUAaglMRtNK8goAyGirfLFoRPX6Gunl1abPXz7UWFy39j9GU_MAk37wFJnDzibvCgYmh4Kj7sFOynQPEwiRulmr3sNKSiSow4yYPezUO9AZdI2_pxMJb0xZl5RJz/s1600/%E7%84%A1%E9%A1%8C.png" height="280" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
そして、ハイパーシェードのユーティリティからプラスマイナス平均を押し作業領域に表示させ<br />
アウトライナでロケーター3つを選択し中ボタンドラックで作業領域に表示させてください。<br />
(↑みたいな感じ)<br />
※一気に3つを持ってくと重なって表示されるのでずらしてください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRlViiup7xBvOYSrtWSDhnnFNlKmfSo8DlXI0XWjVV5p_TMF3xgvixY5ovOq2mTBnepvpZ2aIGkkVihRWeNUYN2yW_f7gIgzESNSqPPPGvxpNRKVidZkBSZDBhhHN-dJ4Q9weShCD3mXNT/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRlViiup7xBvOYSrtWSDhnnFNlKmfSo8DlXI0XWjVV5p_TMF3xgvixY5ovOq2mTBnepvpZ2aIGkkVihRWeNUYN2yW_f7gIgzESNSqPPPGvxpNRKVidZkBSZDBhhHN-dJ4Q9weShCD3mXNT/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="261" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
次にlocator1のtranslateYをplusMinusAverage1のinput1D[0]にコネクションします。<br />
※input1Dをクリックしたら自動的にinput1D[0]にコネクションされます。<br />
<br />
同様にlocator3のtranslateYをplusMinusAverage1のinput1D[1]にコネクションします。<br />
が!<br />
コネクションエディタではinput1D[1]が表示されずコネクションできません!<br />
色々と原因はありますが今回は別のコネクション方法で・・・<br />
<br />
<br />
ハイパーシェードの作業領域を見てください。<br />
<br />
locator3の右下に右向きの▲があるのでそこを右ドラックしてtranslateYを選択してください。<br />
そのまま、plusMinusAverage1の左下の右向き▲で<br />
また右ドラックしてinput1D[0]を選択してください。<br />
<br />
これでコネクションが出来ます。<br />
<br />
<br />
そして、plusMinusAverage1のoutput1Dからlocator2のtranslateYとコネクションします。<br />
<br />
最後にplusMinusAverage1のアトリビュートエディタの操作から平均を選択します。<br />
<br />
これで完成です。<br />
試しにlocator1やlocator3のtranslateYを動かしてみてください。<br />
locator2が1と3のちょうど真ん中のポジションに動いてくれます!<br />
<br />
<br />
あとは他オブジェクトにペアレント化したり、エイムコンストレインすれば<br />
向きなども自由自在になると思います。<br />
(ここは少し考えないともしかしたら難しいかも;)<br />
まぁ分かりにくかったらコメント下さい。<br />
<br />
<br />
<br />
また今度、この記事の内容を使ってサスペンションにばねを付けていみたいと思います。<br />
<br />
ではではTakayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-53400307562227849292013-05-04T18:57:00.002+09:002013-05-04T18:58:08.056+09:00transform node等前回しれっと使ってしまった『transform node』という単語みなさん理解していたでしょうか。<br />
<br />
<br />
そもそもMayaはnode(ノード)で出来ています。<br />
そしてノードは大きく分けて二つの種類に分けられます。<br />
DAGノードと、DGのノードです。<br />
詳しくは↓<br />
<a href="http://mukaimame-cg.jugem.jp/?eid=100">http://mukaimame-cg.jugem.jp/?eid=100</a><br />
<br />
今回は、その中でもオブジェクトを作る上でかかせない<br />
<span style="font-family: Georgia; line-height: 17px;">DAG ノードで DG ノードの一種でもあるtransform nodeとshape nodeについて書きます。</span><br />
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjADIC2sNZUCS2sVk1KZ8qN7AyuQGK5DohtcCdDY-f2BVNeihw39JZJORcOlU-70M2C3hWph_4z521nKIX6yrpS7YT9aynsUTfBXiYeXUE2L0SPnVhe9feUoULIQTdPoTsnV1PU3kpvUQCb/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjADIC2sNZUCS2sVk1KZ8qN7AyuQGK5DohtcCdDY-f2BVNeihw39JZJORcOlU-70M2C3hWph_4z521nKIX6yrpS7YT9aynsUTfBXiYeXUE2L0SPnVhe9feUoULIQTdPoTsnV1PU3kpvUQCb/s1600/%E7%84%A1%E9%A1%8C.png" height="120" width="320" /></a></div>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia;"><span style="line-height: 17px;">まず、ポリゴンの球を作ってハイパーシェードの入出力コネクションをしてみます。</span></span><br />
<span style="font-family: Georgia;"><span style="line-height: 17px;">上のような関係が出ると思います。</span></span><br />
<span style="font-family: Georgia;"><span style="line-height: 17px;"><br /></span></span>
<span style="font-family: Georgia;"><span style="line-height: 17px;">左から説明すると、</span></span><br />
<span style="font-family: Georgia;"><span style="line-height: 17px;">create node</span></span><br />
<span style="font-family: Georgia;"><span style="line-height: 17px;">shape node</span></span><br />
<span style="font-family: Georgia;"><span style="line-height: 17px;">shading group node</span></span><br />
<span style="font-family: Georgia;"><span style="line-height: 17px;">transform node</span></span><br />
<span style="font-family: Georgia;"><span style="line-height: 17px;">となっています。</span></span><br />
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;">まず、</span><span style="font-family: Georgia; line-height: 17px;">create nodeですがこれが今回で言う球の形状を決めています。</span><br />
<span style="font-family: Georgia; line-height: 17px;">この中に半径、分割数といった値が入っています。</span><br />
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia;"><span style="line-height: 17px;">そして</span></span><span style="font-family: Georgia; line-height: 17px;">create nodeのoutputからshape nodeのinMeshに繋がれています。</span><br />
<span style="font-family: Georgia; line-height: 17px;">shape nodeでは</span><span style="font-family: Georgia; line-height: 17px;">create nodeからきた形状を</span><br />
<span style="font-family: Georgia; line-height: 17px;">私達がUI上で見れるように</span><span style="font-family: Georgia; line-height: 17px;">形作ってくれます。</span><br />
<span style="font-family: Georgia; line-height: 17px;">他にもレンダリングの詳細やスムースメッシュなどの値が入っています。</span><br />
<span style="font-family: Georgia;"><span style="line-height: 17px;">ちなみにUI上でヒストリの削除をすると</span></span><br />
<span style="font-family: Georgia;"><span style="line-height: 17px;">この</span></span><span style="font-family: Georgia; line-height: 17px;">shape nodeのoutMeshの前に繋がれていた</span><span style="font-family: Georgia; line-height: 17px;">ノード達が消えていきます。</span><br />
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;">そして</span><span style="font-family: Georgia; line-height: 17px;">shading group nodeはおおまかにいうと</span><span style="font-family: Georgia; line-height: 17px;">shape nodeで形作ったものに色を付けています。</span><br />
<span style="font-family: Georgia; line-height: 17px;">ここではディスプレイメントやレンダリングの設定等様々な値が入っています。</span><br />
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia;"><span style="line-height: 17px;">そして最後</span></span><span style="font-family: Georgia; line-height: 17px;">transform nodeですがこれら設定がされたオブジェクトが</span><br />
<span style="font-family: Georgia; line-height: 17px;">どこに配置されるのかどこにピボットがあるのかなどの値が入っています。</span><br />
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyilHeSrKLQLT-VQ76Cm-UhhBW5w22wzqhXy2LoRhZ_oJEkxstzUfpQT8A7ZWzUoNpYjRdawPNilvBf0YOekhBq5yqNTY7_9pRRmmm92_rmMfgSnQAHqkLUAfwLOxgHeAf_3jYSnMJahKM/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyilHeSrKLQLT-VQ76Cm-UhhBW5w22wzqhXy2LoRhZ_oJEkxstzUfpQT8A7ZWzUoNpYjRdawPNilvBf0YOekhBq5yqNTY7_9pRRmmm92_rmMfgSnQAHqkLUAfwLOxgHeAf_3jYSnMJahKM/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="193" /></a></div>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;">さてお次はアウトライナです。</span><br />
<span style="font-family: Georgia; line-height: 17px;">ディスプレイ → シェイプ にチェックを入れています。</span><br />
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia;"><span style="line-height: 17px;">見て分かるようにpSpere1には二つのノードによる階層が出来ています。</span></span><br />
<span style="font-family: Georgia;"><span style="line-height: 17px;">ちなみに上がtransform node下がshape nodeです。</span></span><br />
<span style="font-family: Georgia;"><span style="line-height: 17px;"><br /></span></span>
<span style="font-family: Georgia;"><span style="line-height: 17px;">つまり何が言いたいかというと</span></span><span style="font-family: Georgia; line-height: 17px;">transform nodeとshape nodeは親子関係があるということです。</span><br />
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;">では試しにUI上で</span><span style="font-family: Georgia; line-height: 17px;">pSpere1を選択し、↓キーを押してみて下さい</span><br />
<span style="font-family: Georgia; line-height: 17px;">ちなみに↓キーはpick workのdownのショートカットでひとつ下の階層を選択します。</span><br />
<span style="font-family: Georgia; line-height: 17px;"><br /></span>
<span style="font-family: Georgia; line-height: 17px;">右下のスクリプトエディタに</span><br />
// 結果: pPlaneShape1 //<br />
と表示されshape nodeが選択できたかと思います。<br />
<br />
<br />
<br />
・・・と、このような意外と基礎知識は見落としがちです。<br />
これを知っていたら何ができるという具体例はあまり浮かびませんが<br />
これを知っているのと知っていないのとでは制作において大きく違うと思います。<br />
<br />
とくにバインド時のshape nodeの繋がりは理解しておくと<br />
後からブレンドターゲットを追加したりなど活用できると思います。<br />
<br />
<br />
なんか今回は活字ばっかになってしまいましたが参考になればと思います。Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-28288514080353299042013-04-30T16:40:00.001+09:002013-04-30T16:40:47.506+09:00matrixについて諸事情によりだいぶ期間が開きましたが今回はmatrixについてです。<br />
<br />
mayaのtransform nodeには移動(translate)、回転(rotate)、スケール(scale)、シアー(shear)<br />
というお馴染みのアトリビュートがありますがこれらを全て合わせたものがmatrixです。<br />
(シアーはあまり使わないですかね・・・)<br />
<br />
matrixは16個の数字を持ちます。<br />
ちなみに移動(translate)は3つの数字(X、Y、Z)ですよね。<br />
その数字についてとても分かりやすく解説して下さってるブログをご紹介します。<br />
<a href="http://melpystudio.blog82.fc2.com/blog-entry-69.html">http://melpystudio.blog82.fc2.com/blog-entry-69.html</a><br />
<br />
<br />
さて、ではmatrixをどんな時に使えばいいのかということですが<br />
以前decomposeMatrixに触れたのでそれを使った<br />
グレードアップ版ペアレントコンストレインをご紹介します。<br />
(ちなみに今回はmaya2011で作ってます)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTsP52sl-4UttzuGSPLEL77wJDSW_r7abjAmnaGruWAPJvO5b1hE3IHumBIESIUWTFPrPTN48_xdzyYp-n-XJCPGsutLO3EZ7rF7p5pO8ZDENe-YxDzBIAPmQ8K8dTSKaoCmAtN2FvIQQw/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTsP52sl-4UttzuGSPLEL77wJDSW_r7abjAmnaGruWAPJvO5b1hE3IHumBIESIUWTFPrPTN48_xdzyYp-n-XJCPGsutLO3EZ7rF7p5pO8ZDENe-YxDzBIAPmQ8K8dTSKaoCmAtN2FvIQQw/s1600/%E7%84%A1%E9%A1%8C.png" height="207" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
まずはこのようにオブジェクトを2つ用意し、トランスフォームのフリーズをしておきます。<br />
<br />
プラグインマネージャでdecomposeMatrix.mllというのをロードしておいて下さい。<br />
<br />
次に、ハイパーシェードを開いて下さい。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1O_K9S0zo1n8Q32ljIthUjvwTH8VTGyu3RfotB_paxfd0XfB6sG-FJ8sKQ1CTRNk_x2jJHqcyamAMsM0uzH0c7f1bpaEW4p05mShJ20Ahugj5mE9Kr5E-ef0I-P8hdjPU2Ue0kxeX3NS6/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1O_K9S0zo1n8Q32ljIthUjvwTH8VTGyu3RfotB_paxfd0XfB6sG-FJ8sKQ1CTRNk_x2jJHqcyamAMsM0uzH0c7f1bpaEW4p05mShJ20Ahugj5mE9Kr5E-ef0I-P8hdjPU2Ue0kxeX3NS6/s1600/%E7%84%A1%E9%A1%8C.png" height="15" width="320" /></a></div>
<br />
<br />
<br />
次に、画面左下のMELのところに<br />
createNode decomposeMatrix;<br />
と打ちこんでEnterキーを押してください。<br />
<br />
するとハイパーシェードの作業領域にdecomposeMatrix1というノードが<br />
一つ出来上がったと思います。<br />
もし表示されない場合は<br />
select decomposeMatrix1;<br />
と同じくMELのところにうって入出力コネクションボタンを押してみてください。<br />
<br />
<br />
ちなみにmaya2013の場合はノードエディタを開きTABキーを押し<br />
decぐらいまで打ったらdecomposeMatrixが出てくるのでそれを押せば出来ます。<br />
<br />
<br />
decomposeMatrixノードはmatrixの16個数字から移動(translate)、回転(rotate)、<br />
スケール(scale)、シアー(shear)の値に変換してくれるノードです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQi0PUDZExD0z_91eOwi-8mLrXxMyiUYCxMNJGJhhy6-20DGdty-7mKO9vbVQoKzgQfXJiVNJCL0ydKV5nmQt89DlNtn3uclM24g5rqBilvh8Gk9-LrTTjCCDcDA0hU8P5iIXF4CGeqKDZ/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQi0PUDZExD0z_91eOwi-8mLrXxMyiUYCxMNJGJhhy6-20DGdty-7mKO9vbVQoKzgQfXJiVNJCL0ydKV5nmQt89DlNtn3uclM24g5rqBilvh8Gk9-LrTTjCCDcDA0hU8P5iIXF4CGeqKDZ/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="261" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
では次にコネクションエディタを開き右側にpCube1<br />
左側にdecomposeMatrix1をロードします。<br />
<br />
そしてworldMatrixからinputMatrixへコネクションします。<br />
<br />
ちなみにtransformノードにはmatrixが幾つもあるのですが<br />
なぜworldMatrixなのかというとペアレントコンストレインのように<br />
world座標で制御したい為です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZyZBrgFQvhQcctNoquf29k8caRLVY9g9A2tJTeCDLmhWv0PGhgsQZh_V7Uk7tpCOWNioDsCez573sm0Gu-pVAUJCkgh13xIpg3Y8wjOs1gKTdVlPzR2a2LkbW8Na6seWau3MtJbIQbwwa/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZyZBrgFQvhQcctNoquf29k8caRLVY9g9A2tJTeCDLmhWv0PGhgsQZh_V7Uk7tpCOWNioDsCez573sm0Gu-pVAUJCkgh13xIpg3Y8wjOs1gKTdVlPzR2a2LkbW8Na6seWau3MtJbIQbwwa/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="261" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
次に左側にdecomposeMatrix1、右側にpSphere1をロードします。<br />
そしてそのまま<br />
outputTranslateとtranslate<br />
outputRotateとrotate<br />
outputScaleとscale<br />
outputShearとshear<br />
をコネクションします。<br />
<br />
これで完成です!<br />
<br />
<br />
で、なにがグレードアップ版かというとスケール<br />
シアーの値もコンストレインされているという点と<br />
コネクションされている数が全然違うので処理が軽いということです。<br />
<br />
ハイパーシェード等で見てもらえば分かると思いますが<br />
通常のペアレントコンストレインは17つコネクションされているのに対し<br />
グレードアップ版ペアレントコンストレインは5つしかコネクションされていません。<br />
<br />
<br />
今回は簡単な使い方だけでしたがいろいろと使い道はあると思います。<br />
ペアレント化されている子供の階層のワールド座標を取得できるというだけで<br />
夢がひろがりますよね?・・・よね・・・?<br />
<br />
はい、ではまぁ色々とチャレンジしてみてください。Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com2tag:blogger.com,1999:blog-1854526766521735172.post-26436409019137768482013-04-05T03:16:00.002+09:002013-04-05T03:16:17.469+09:00補助ボーンまた期間が開いてしまいました。<br />
気持ち的には3日に1投稿くらいしたいのですが<br />
私用で最近なかなか書けませんでした;;<br />
<br />
<br />
今回は補助ボーンです。<br />
補助ボーンとはスキニングの時の補助として作るボーンのことです。<br />
<br />
<br />
ちなみにスキニングはボーンでしか行えないと思ってらっしゃるかたも<br />
多いのではないでしょうか。<br />
<br />
スキニングはポリゴン等でもバインドできます。<br />
(たしかジョイントは必須になったと思います)<br />
<br />
何か厚みのあるものをバインドさせたいときには便利です。<br />
マッスルを使わずに疑似的な筋肉の表現なんかも使えると思います。<br />
<br />
まぁ今回は説明しませんが・・・<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYpAcjMrLtLXmmZqlrfVjVGMl-71Vn9x4-NCl0_B-_39NxbP3cWp_diuEvKcA6hPhBQPbbDYmv_Ybkcvzg3StOReuUaAnJqAHHqWbn2br5yx4cyf5WEK2pmoCbgXV1DSnWMGpHCfqliB31/s1600/cap.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="244" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYpAcjMrLtLXmmZqlrfVjVGMl-71Vn9x4-NCl0_B-_39NxbP3cWp_diuEvKcA6hPhBQPbbDYmv_Ybkcvzg3StOReuUaAnJqAHHqWbn2br5yx4cyf5WEK2pmoCbgXV1DSnWMGpHCfqliB31/s320/cap.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
こんなものを用意しました。<br />
ただの円柱にボーンをバインドしたものです。<br />
(なんとなくスムースメッシュプレビューにしてあります)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu6XTtTEzuL6srKEQPAhFmYO8NWpIgEOA6ruvor3FcCEbdIzvomtpLqF9aCe7ePNDr3cFIafQ5c4UQr9zz5AYzXgjiH6I75gsbxZ_1D5d0N1d4IVUzI4wOq4-age-wdGpD6tQbSeZTvXCw/s1600/cap.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu6XTtTEzuL6srKEQPAhFmYO8NWpIgEOA6ruvor3FcCEbdIzvomtpLqF9aCe7ePNDr3cFIafQ5c4UQr9zz5AYzXgjiH6I75gsbxZ_1D5d0N1d4IVUzI4wOq4-age-wdGpD6tQbSeZTvXCw/s320/cap.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
曲げるとこんな感じです。<br />
<br />
ウエイトはインタラクティブで<br />
一番下のジョイント(root)から真ん中のジョイントまでの頂点のウエイトを<br />
一番下のジョイント(root)に対して1、<br />
真ん中のジョイントから一番上の末端ジョイントまでの頂点のウエイトを<br />
真ん中のジョイントに対して1にしてあります。<br />
<br />
<br />
曲げた真ん中のジョイントに近い部分がポリゴンをえぐってしまっており<br />
滑らかには曲がっていません。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjikSCX1RsT4_3oyN4__OCyn1jA06XHG0LKxwom6KWa2nASXv1dp-F0EogymerCN1kStGL2pNUeyNRGyrwx_boVGznP2lku53hoFpQ9JKsj3zYr4hXhfiUQFW6JugCM_BdCky-mr6lOxKJz/s1600/cap.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjikSCX1RsT4_3oyN4__OCyn1jA06XHG0LKxwom6KWa2nASXv1dp-F0EogymerCN1kStGL2pNUeyNRGyrwx_boVGznP2lku53hoFpQ9JKsj3zYr4hXhfiUQFW6JugCM_BdCky-mr6lOxKJz/s320/cap.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
滑らかに曲がるために、この選択されたエッジは<br />
真ん中のジョイントの半分の値をとってほしいです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_AyyVkDNn8NsbTqK4jsMjpGBf966WzLeu0funsKDcl1whgD5urwV_H9LbrhzjuG09RRYQos8j7BIUuKXmiVe8yydFieAkWbfqS0p0DRvtYWYmskYZoZktPglHEvdnsKnMW-wPKoTq-v-U/s1600/cap.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="274" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_AyyVkDNn8NsbTqK4jsMjpGBf966WzLeu0funsKDcl1whgD5urwV_H9LbrhzjuG09RRYQos8j7BIUuKXmiVe8yydFieAkWbfqS0p0DRvtYWYmskYZoZktPglHEvdnsKnMW-wPKoTq-v-U/s320/cap.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
そこでまず同じポジションにジョイントを新しく作ります。<br />
回転軸は真ん中のジョイントと同じ方向にしておいて下さい。<br />
<br />
バインドされたオブジェクトと<br />
バインドしているルートジョイントと<br />
新しく作ったジョイント<br />
この3つを選択した状態で<br />
<br />
スキン → スムース スキンの編集 → インフルエンスの追加<br />
をします。<br />
<br />
すると後から追加したジョイントもウエイトを持つことができるようになるので<br />
先ほどのエッジの部分の頂点のウエイトを新しく追加したジョイントに対し1にします。<br />
<br />
<br />
後はこの新しく追加したジョイントに真ん中のジョイントの回転値の半分を<br />
いれてあげれば良い訳です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC7saDmDDfSU-wCyYzH-P5Tu92MOvjPz3EdmAH58kVqkt9mvbhWd4eyF9canoGbKcHyxxm5YeMcG-skrgmGULrE0rZz8WII2n87h42kNruWMtglAdCdFzEIPCmdH7w04QlR30SYzDASkJt/s1600/cap.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="135" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC7saDmDDfSU-wCyYzH-P5Tu92MOvjPz3EdmAH58kVqkt9mvbhWd4eyF9canoGbKcHyxxm5YeMcG-skrgmGULrE0rZz8WII2n87h42kNruWMtglAdCdFzEIPCmdH7w04QlR30SYzDASkJt/s320/cap.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
こんな感じで乗算除算ノードを使い真ん中のジョイントの回転値に0.5をかけ合わせ<br />
新しいジョイントの回転値にします。<br />
コネクション方法は前の記事でもやってるので省きます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFIn3fZA5Fv89PKh9Md5K0t0zWwgLkz1JEzTO6wc_zEAt05QY1isXCnhhwEX5dVS6WzzTgRH80j6-S5PK3XZzFRGIv52C9NpAc-wA8pizCC4q2JAoGOp69DecmDt-9R9aD-MN1J1p7G23c/s1600/cap.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFIn3fZA5Fv89PKh9Md5K0t0zWwgLkz1JEzTO6wc_zEAt05QY1isXCnhhwEX5dVS6WzzTgRH80j6-S5PK3XZzFRGIv52C9NpAc-wA8pizCC4q2JAoGOp69DecmDt-9R9aD-MN1J1p7G23c/s320/cap.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
するとこんな感じで滑らかに曲がってくれます。<br />
<br />
<br />
<br />
これを応用すれば人型でバインドするのが難しい尻、肩等の調整が<br />
うまくできるのではないでしょうか。<br />
<br />
リアル系は素直にマッスルを試す方がいいと思いますが<br />
カートゥーン系のようなキャラクターは良いかもしれません。<br />
(とか書きましたがマッスルに関してはまだまだ勉強中です;;)<br />
<br />
<br />
以上ですーTakayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com0tag:blogger.com,1999:blog-1854526766521735172.post-90221407941525993132013-03-28T03:09:00.000+09:002013-03-28T03:09:21.856+09:00セットアップの参考サイト最近いろいろと忙しくて書きたい記事はまだまだあるのですが<br />
今回は参考サイトをいくつかご紹介します。<br />
<br />
<br />
<br />
人体の構造やメッシュの割り方の参考になります。(英語)<br />
http://hippydrome.com/<br />
<br />
フェイシャルのセットアップされたフリーモデルがあります。(英語)<br />
http://www.facewaretech.com/support/retargeter-support/faceware-facial-rig-library/<br />
<br />
キャラクターTDをやってらっしゃる方のブログです。(英語)<br />
http://circecharacterworks.wordpress.com/tag/rigging-2/<br />
<br />
melを分かりやすく説明して下さってるブログです。私もここを見ながらmelを学びました。<br />
http://flame-blaze.net/<br />
<br />
melのコマンドリファレンスです。なんかこれ見やすい。<br />
http://me.autodesk.jp/wam/maya/docs/Maya2009/Commands/show.html?floatFieldGrp.html&cat=Windows<br />
<br />
melを勉強しながらツールなどを作っていた時とても参考になりました。<br />
http://shikatanaku.blogspot.jp/<br />
<br />
<br />
<br />
後半melですが、いずれこのブログでもmelを紹介できたらいいなと思っております。<br />
でもmelってどこまで説明すればいいのか分からない・・・<br />
<br />
思いだした順に並べたのでどのサイトが良いとかではないです。<br />
というか全部とても良いサイトだと思います。<br />
<br />
ただ勝手に紹介していいものなのかな・・・<br />
<br />
まぁ参考サイトだしいいのか。<br />
知恵袋とかも大丈夫ですしね!<br />
<br />
<br />
<br />
今回は短いですが、次回はちゃんと書きます。(たぶん;;)Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com1tag:blogger.com,1999:blog-1854526766521735172.post-79548072949513190222013-03-23T16:30:00.002+09:002013-03-23T16:30:48.921+09:00Stretch IK最近バタバタしてて少し間があきましたが<br />
今回はStretch IKです。<br />
<br />
Stretch IKとは主にカートゥーン系のアニメーションに用いられる<br />
セットアップの方法の一つです。<br />
<br />
具体的には手足や胴体などが伸び縮みする方法です。<br />
<br />
<br />
ただ少しややこしいので考え方をしっかり理解しながら<br />
読んでいってもらえればと思います。<br />
<br />
<br />
<br />
さて、単純に伸びると言ってもジョイントやバインドされたオブジェクトを<br />
視覚的に伸ばす方法は2つあります。<br />
<br />
1、ジョイントを移動させる<br />
2、ジョイントにスケールをかける<br />
<br />
まぁこの二つが考えられるのですが2の方が一般的なので<br />
今回は2を説明します。<br />
<br />
<br />
それから、今回はStretchではなくStretch IKです。<br />
FKのStretchの考え方はジョイントを直接操作するのと同じなので<br />
とても簡単なので今回は省きます。<br />
(↑のようにスケールでコントロールするならばジョイントに直接スケールを<br />
かけるのと同じ動作でFKはセットアップ出来ます。)<br />
<br />
<br />
<br />
<br />
ではまず、考え方を・・・<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv8riKX_1TaqF7MZlNqPkeff6qkImagCwt1uxsKn-_y0rRJtBY4vREgb1kSzESaUGUhC3flTMfM8Iivm_s03TSu1q26d9DWS-XybvyBQp2yf1TmDx1ppqk9MKVc1djawt7X7-Oa6QBasYW/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv8riKX_1TaqF7MZlNqPkeff6qkImagCwt1uxsKn-_y0rRJtBY4vREgb1kSzESaUGUhC3flTMfM8Iivm_s03TSu1q26d9DWS-XybvyBQp2yf1TmDx1ppqk9MKVc1djawt7X7-Oa6QBasYW/s1600/%E7%84%A1%E9%A1%8C.png" height="132" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
今回のセットアップで重要な事はジョイントの方向を意識するということです。<br />
このようにボーンがあったとき次の下位のジョイントの方向にX軸が向いている<br />
ということが必要です。<br />
(今回はX up Y - Z になっていますがそこは好きにやっても良いかもしれません)<br />
<br />
何故方向が重要かというと、正しい方向にスケールをかける為です。<br />
軸が違うと計算が複雑になったり伸びてほしい方向とは別の方向に伸びてしまう<br />
ということになったりしますので、気を付けてください。<br />
<br />
<br />
では、ここにIK handleをいれるとします。<br />
そしてIK handleを動かすとジョイントが伸びきり、それ以上は動きません。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1DzzmCC968eAdUJ4LEnSXzcf4g60NCwgqSjwgD2bAa0HT9Ii6llfzxk44TW-ounNUW8OfikP5ZoL6ob3p0ffGr06xiJPMCXgzseUI2Vjiyx6At4F_kfgvgBg78nhAKcyLgGQ4ira9CBNc/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1DzzmCC968eAdUJ4LEnSXzcf4g60NCwgqSjwgD2bAa0HT9Ii6llfzxk44TW-ounNUW8OfikP5ZoL6ob3p0ffGr06xiJPMCXgzseUI2Vjiyx6At4F_kfgvgBg78nhAKcyLgGQ4ira9CBNc/s1600/%E7%84%A1%E9%A1%8C.png" height="200" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
なので真ん中のジョイントにスケールをかけてみましょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8esfQ6QHAQa6hnpzRN0wuvdLYKk-VgIPlqK0bxpAelznocjLhQiJiJD85MyTPv3f0ZXvwkVpU6ohgc1L7acVi9h-9WWE-iIl3sW6liKcXRbWddzYz-ZZKK5RQJAyA3BLglgZE1jp7L1pG/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8esfQ6QHAQa6hnpzRN0wuvdLYKk-VgIPlqK0bxpAelznocjLhQiJiJD85MyTPv3f0ZXvwkVpU6ohgc1L7acVi9h-9WWE-iIl3sW6liKcXRbWddzYz-ZZKK5RQJAyA3BLglgZE1jp7L1pG/s1600/%E7%84%A1%E9%A1%8C.png" height="179" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
するとこのように伸びてIK handleをさらに遠くへ動かせます。<br />
<br />
<br />
つまり何が言いたいのかというとIK handleの位置に合わせて<br />
スケールがかかればIK handleを制限なく伸ばすことが出来る訳です。<br />
そして『伸びる』事ができます。<br />
<br />
<br />
ではどうすればいいかという話ですが<br />
腕で例えると<br />
IK handleがもともとの腕の長さより2倍の位置に来たら腕を2倍に<br />
IK handleがもともとの腕の長さより3倍の位置に来たら腕を3倍に<br />
・・・<br />
といった具合にすれば良い訳です。<br />
<br />
計算式で言うと<br />
(現在の腕の長さ÷もともとの腕の長さ)=ジョイントのスケール値<br />
現在の腕の長さ=IK handleの位置<br />
こんな感じです。<br />
<br />
つまりIK handleの位置的に何倍伸びたかを求めてジョイントのスケールに入れれば良い訳です。<br />
<br />
<br />
<br />
理解していただけたでしょうか。<br />
<br />
<br />
<br />
<br />
ではそれらを踏まえ作り方を書きます。<br />
今回は↑の計算はノードで繋いで作りますのでエクスプレッションは使いません。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm1qy8WinFBL67PFo-Ei16HviUuS_jxjwxoVWurTm3VTUgPvEB_oXZENvNJez_ziWk6SWmFTzvJGYWYMjC4D5DBqsp16kknpVE21o7x8L7cUxu32Wwar1ITkwvvfFv5SJomid_WA2tljkO/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm1qy8WinFBL67PFo-Ei16HviUuS_jxjwxoVWurTm3VTUgPvEB_oXZENvNJez_ziWk6SWmFTzvJGYWYMjC4D5DBqsp16kknpVE21o7x8L7cUxu32Wwar1ITkwvvfFv5SJomid_WA2tljkO/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="275" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
まず、ジョイントをX upで作ります。<br />
この時にスケール補正にはチェックを入れておいてください。<br />
<br />
そしてIK handleを入れます。<br />
<br />
次に 作成→測定ツール→距離ツール<br />
でIK handleの距離を計ります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpG0hGWe5n9BtkizM9KNBrtpQvnXH5_EK7BGQO-yeE3HC42PXz1_2YGDESQybKsvgWw3Td_vvvRoAnnPQQv5exX1mnTFGbYSF9AfkoJkbFu37ncNHveB9vbtTYQwdNRGpB2gLIwnj7Fn3-/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpG0hGWe5n9BtkizM9KNBrtpQvnXH5_EK7BGQO-yeE3HC42PXz1_2YGDESQybKsvgWw3Td_vvvRoAnnPQQv5exX1mnTFGbYSF9AfkoJkbFu37ncNHveB9vbtTYQwdNRGpB2gLIwnj7Fn3-/s1600/%E7%84%A1%E9%A1%8C.png" height="143" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
距離ツールは一度クリックしたあと、shiftを押しながらもう一度クリックで作成できます。<br />
これでもともとの長さが計れました。<br />
<br />
次に、rigとIK handleをペアレントコンストレインして<br />
rigと距離ツールで使われているIK handle側のロケーターもペアレントコンストレインします。<br />
<br />
これでrigを動かすとIK handleの距離が変わって計る事が出来ます。<br />
<br />
<br />
次に、ハイパーシェードで乗算除算というノードを作ってください。<br />
これは掛け算、割り算、累乗などの計算をしてくれるノードです。<br />
これを使って現在のIK handleの位置がもともとの長さの何倍になっているか<br />
を算出してあげます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0bTt5gPZA9RQf47_E96Vr6JSBxaYcEvtAURSndapB6SexBllRhikOPdY3Eyssq5UZx9KrRl_6Ix7b-sTH8jxLwoHD5XI7srHFkBHNSCkLWPIkEq63u58jAGZm2Gyd6T69-EraZGcMfAue/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0bTt5gPZA9RQf47_E96Vr6JSBxaYcEvtAURSndapB6SexBllRhikOPdY3Eyssq5UZx9KrRl_6Ix7b-sTH8jxLwoHD5XI7srHFkBHNSCkLWPIkEq63u58jAGZm2Gyd6T69-EraZGcMfAue/s1600/%E7%84%A1%E9%A1%8C.png" height="282" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
アトリビュートエディタの操作を除算に変えます。<br />
次にUI上に表示されている距離ツールの数値を選択し<br />
ハイパーシェード上で入出力コネクションを押します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTKOcgKj7gUmymoOAGtES2lsF5H1oU2yPOiR4lS7CWnBthWs3iFc9wKPImKwg9w-_rqIFlUxat0bAtR1mTZh1V0g0RWqecwl7kF36MdTYegR3DsDkLK7w0HPKDK4mDFHqF80BYAGQl80PE/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTKOcgKj7gUmymoOAGtES2lsF5H1oU2yPOiR4lS7CWnBthWs3iFc9wKPImKwg9w-_rqIFlUxat0bAtR1mTZh1V0g0RWqecwl7kF36MdTYegR3DsDkLK7w0HPKDK4mDFHqF80BYAGQl80PE/s1600/%E7%84%A1%E9%A1%8C.png" height="242" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
するとトランスフォームノードとシェイプノードがあるので<br />
シェイプノードを選択しコネクションエディタの左側にロードします。<br />
(シェイプノードはロケーター2つと繋がれている方です)<br />
<br />
右側には先ほど作った乗算除算ノードをロードします。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgViTYFmb2VpDrtR-guUg9h110FXoFnCbDpW6aQMnxTvukDfP7QkL_npnhi5ugxkhVE7ktIehGF4p0D5_snCYMhtPqlvL0EmCKPeutvBnMFIytCoz6-wFIIgxrsHf2ybWq_QM8lfEJtodZN/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgViTYFmb2VpDrtR-guUg9h110FXoFnCbDpW6aQMnxTvukDfP7QkL_npnhi5ugxkhVE7ktIehGF4p0D5_snCYMhtPqlvL0EmCKPeutvBnMFIytCoz6-wFIIgxrsHf2ybWq_QM8lfEJtodZN/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="261" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
このようにdistanceとinput1Xをコネクションします。<br />
<br />
次にrigを完全にジョイントが伸びきったギリギリの位置にもっていきます。<br />
その時表示された距離を先ほどの乗算除算ノードinput2X(入力2のX)に打ち込みます。<br />
<br />
これで(現在の腕の長さ÷もともとの腕の長さ)が求められました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM0fc9ENmtt6hk4ssrq0ORBfvzMCvRfgGzzdb2cRg4o5QKR7veK5A_3AgwzN42jfvDK8mqZ3tNZP6v3uXbdGAnL3D-YgZDVqGUunSz_relekezmqSS6HBUwA0VsHKvF_sRjnYqynSuF4pR/s1600/%E7%84%A1%E9%A1%8C.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM0fc9ENmtt6hk4ssrq0ORBfvzMCvRfgGzzdb2cRg4o5QKR7veK5A_3AgwzN42jfvDK8mqZ3tNZP6v3uXbdGAnL3D-YgZDVqGUunSz_relekezmqSS6HBUwA0VsHKvF_sRjnYqynSuF4pR/s1600/%E7%84%A1%E9%A1%8C.png" height="320" width="261" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
後は乗算除算ノードをコネクションエディタの左側にリロードして<br />
右側にジョイントをリロードし、outputXとscaleXをコネクションします。<br />
(ちなみに一番上の画像で言う右側のボーンはコネクションしなくて良いです。)<br />
<br />
<br />
<br />
これで、伸縮が出来ます!!<br />
<br />
<br />
が、何処までも縮んでしまいIKが曲がらなくなってしましました。<br />
なのでジョイントのアトリビュートエディタの制限情報でスケールに制限をかけてあげましょう。<br />
<br />
これで完成です!!<br />
<br />
<br />
<br />
+αとして制限を流動的にコントロールしたい方はクランプノードを<br />
ググってみると良いと思います。<br />
<br />
あと、IK splineでストレッチIKを作る方法もあります。<br />
これは調べると何人か書かれていたので ストレッチIK とかでググってみてください。<br />
<br />
<br />
<br />
<br />
今回も分かりにくくなってしまった気が・・・<br />
まぁ質問などあったらコメントください。<br />
<br />
とまぁ長くなりましたがこんな感じです。<br />
しかしこの方法以外にもストレッチIKを作る方法は<br />
いくつかあるので時間のある方は調べてみてはいかがでしょうか。Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com1tag:blogger.com,1999:blog-1854526766521735172.post-5975363178826401672013-03-19T10:52:00.001+09:002013-03-19T10:52:15.121+09:00コンストレインとコネクションの違いについて最近ちょっと忙しいのでさらっと基礎的なとこを・・・<br />
<br />
今回は、コンストレインとコネクションの違いについて書きたいと思います。<br />
<br />
<br />
これはあくまで私のイメージとしてのものなので<br />
必ずしも正しい訳ではないと思います。<br />
<br />
<br />
<br />
前回の記事等で、ノードのコネクションについて書いたりしてきましたが<br />
コンストレインとは何が違うのでしょうか。<br />
<br />
例えば、translate(移動)同士をコネクションするのと<br />
ポイントコンストレインするのとでは<br />
ぱっと見同じ様な気がします。<br />
<br />
しかし、それぞれ一長一短で良さと悪さがあります。<br />
その中でもセットアップで一番重要だと思う違いがあります。<br />
<br />
<br />
コンストレイン<br />
・全てWorldで制御される<br />
<br />
コネクション<br />
・全てコネクション元の値で制御される<br />
<br />
このように制御の仕方が変わります。<br />
<br />
<br />
実際、どのように違いが出るかというと<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnmc-R9Y2OdS0qih24u9LNocjWewBE0CF9zOq0OX28JnUKYZndRfIXYxeGRXnHfc6GzUABr2BxuPZA8VTbLP-aZTD0RPwA0ean98ww8YfmD7HIpP9fCHWGWTi1lv89NYD3ijbSRVoNloMJ/s1600/shot.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnmc-R9Y2OdS0qih24u9LNocjWewBE0CF9zOq0OX28JnUKYZndRfIXYxeGRXnHfc6GzUABr2BxuPZA8VTbLP-aZTD0RPwA0ean98ww8YfmD7HIpP9fCHWGWTi1lv89NYD3ijbSRVoNloMJ/s1600/shot.png" height="303" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
このようにオブジェクト赤、青があり<br />
上がポイントコンストレイン<br />
下がtranslateコネクション<br />
となっています。<br />
<br />
この状態で2つの青を動かすと2つの赤も動きます。<br />
<br />
では、次に青をそれぞれグループ化して上に一つ階層を作ります。<br />
そしてそれぞれの青のグループを動かすと<br />
上の赤は先ほどと同じく動きますが、下の赤は動きません。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFQwSMjYvhig0VKmpaHzUgEvpsvl9Y8oeNpVh6qPhi_KzAnu7mYQgHKAxoO29O6pOMQT9_lQo3ohyWXU2_DVTQxENkHmfOeg29qJgKCaX6O4xLRlRaYXWDY6FLXqVT1oxt2k-FEbGEbX2V/s1600/shot.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFQwSMjYvhig0VKmpaHzUgEvpsvl9Y8oeNpVh6qPhi_KzAnu7mYQgHKAxoO29O6pOMQT9_lQo3ohyWXU2_DVTQxENkHmfOeg29qJgKCaX6O4xLRlRaYXWDY6FLXqVT1oxt2k-FEbGEbX2V/s1600/shot.png" height="291" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
これが上で書いた違いです。<br />
<br />
これはコンストレインは全てWorldで制御されるため<br />
上の階層のグループが移動するとコンストレインされた赤も動きます。<br />
<br />
反対にコネクションは、全てコネクション元の値で制御されるため<br />
上の階層のグループには値が入っていますが<br />
コネクションした青本体には値が入っていない為動きません。<br />
<br />
<br />
<br />
これだけだと『なんだコンストレインのほうが優秀じゃないか』と思うかもしれません。<br />
しかし、セットアップを行う上で絶対やってはいけないサイクルエラーを<br />
引き起こしやすいという難点があります。<br />
<br />
<br />
サイクルエラーとは皆さんも一度は目にしたことがあると思います。<br />
<br />
<br />
// 警告: 'pSphere2.translateX' のサイクルは要求どおり評価しない可能性があります(この警告を無効にするには 'cycleCheck -e off' を使用します)。 // <br />
<br />
こんな感じの警告のことです。<br />
<br />
これはAがBを制御するようになっているにもかかわらず<br />
BもAを制御するようになっていて<br />
無限ループのようなサイクルが出てますよー<br />
ってことを言ってます。<br />
<br />
<br />
コンストレインはどの階層にいても影響を与えてしまいます。<br />
コネクションはコネクション元の値のみで制御されます。<br />
<br />
つまり、コンストレインの方が複雑に組みたい時や階層ごと制御したい時に<br />
とっっっっても不便です。<br />
<br />
そもそもコンストレインはコンストレインノードでオブジェクト同士を<br />
繋いでいるのですが、たくさんつながっていて処理的には<br />
単純にコネクションした方が断然軽いです。<br />
<br />
<br />
そういう意味では単純なコネクションの方が優秀だと思います。<br />
<br />
<br />
<br />
<br />
更に、コネクションでWorldの動きをさせることもできます。<br />
まぁでもこの辺はMatrixとかが関わってきて解説がめんどくさくなるので<br />
decomposematrix node とかをググってみたらいいと思います。<br />
<br />
ただ、配列とか行列とかややこしいので根気のある人や頭の良い人はどうぞ。<br />
ではでは。<br />
<br />
Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com1tag:blogger.com,1999:blog-1854526766521735172.post-65526105507354399342013-03-16T22:29:00.003+09:002013-03-16T22:29:53.334+09:00手首の回転を振り分ける今回は、手首の回転についてです。<br />
<br />
手首には曲がりにくい方向があります。<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG1FNEdV0j5C3stsDhj4OaSessoW8NYJKPlEFx56W2LeEmEGtEB9P_VeqJg5RWpL0PhmekHY5sgEdnax9bUDFeYrxpWrFwjgTr1fW2SXeEa-rebxa1qKmQuubIobS-D02j93ezz_plFLAj/s1600/shot2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG1FNEdV0j5C3stsDhj4OaSessoW8NYJKPlEFx56W2LeEmEGtEB9P_VeqJg5RWpL0PhmekHY5sgEdnax9bUDFeYrxpWrFwjgTr1fW2SXeEa-rebxa1qKmQuubIobS-D02j93ezz_plFLAj/s1600/shot2.png" height="170" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
この図で言うと、YやZには回転しやすいですがX方向には曲がりにくいです。<br />
試しに皆さんも手首のやや手前を固定した状態でぐるぐるしてみてください。<br />
<br />
<br />
<br />
これは人間の骨の構造上曲がりにくいのです。<br />
ですが、私達は普段Z方向に物をひねったりしますよね?<br />
例えば、ドアノブを回す時とか・・・<br />
<br />
その時は肘から手首に伸びる2本の骨がねじれるようにして曲がっているんです。<br />
イメージつきにくい人は人体の構造や運動学なんか調べてみると良いかもしれません。<br />
<br />
<br />
つまり、バインド的な問題で言うと<br />
手首の部分は↑のX方向だけ腕の部分も追従して欲しい訳です。<br />
<br />
<br />
という訳で、今回は疑似的に手首の回転を肘と手首の真ん中くらい(Roll bone)にも振り分けよう<br />
ということです。<br />
<br />
<br />
<br />
今回は腕の部分はIKの制御のみで行うとします。<br />
<br />
<br />
<br />
さて、前回からの記事にも書きましたがIK handleが入っていると<br />
ジョイントの回転値が固定されてしまいます。<br />
<br />
そこで、こんなTips<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKDXTi8oxScXxLnGip775tKPg-SIfX6_TujFMEf_-C7lfL8BEbE0uwa3z1aJB0_KFaWn0d8PaQGPh1Zm-eL8MpZr_hLLWi3KL7JUl_j-cGVhIYG-cUp1MdfBupZIi17O5OZAVEy0vYmOmD/s1600/shot.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKDXTi8oxScXxLnGip775tKPg-SIfX6_TujFMEf_-C7lfL8BEbE0uwa3z1aJB0_KFaWn0d8PaQGPh1Zm-eL8MpZr_hLLWi3KL7JUl_j-cGVhIYG-cUp1MdfBupZIi17O5OZAVEy0vYmOmD/s1600/shot.png" height="162" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
まずはこんな感じにジョイントを配置します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsYdluHRIzyxrrMgxTmnIhNhirggYDThfneWR8eUDkcybJe5Yf74GAKrSh_-kLv1CmEzFAWlMAzQPIL8hn6Ucav7j4R0w3bx_qVOwR5GL3Xxz1B_n2h2tmcmAUs5_Qtzm3ZV7bAhSnIxIM/s1600/shot2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsYdluHRIzyxrrMgxTmnIhNhirggYDThfneWR8eUDkcybJe5Yf74GAKrSh_-kLv1CmEzFAWlMAzQPIL8hn6Ucav7j4R0w3bx_qVOwR5GL3Xxz1B_n2h2tmcmAUs5_Qtzm3ZV7bAhSnIxIM/s1600/shot2.png" height="160" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
そして、ロールボーンまでIK handleをいれます。<br />
次にハイパーグラフを開きます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8daKbqADVmZ3CZk2hAHgPKk2CScGtvO-rkE_KYDcJtIiEcYTkXcTM7JbtgIzoGQkla15PKV9Qdy77DC1POdGtP7KNZ6icRV1jdQ9u2_fkqsS6mSxCRK2US31JXzf9du3GQ4WjOTciTBhc/s1600/shot.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8daKbqADVmZ3CZk2hAHgPKk2CScGtvO-rkE_KYDcJtIiEcYTkXcTM7JbtgIzoGQkla15PKV9Qdy77DC1POdGtP7KNZ6icRV1jdQ9u2_fkqsS6mSxCRK2US31JXzf9du3GQ4WjOTciTBhc/s1600/shot.png" height="298" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
するとこのようにeffectorというものが出来ていると思います。<br />
これを選択し、UI上でinsertキーを押します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrwytu5orC74Kndm-YxyT1THPAYEM1h5st0FRsRcAPdQkldnkLlAea-K_5VEkXYC2seSQJALzdNwwNbe68YY9Q74IHkDBRTFebkL55iPDKfPew1URusQqpgDvXV9JmcxSSoDwTFxWkzQcv/s1600/shot.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrwytu5orC74Kndm-YxyT1THPAYEM1h5st0FRsRcAPdQkldnkLlAea-K_5VEkXYC2seSQJALzdNwwNbe68YY9Q74IHkDBRTFebkL55iPDKfPew1URusQqpgDvXV9JmcxSSoDwTFxWkzQcv/s1600/shot.png" height="159" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Vキーを押しながら、手首までスナップさせます。<br />
<br />
すると、IK自体はロールボーンまでしか入れてないのに<br />
手首までIKが入ったような動きをしてくれます。<br />
<br />
これでロールボーンと手首は自由に回転値を入れることが出来ます。<br />
<br />
<br />
後はカンタン!<br />
<br />
前回の記事のようにコネクションします。<br />
<br />
手首のrigのrotateXをロールボーンのrotateXに、<br />
手首のrigのrotateYとrotateZを手首に入れましょう。<br />
<br />
<br />
これで、疑似的に手首の回転を作る事が出来ました!!Takayuki Yanagisawahttp://www.blogger.com/profile/17557860587831501270noreply@blogger.com1