2012年6月15日金曜日

Metasequoia Ver3.1 Beta3

Beta2から何日も経っていませんが、さらにベータ版を更新しました。

今回の改良点はまず曲面タイプ1/2でもスムージング表示・ワイヤー表示ができるようになりました。また、材質のプロパティに両面表示が追加され、表裏で2枚ポリゴンを作成しなくても両面オブジェクトを用意できるようになりました。どちらも10年以上前から要望が上がっていましたが、ようやく対応することができました。

機能面ではこれくらいですが、あとSDKも併せて更新です。仕様変更になっている点など詳細はBBSのほうに書きます。

今回はSDK絡みがあったのでスパンが短くなりましたが、次はちょっと間を空けます。正式公開まで大きな変更はもうしないかもしれません。

最近買った洋書

コンピュータグラフィクス関連の洋書もゲーム寄りのものだと割と日本語で紹介しているブログ(例えばshader.jpとか)を見かけますが、形状処理の方面になるとほとんど見当たらないですね。以前自分が買った本を再度調べてみたら、自分のブログしか引っかからなかったり。

そんな自分が買う洋書はほとんどの方には関心がないとは思うのですが、全国でたとえ数人でもいれば多少なりとも意味があるかもしれないので、せっかくなので紹介します。

Introduction to the Mathematics of Subdivision Surfaces

タイトル通り、サブディビジョンサーフェスについて数学的な面から追及した内容となっています。ひたすら数式がならんでいるページも多くて、曲率とかに言及した論文を書くならこれくらい理解しとけ、という感じなのかもしれませんが、道具として使うだけならそんなに細かいことわかってなくてもいい気がします。残念ながら自分にはついていけない内容でした。 Semi-creaseのような派生形のものについては紹介くらいしか載せていないので、突き詰める方には逆に物足りないかもしれません。


Advanced Methods in Computer Graphics: With Examples in OpenGL

CGアルゴリズムの入門書程度は一通り理解している中級者の方に特にお勧めです。入門書には出てこない一歩進んだ内容がメインとなっています。例えばQuaternionくらいは入門書に載っているものとないものがありますが、この本だったらDual quaternionまで言及していたり、あとサブディビジョンサーフェスもCatmull-ClarkやLoopだけでなくsqrt(3)まで載せていたりなど、入門書にはない掘り下げが評価できます。ただ約300ページという制約上、それ以上の内容はないので、業務や研究で本気で取り組んでいる人には物足りないという点で、やはり中級者向けかなと思います。

サンプルプログラムもWebからダウンロードできるようになっているのは嬉しい点です。副題にOpenGLと書いてますが、単にglutを使っているだけで、アルゴリズムの理解のためにOpenGLの知識が必要というほどではないです。

これくらいの本が日本語でも出てくれればと思わずにはいられません。

2012年6月9日土曜日

Ver3.1 Beta2用SDK

Ver3.1 Beta2の公開に合わせてSDKも更新しました。Beta1とはバイナリレベルで互換性がないので、新しいSDKでビルドしなおしてください。

今回のSDKでは頂点だけでなく、オブジェクト・面・材質にもユーザーデータを割り当てることができます。使用方法は頂点とまったく同じなので、説明するまでもないでしょう。ただ、頂点を含めて今の仕様でいいかというと微妙なので、今後のβで仕様の見直しは行うと思います。

あとついでにCatmull-Clark用のエッジの先鋭化情報の入出力のAPIも追加しています。

Metasequoia Ver3.1 Beta2 公開

Ver3.1 Beta2を公開しました。

まず前回のβから仕様変更になっている点について。グレースケール画像を凸凹マップに読み込んだときに法線マップには変換せず、ペイントパネル上でそのまま表示・修正できるようになりました。当然ペイントコマンドを使って3D上で直接ペイントすることもできます。法線マップに変換したい場合はペイントパネルのメニューからです。

それから新機能の紹介です。Catmull-Clark曲面のエッジに対して先鋭にするかどうかを指定できるようになりました。辺を選択してから[曲面にエッジをつける・消す(Catmull-Clark)]メニューを呼び出すか、[ウェイト]コマンドで辺をクリックすると、下図の右側の面のようにくっきりとした折れ目をつけることができます。

曲面化すると滑らかになりすぎて困ることがありましたが、この機能によってメカや工業製品のようなものにもCatmull-Clark曲面を利用できるようになり、モデリングの自由度がかなり上がるものと思います。

また、隣に共有する面がなくて辺が開いている場合も同様の処理が行われるよう変更されています。この場合は、逆に以前のバージョンと同じにすることはできませんのでご注意を。

さらにCatmull-Clark曲面にはもう一つ改良が加えられています。オブジェクトの設定に[三角形を保持]が追加されました。従来のものと切り替えて新しい分割アルゴリズムを使用することができます。

左側が従来通りのもの、そして右側が新たに可能になった四角形と三角形が混在したCatmull-Clark曲面です。オリジナルのメッシュで三角形になっているところがさらに細かい三角形に分割されていることがわかるでしょうか。

三角形のままで分割して何の意味があるの?と思われる方もいらっしゃるかもしれませんが、1つ目のメリットとして、三角形が分割された後の(三角形換算での)面数が少なくなります。分割レベルを1段階上げたとき、従来だと3つの四角形=6つの三角形に分割されていたのが、新しい手法では4つの三角形で済みます。

そして2つ目のメリットは四角形と三角形が混在したオブジェクトに対して、より滑らかな曲面を得られるということです。


円筒をそのまま曲面化しただけですが、左側の従来のものは四角形と三角形の境界となる付近の表面がわずかにでこぼこしているため、スペキュラハイライトが一か所に定まらずにいるのがわかります。一方、右側の新しいアルゴリズムでは表面が滑らかなため、非常に美しいハイライトが得られています。このようにわずかなゆがみによって生じる問題が解決されているのです。

今回のβでは三角形の保持は従来通りのOFFがデフォルトですが、ONにしてもいいかもという気がします。どちらがいいか、意見があればコメントください。

他にもオブジェクトパネル回りがBeta1からさらに強化され、より使いやすくなっています。また、DirectX 11のランタイムがなくてもエラーが出ないようにしています(どのみちDirectX 11はVer3.1では対応しません)。β版のため日常使用はお勧めしませんが、新しい機能をぜひ一度体験してください。

2012年6月7日木曜日

twitter始めました

twitterのアカウント作りました。アカウント名は metaseq3d です。このブログの右側にもツイート内容が表示されるようにしました。

まだテスト投稿以外何も書いていませんが、開発途中のあれこれだとかブログに書くまでもないことを投稿するかもしれません。

ブログが更新されたらtwitterにも自動投稿されるようにしてみたのですが、まだ動作確認していなくてぶっつけ本番なので、この投稿はちゃんと反映されるかな?

2012年6月6日水曜日

Pythonスクリプト講座

前の記事のコメントにオブジェクトが使用している材質が知りたいというのがあったので、これを調べるPythonスクリプトを作ってみました。

下のコードをスクリプトエディタ内にコピーして実行してみてください。使用している材質の名前がスクリプトエディタ下側のログに出力されます。(コード上をダブルクリックしてからCtrl+Cでコピーすると改行も保持されるようです。ペースト後、最後の行に改行を入れてから[EOF]が行の先頭にくるようにして実行してください)

# Check materials used in the current object
doc = MQSystem.getDocument()
obj = doc.object[doc.currentObjectIndex]

nm = doc.numMaterial
uselist = [0] * nm
nonmat = 0

nf = obj.numFace
for x in range(0,nf):
    if obj.face[x].numVertex >= 0:
        if obj.face[x].material >= 0:
            uselist[obj.face[x].material] += 1
        else:
            nonmat += 1

MQSystem.println("Used materials in the current object:")
for x in range(0,nm):
    if uselist[x] > 0:
        MQSystem.println("  " + doc.material[x].name)
if nonmat > 0:
    MQSystem.println("  non-material")


さて、プログラム経験のない人だとこのコードを見ただけでどうなっているのかさっぱり、と思われるかもしれませんが、基本的な文法だけでも理解してしまえばスクリプトはそんなに難しくありません。

Pythonは1行ごとに処理が行われるので、1行ずつ順に見ていけばわかるということです。

まず1行目は単なるコメントです。先頭に#がついているので、その行は内容を解説するだけで処理としては特に意味のないものとなります。

2行目ではMQSystem.getDocument()でドキュメントを取得し、左辺にあるdoc変数に格納します。Pythonでは新しい変数を使うときに前もって宣言する必要はありません。いきなり使用できます。

3行目でそのドキュメント内にあるカレントオブジェクトを取得しています。doc.currentObjectIndexはオブジェクトの番号で、doc.object[番号]の形式で記述するとその番号に該当するオブジェクトが取得されます。取得したオブジェクトは左辺のobj変数に格納します。

4行目は見やすくするための単なる改行で、特に意味はありません。

5行目では材質の数を取得し、nm変数に代入しています。6行目ではuselistに中身がすべて0のnm個の数値のリストを生成しています。このuselistはどの材質が何個の面で使用されたかを調べるために後で使用します。7行目は未着色面、つまりどの材質も割り当てられていない面の数を調べるための変数nonmatを初期化しています。

9行目で変数nmにオブジェクト内の面の数を代入し、10行目のfor文でその個数分だけ処理を繰り返すことを指定します。以降の繰り替し処理はタブで字下げ(インデント)を行います。変数xは0から始まり、処理が繰り返されるごとに変数xの値が1つずつ増えていきます。xがnmと同じ数になるまで繰り返されます。

11行のif文ではx番目の面が使用する頂点数を調べます。obj.face[x].numVertexの値が0個の場合、その面は既に削除されたことになるので、0より大きい場合のみ以降の処理を行います。

12行目ではx番目の面が使用している材質の番号を調べます。obj.face[x].materialの値が0以上の場合は13行目でuselistリスト内のその番号に該当する数値を1つ増やします。これにより、どの材質が何個の面で使用されているかが把握できるようになります。

面が未着色面の場合はobj.face[x].materialが-1になるので、14行目のelse:以降に書かれた処理が行われることになり、15行目でnonmat変数の数値を1つ増やします。

17行目では字下げが行われていないので、上のif文もfor文からも抜けたことになります。for文の繰り返し処理が終わってからこの行の処理が行われます。MQSystem.printlnを実行すると、括弧内に記載された文字列がログに出力されます。

18行は繰り返し処理のfor文です。材質の個数分だけ以降の処理を行います。 19行目でuselist[x]の個数を調べます。x番目の材質が割り当てられている面の数が0より大きい場合、20行目でその材質の名前をログに出力します。

21行はfor文の繰り返しが終わって、次は未着色面の数を調べます。nonmat変数が0より大きければ、22行目で文字列"non-material"をログ出力します。


以上でスクリプトの処理は終了です。既存のスクリプトを何も考えずにそのまま実行するだけでもいいのですが、1行1行をちゃんと理解していけばスクリプトは決して難しくありません。既存のスクリプトを改良しながら理解を進めていけば、ちょっとした処理くらいは自分で書けるようになります。そうなるとツールの使い勝手が大きく上がることもあるので、最初覚えるのが面倒でも決して損することはありません。Scriptsフォルダにはいくつかサンプルのスクリプトが入っているので、それも参考にするといいと思います。