ON-BLOG

CGのこと、あれこれ書いてます。

【覚書】maya python入門 其の六

続いて少しだけ数学をしたいと思います。
やっぱりスクリプトやるとなると、この辺り補っていかないと
後々苦労したり、無駄が増えてしまうので…

と書きつつ詳しい事は説明しません。
※できません汗

なので、コード見つつこんな事ができるんだ…。
程度で進めていければ、幸いです。

ってことでまずは、三角関数を使って
球を円状に配置したいと思います。
コード

import maya.cmds as cmds
import math
num = 60
radius = 6

for i in range(num):
    Cir = 2.0 * math.pi * i / num
    x = radius * math.sin(Cir)
    z = radius * math.cos(Cir)
    cmds.polySphere(r=0.5)
    cmds.move(x,0.0,z)

f:id:tommy_on:20150630151612p:plain

こんな感じになります。
「num」が球の総数で、
radius」が半径ですね。

円を描いているところは
実質この部分

 Cir = 2.0 * math.pi * i / num
    x = radius * math.sin(Cir)
    z = radius * math.cos(Cir)

一行目で、円周と総数を割って、一個辺りの角度を求め
2,3行目で縦、横の長さ(比率)を取得し、その値でXYに値を代入しています。

原理が分かれば、超簡単なんですが、高校数学を挫折していた人間からすると
相当悩みました。
今でもまだ理解仕切ってません。

ただ、そういうものだ。と思えばとりあえずはいいじゃないでしょうか?
原理が分かれば、多種多様に使えるので覚えた方がいいですが・・・・


さておき、次は上記2Dだったので、3Dにしてみようかと思います。
なので、少しだけいじって螺旋をしてみました。

import maya.cmds as cmds
import math
num = 60
radius = 6

for i in range(num):
    Cir = 2.0 * math.pi * i / num
    x = radius * math.sin(Cir)
    z = radius * math.cos(Cir)
    y = i
    cmds.polySphere(r=0.5)
    cmds.move(x,y,z)

f:id:tommy_on:20150630151722p:plain

ほとんど上と変わってないです。
Y(高さ)の値に1ずつ増える値を入れているだけです。
少しの違いで結構な差がでるのは、触ってて面白いですよね。



さて次は折角三角関数を使ってるので、それをエクスプレッションに仕込んでみたいと思います。
ちょうどWEBに似たような奴があったので、簡単にカスタムしてみました。

import maya.cmds

num = 10
for i in range(0, num):
    name = maya.cmds.polySphere()
    maya.cmds.move(i * 2, i * 2, 0)
    val = i * 0.5
    maya.cmds.expression(object=name[0], string=('ty = 3 * sin(time + ' + str(val) + ');'))

f:id:tommy_on:20150630151811g:plain
ほとんど変えてませんw
コピペだけはしてませんが。

思ったですが、エクスプレッションMAYAは、編集し易いですね。。。
めちゃくちゃびっくりしました。


では、軽く説明。

maya.cmds.expression(object=name[0], string=('ty = 3 * sin(time + ' + str(val) + ');'))

作成した、オブジェクトに対して、「トランスYにサインカーブ」のエクスプレッション仕込む。
という内容ですね。
特に難しい事はないかな?と思います。

そいや、謎というか、MAYAの仕様というか
エクスプレッション自体はMELで記述しなければいけません。
※微妙にPythonの書き方とは違いますよね?

なので、基本MEL文法になるように、且つ仕込む場合は文字列として記載しなければならないので
「string=()」でMEL記述を文字列にしております。
この辺り少しややこしいので、注意が必要です。
仕込まれたデータを見るとこんな感じですね。
f:id:tommy_on:20150630151918p:plain

うん。MELですねw
ちなみにエクスプレッションのエディタは、アトリビュートのトランスフォーム(挿入されているノード)
で右クリックで、出ますね。



では続けてもう一個。
2個目のスクリプトをエクスプレッションにしたものですね。

import maya.cmds as cmds
import math
num = 150
radius = 3

for i in range(num):
    Cir = 2.0 * math.pi * i / num
    x = radius * math.sin(Cir)
    z = radius * math.cos(Cir)
    y = i
    oObj = cmds.polySphere(r=0.5)
    cmds.expression(s=(oObj[0]+'.tx = '+ str(radius) +' * cos(time + ' + str(Cir) + ');'))
    cmds.expression(s=(oObj[0]+'.ty = time + ' + str(y) + ';'))
    cmds.expression(s=(oObj[0]+'.tz = '+ str(radius) +' * sin(time + ' + str(Cir) + ');'))

f:id:tommy_on:20150630152021g:plain

螺旋みたいな、龍みたいな。
今回はエクスプレッションののターゲットを直で指定しています。

cmds.expression(s=(oObj[0]+'.tx = '+ str(radius) +' * cos(time + ' + str(Cir) + ');'))

この方が兎に角楽です。。。。



あ、そいやさっきも使ってましたが、エクスプレッションに「time」を仕込むことで
タイムラインに沿った動きが可能となります。
詳しい事はこちらに譲ります。


最後にタンジェントも使ってみたかったので、こちらも
f:id:tommy_on:20150630152156g:plain
意図したものと少し離れてしまいましたが、まぁよしとします…
こんな感じで、色々出来たりします。
ちなみにグーグルさんで色々なカーブが見れるので参考に実行してみると
面白いかもですね笑




こんな感じでエクスプレッションも簡単にスクリプトから実行できるので
リグとかも使えそうですね。
ただ、内容がMELなのはイケテナイっす。
まぁ仕方ないですが・・


以上です。