チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第61回:UVを垂直に回転してみよう!
- Maya
- ゲーム
- コラム
- チュートリアル
- マテリアル・シェーダー・UV
- 中級者
- 学生・初心者
- 教育
- 映画・TV
味も素っ気もないタイトルですが、つまり
といったように、微妙に回転しているUVを垂直したいことが多々あると思います。
お客様と話していてそんな話題になったのですが、確かにMayaにはそれ用のツールがありません。
複雑そうなツールでも、スクリプトならデザイナーでも簡単に作れます。しかも費用対効果が高いことも多いので、DIYというか、メイカーズなノリで作ってみましょう。
それほど長いコードにならないので、出来上がったものを始めにご紹介すると、こんな感じになります。
global proc rotateAlignUV() { string $uvs[] = `ls -orderedSelection`; float $uvValues[] = `polyEditUV -q $uvs`; float $uv1[] = {$uvValues[0], $uvValues[1], 0.0}; // ピボット float $uv2[] = {$uvValues[2], $uvValues[3], 0.0}; float $alignDir[] = { 0.0, 1.0, 0.0 }; // 垂直 float $currentDir[] = { $uv2[0] - $uv1[0], $uv2[1] - $uv1[1], 0.0 }; float $angle[] = `angleBetween -euler -vector1 $alignDir[0] $alignDir[1] $alignDir[2] -vector2 $currentDir[0] $currentDir[1] $currentDir[2]`; polyEditUVShell -pu $uv1[0] -pv $uv1[1] -a (-1.0 * $angle[2]); }
では順に内容を見ていきましょう。
ツールのデザイン
まずは垂直にしたい部分の指定する方法を考えます。
普通はエッジを選択して実行、という方法が思い浮かびます。選択したエッジが垂直になるようにUVを回転させる、という動作です。
ただし、次のようなメッシュでは垂直なエッジがありません。そのためエッジで垂直方向を指定することが不可能です。 選択したUVが垂直になる、とすれば上手くいきますので今回はUVを指定する方法にします。
2つのUVを選択して、それらが垂直になるようにします。はじめに選択したUVをピボットにして回転します。
特別なオプション設定を用意しなくても、選択したものの内容でユーザーの指示を多く受け付けるデザインにすることが重要です。Mayaっぽくなります。
ツールの実行方法は次の通りにします。
1. ピボットとなるUVを選択。
2. UVをもう一つ追加で選択。
3. スクリプトエディタでrotateAlignUV()を実行。選択している2つのUVが垂直になるように、UVシェルが回転する。
実行すると次の図のように、選択したUV間が垂直になるように黄色の線の分回転します。
選択とUV値の取得
ではコードを見ていきたいと思います。
string $uvs[] = `ls -orderedSelection`; float $uvValues[] = `polyEditUV -q $uvs`; float $uv1[] = {$uvValues[0], $uvValues[1], 0.0}; // ピボット float $uv2[] = {$uvValues[2], $uvValues[3], 0.0};
ls –orderedSelection で選択しているUVを「選択した順」で取得します。
注意点としては、Preferences > Selection > Track selection orderをオンにしないと-orderedSelectionが有効に働かない点です。
パフォーマンス向上のため、通常はTrack selection orderがオフになっており、選択順を記録しないようになっています。
このツールを使うときは、Track selection orderをオンにしておきます。
polyEditUV –q $uvs でUV値を取り、$uv1と$uv2に入れておきます。
垂直にするための角度の取得
UV値を元に垂直に回転させるために、何度回転させればよいか計算します。
私よりも中学生や高校生に計算方法を聞いていただいた方が的確に答えてもらえそうな気がしますが、MELにも簡単に角度を計算するコマンドがありますので、それを使いましょう:)
float $alignDir[] = { 0.0, 1.0, 0.0 }; // 垂直 float $currentDir[] = { $uv2[0] - $uv1[0], $uv2[1] - $uv1[1], 0.0 }; float $angle[] = `angleBetween -euler -vector1 $alignDir[0] $alignDir[1] $alignDir[2] -vector2 $currentDir[0] $currentDir[1] $currentDir[2]`; polyEditUVShell -pu $uv1[0] -pv $uv1[1] -a (-1.0 * $angle[2]);
$alignDirと$currentDirに、UVを合わせたい軸方向と選択しているUVの方向を入れます。
{0.0, 1.0, 0.0}という様に、xyzで値を入れます。UV値ですので、xyがuvということになります。UVにはzがないですが角度を出すコマンドには三軸の座標値が必要なので、とりあえず0を入れておきます。
angleBetweenコマンドで角度をはじき出せます。
-eulerを指定すると角度がxyz値で返ってきます。-vector1と-vector2にそれぞれの方向を指定すると、差分の角度がxyzで返ってきます。ここではzに入っている角度を使用します。
polyEditUVShellコマンドを実行すると、現在選択しているUVのシェルを回転できます。
-pu/-pvにピボットとなるUV値を指定します。-aに回転させたい角度を指定します。
angleBetweenで出した角度は垂直方向とUV方向の差分です。この差分をなくすことでUVが垂直になりますので、-1.0をかけて角度を反転させた値を、回転させたい角度とします。
MELコマンドがスクリプト言語らしく、一行でややこしいことをすべて行ってくれますので、これだけでツールが完成です!
機能拡張
このコードでは垂直方向にUVを回転させますが、$alignDirで指定しているUV軸方向を変えれば、好きな方向にUVを向けられます。
たとえば{1.0, 0.0, 0.0}にすると、UVが水平になるように回転出来ます。
関数の引数で何かしらそういった方向の指定を行えるようにすれば、ボタンをクリックするだけで欲しい方向に回転させるツールが出来上がります。
他にも、polyEditUVShellで一つ目に選択したUVの位置をピボットとして指定していますが、UVシェルの中心をピボットとなるようにするとどうでしょうか?現在のUVの位置を大体保ちながら回転してくれるようになります。
背景のUVレイアウトをしているとして、UVのLayoutでUVをざっと並べた後、個々のUVを正確に水平垂直にするのに、現在のUVの位置を保ちながら回転できればレイアウトを崩さずにUVを慣らしていけるので、より快適に使えそうです。
まとめ
基本的なUV周りのツールはある程度そろっていますが、プロフェッショナルレベルで使用するには更にツールがあると便利です。
たくさんフリーのツールがありますので、それらをダウンロードして使用するのも良いですが、今回のツールのように思ったよりも簡単に欲しい機能が作れたりします。
もちろんUV編集に必要な計算やMayaへの指示を行うコマンドが、あるのかどれなのかを考える手間がありますが、一度作ったツールの応用で様々なツールを作れるようになります。
MELはちょっとした知識の積み上げですので、ぜひ普段から思っている「あったらいいな」というツールをMELで実現してみてください。