ソラマメブログ

2008年05月15日

はじめに

このカテゴリで、我流ですがスカルプテッドプリム(sculpted primitive)について紹介 していこうと思います。

今あるネタは以下の通りです。他にも思いついたことがあれば追加していくつもりです。


ご注意
ここで紹介していく内容を参照された結果、いかなる問題が生じても、私は一切の 責任を持てません。
内容は、私が独自に調べたり試行錯誤した結果を反映したものになります。従いまして、 間違った思い込みに基づく場合があります。手順等に関してもより効率的な方法が存在 していると思われます。また、Linden側の変更等で無意味な内容になることもあるかと 思います。あらかじめご了承ください。

私がsculpted prim.作成をはじめたのは、スキンができて、次に何をしようかなと 考えていた2007年11月頃だったと思います。そんなとき、お友達がROKUROを教えて くれました。彼がROKURO Proの方を使っていたので、じゃ私も同じものがいいというだけの理由 でROKURO Proを購入しました。そこから、スカルプト制作がスタートしました。


これまでに作成したスカルプテッドプリムの一部です。 ブーツと般若面は2プリム、それ以外はすべて1プリムです。
他にもありますが、ここでお見せできるのはこの程度です^^

  


Posted by Ada Quinnell at 23:30Comments(0)TrackBack(0)私流スカルプテッド

2008年05月15日

使用ソフトと作業の流れ

私がいつも利用しているソフトウェアと作業の流れを説明します。


追記[08/05/31]: ROKURO Proが1.40に版数アップし、一部の処理が不要になりました。それに伴う修正を加えました。
 

使用ソフトウェア

ROKURO Pro (Ver1.37→1.40)
概形作りとWavefrontのOBJという3Dデータのexport/importに使っています。
今日現在の最新版はVer1.39のようです。ROKURO Proは有料です。
なお、機能拡張されたTATARAというソフトもあります。

自作OBJ変換ツール
OBJを変換します(後日紹介します)
Unix系で動作します。私はCygwin上で利用しています。
一部の機能は3DソフトやROKURO Pro/TATARAに含まれます。私が使っている3Dソフト や、当時のROKURO Proではできなかったため機能が重複しています。

Wings 3D (Rel:0.98.32a)
詳細な形の作り込みに使います。
同様なというか、もっと高機能なものにBlenderやMetasequoiaがありますが、 使っていません(Blenderは挫折済みなので薦められてもたぶん使わない^^)。 Metasequoiaは必要な機能がシェアウエア版にしかなかったので使ってません。
今日現在の最新版はRel:0.99.00bのようです。フリーソフトです。

GIMP (2.4.5)
テクスチャ(図形に貼る方)の作成に使っています。
たま~にPaint Shop Pro(有料)も使います。
GIMPはフリーソフトです。
BlenderやTATARAではテクスチャを出力することもできるようです。

 

作業の流れ

単純な図形はROKURO Proだけで済ませていますが、少し複雑だと3Dソフトで編集しています。 以下は3Dソフトを使う場合の基本的な作業の流れです。

        1.ROKURO Proで概形を作ります
        ↓
        2.ROKURO Proで、OBJをexportします。
        ↓
        3. Wings3Dで詳細を作りこみます。
        │  (ときどきフリーズするのでちょくちょく保存してます)
        ↓
        5. 形ができたらOBJ形式でexportします。
        ↓
        6. 形状によっては、変換ツールで左右反転します。 (変換が必要な形や理由は後日説明します)
        ↓
        7. 変換ツールでx,y,zを最大化します。
        │  SLに持ち込んだときの精度を上げるためです。
        ↓
        8.ROKURO ProでOBJを読み込みます
        ↓ 
        9. ROKURO Proでsculpt textureをTGA形式で出力します。
        ↓
        10. SLへsculpt textureをアップロード

 

左右対称といった、対称性のある図形の場合以下のようになります。基本は 上の流れですが、変換ツールが各所に出てきます。先の流れと異なる部分は 太字にしてあります。

        1.ROKURO Proで概形を作ります
        │  (対称形のときは変換ツールで処理するので部分的な整形のみ)
        ↓
        2.ROKURO Proで、OBJをexportします。
        ↓
        3.変換ツールで対称化等を行います。
        ↓
┌──→4. Wings3Dで詳細を作りこみます。
│      │   (対称形は変換ツールで処理するので部分的な整形のみ)
│      ↓
│      5. 適当なところでOBJ形式でexportします。
│      ↓
│      6.変換ツールで対称化等を行います。
│      ↓
│      7.Wings3DかROKURO ProへOBJ取り込んで形を確認します
│      │  (gnuplotを使うこともできます)
│      ↓
└───8. 満足なら9へ 不満なら4へ9. 形状によっては、変換ツールで左右反転します。 (変換が必要な形や理由は後日説明します)
        ↓
        10. 変換ツールでx,y,zを最大化します。
        │  SLに持ち込んだときの精度を上げるためです。
        │  * TATARAでもできるようです。
        ↓
        11.ROKURO ProでOBJを読み込みます
        ↓ 
        12. ROKURO Proでsculpt textureをTGA形式で出力します。
        ↓
        13. SLへsculpt textureをアップロード
ようするに、簡単には以下の通りです(<>内は何回か繰り返す)。
 ROKURO Pro → <変換ツール+Wings3D> → ROKURO Pro → sculpt texture

 

次にオブジェクトに貼るテクスチャ作成についての流れを説明します(大した事ないんですけど:p)。

  1. テクスチャとオブジェクトのマッピング
    編集するテクスチャとオブジェクトの位置関係を把握します。位置関係の確認には このmesh画像 を用いています。
    • ROKURO Proの場合
      最大化前のOBJをROKURO Proに取り込みます。ディフォルトで番号つきのmesh画像になって いますので、改めてmesh画像を貼る必要はありません。番号が判読できない場合などは 色で判別できることもあるので先のmeshを貼ることもあります。
    • SLに持ち込む場合
      まずSL内でオブジェクトをつくります。そこに先のmesh画像を貼ります。
    次にお絵かきソフトGIMPのレイヤーにmesh画像を取り込みます。これでオブジェクトとtextureを 対比しながら作業ができます。

    ただ、オブジェクトの拡大には、限度があり細かいところがあると番号が読み取れないことが あります。SLに持ち込んだ方が多少改善されます。

  2. テクスチャの描画
    オブジェクト上のmeshとレイヤー上のmeshを見ながらGIMPでtextureを描きます。
    適当なところで画像を保存します。

    GIMPの場合で、レイヤーを保存しておきたい(.xcf)場合などは、 "コピーを保存"がよいです。イメージ形式は、私の場合PNGを使っています(TGAよりも小さいから)。
    png保存時は、透過部分がなければ"背景色を保存"だけチェック、あればチェックを全部はずしてます。

  3. オブジェクト上で確認
    ROKURO Proでテクスチャを読み込んでオブジェクト上に貼ります。これで満足なら終了です。 不満であれば前に戻ってtextureを再度描きます。

  4. 完成
    できたらSLにアップロードしてオブジェクトに貼っておわりです。

以上文字ばっかりになってしましたが私流スカルプテッドプリムの作り方でした。 次回は実例を紹介します。

  


Posted by Ada Quinnell at 23:32Comments(0)TrackBack(0)私流スカルプテッド

2008年05月16日

作業の実施例

前回の記事で書いた作業の流れを実例を通して説明してみます。

猫脚つき1プリムバスタブ

上のバスタブを例に作業過程を見ていきます。

  まずROKURO Proで基本図形を作ります。今回はShapeからCapを選びました。

TOKOROTENタブで形を整えます。あとで対称化してしまうので赤枠の部分だけまじめに変更します。ちなみに、マゼンタの部分だけ移動してEdit→Optimizeで他の点も自動的に再配置されます。

ROKUROタブでバスタブらしく変形します。脚の部分はWings 3Dで変形するのでいい加減です(この形はいまいちでした:)。このあとWavefrontのOBJ形式で保存します。

Wings 3DにROKURO Proで保存したOBJをインポートしたところ。

対称化するので、丸で囲った1/4だけ真面目に編集。それなりの形ができました。これを一旦OBJ形式でexportします。

ここで自作変換ツール登場です。x軸に垂直なy-z平面で面対称にして、次にy軸に垂直な x-z平面で面対称にすると...
変換したOBJをimportしたところです。4つの脚が付いています。

次に、バスタブの形を整えます。 x-z平面で対称化するので、赤枠の部分だけ作りこんでいきます。

export後、変換ツールでx-z平面で対称化すると、それなりになりました。

これを、変換ツールで最大化して、ROKURO Proにとりこみ、sculpt textureをTGA形式で出力します。 SLにアップロードし、適当に大きさをかえていけば、冒頭のSnapshotような形になります。

続いてテクスチャを作ります。 ROKURO ProにWings 3Dで作った最大化前のOBJを読み込みます。meshを見ながら、GIMPでテクスチャを作っていきます。SLにアップした図形にmeshテクスチャを貼って、それを見ながら作ることもあります。今回は形がわりとシンプルなのでROKURO Proを使いました。

できあがったテクスチャです。脚の部分が多いです^^

テクスチャをROKURO PROに取り込んだところです。

テクスチャをSLにアップロードして貼り付ければおしまいです。 以上のようにしてこのバスタブはできたとさ。ざっと、3時間かかってます;;

  


Posted by Ada Quinnell at 00:24Comments(0)TrackBack(0)私流スカルプテッド

2008年05月17日

Wavefront OBJについて

Wavefront社のOBJフォーマットはさまざまな3Dツールで利用できます。フォーマット はアスキー形式です。ここでは、ROKURO Proがexport/importするOBJに 限定して話を進めます。 ROKURO Proが扱うOBJでは、vertex(頂点)とface(面)しか出てき ません。法線やらテクスチャ座標やら小難しいものは出てきません^^v

これからお話しする内容は私が独自に調べたものなので、思い込みで間違ったことを 書いているかもしれません。


追記[08/05/31]: ROKURO Proが1.40に版数アップし、OBJが変更されました(TATARA 3.0.59/NOMI 1.11 も同様な変更が行われています)。斜線の対処に対する変更です。 新しいOBJについて追記しました。
追記[08/05/25]: 頂点番号と図形のマッピングが間違ってましたので修正しました。また、面に関しての 注意事項を追記しました。

 

ROKURO Pro(1.37)で出力したOBJ
 

# Exported from ROKURO PROコメント
o AGARI_KANAE オブジェクト名
#994 vertices, 1024 faces コメント(頂点数,面数)
v 0.00000000 0.00000000 -1.00000000
v 0.09448819 0.00000000 -1.00000000
v 0.08267716 0.00681910 -1.00000000
...
v 0.02362205 -0.00454606 0.91666669
v 0.02755906 -0.00227303 0.91666669
v 0.00000000 0.00000000 1.00000000
頂点情報
上から第1,第2,...,第994頂点となります。
g AGARI_defaultグループ名
f 1// 3// 2//
f 1// 4// 3//
...
f 1// 33// 32//
f 1// 2// 33//
f 2// 3// 35// 34//
f 3// 4// 36// 35//
...
f 961// 930// 962// 993//
f 962// 963// 994//
f 963// 964// 994//
...
f 993// 962// 994//
面情報
1024の面が定義されています。

ROKURO Pro1.40以降は1984面が
定義されます。 全ての面が三角形になり
ますので、以下のようになります。
f 2// 3// 35// 34//
  ↓
f 2// 3// 35//
f 2// 35// 34//

OBJは頂点座標+頂点の接続関係(面情報)からなります。

 

頂点情報について

  • 書式
    v x座標 y座標 z座標
  • 頂点座標は、ROKURO Proでのsculpt texture作成のために(-1,-1,-1)~(1,1,1)の 範囲にある必要があります。
    OBJとしては、この範囲制約はありませんので、ROKURO Proに読ませる場合は注意が 必要です。はみ出した頂点がある場合、3Dソフトで縮めるか、OBJ変換ツールで縮め る必要があります。
    sculpt textureは色で座標を表します。x,y,z座標はR(ed)、G(reen)、B(lue)の各成 分で表現します。各成分は8bitの情報を持ちます。8bitなので0~255まで表現できま すが、0と255をそれぞれOBJの-1.0,1.0に対応させると0.0に相当する数値がなくなっ てしまいます。したがって、ROKURO Proでは0~254までの値を使ってOBJの-1~1の 値を表現しているようです。
  • 座標の向きがROKURO ProとOBJで若干異なります。
    ROKURO ProのBitmapタグを使って編集する場合、赤(x)成分、青(z)成分は、254,0が それぞれOBJの-1.0,1.0に相当します。緑(y)成分は、0,254がそれぞれOBJの-1.0,1.0 に相当します。Bitmapタグの色とsculpt textureを書き出すときの色とは異なります。
    Bitmapタグで少数の点を移動することはできますが、詳細を作りこむには私には 無い根気と気力と体力が必要です^^
  • 構成
    最初と最後の頂点がそれぞれ、Bitmapタグの最上・最下のラインに相当します。つま り、う~ん、つむじの部分。 あとは、32頂点毎がBitmapタグの各ラインに相当します。

 

面情報について

  • 書式 (<>は0回以上の繰り返し)
    f 頂点番号// 頂点番号//< 頂点番号//>
  • 頂点と面の関係

    右側のグレーの頂点番号は便宜的に書いてあります。実際の図形では繋がっているた めです。
    2番目~961番目(32頂点x30列=960頂点)の頂点は、隣、斜め下、下の頂点を指定する ことで面を構成する辺を定義していることがわります。
    1番目と962番目~993番目の頂点は、2辺で三角形を表現しています。 最後の994番目の頂点には面情報はありません。

    ROKURO Pro1.40以降 の新しいOBJでは下図のようになります。

以上を踏まえれば、簡単に変換ツールができることになります。頂点情報だけ入れ替えてあげればいろいろな変換が可能になります。

変換ツールについては次回紹介したいと思います。

 

おまけ
頂点とsculpt texture(64x64)の関係は以下の通りです。1番目と994番目は、それぞれ横一列の64セルが割り当てられています。それ以外は、4セルが割り当てられています。

11 11 11 ... 1 1
22 33 44 ... 33 33
22 33 44 ... 33 33
3434 3535 3636 ... 65 65
3434 3535 3636 ... 65 65
...
962962 963963 964964 ... 993 993
962962 963963 964964 ... 993 993
994994 994994 994994 ... 994 994

  


Posted by Ada Quinnell at 03:28Comments(0)TrackBack(0)私流スカルプテッド

2008年05月17日

自作OBJ変換ツール


追記[08/08/24]:ツールの配布を始めました。
追記[08/06/29]:頂点の変換手順を追加しました。
はじめにで紹介した作例には、 実は、ROKURO Proだけで作ったものはありません。 すべてのスカルプテッドプリムは自作変換ツールを利用しています。
初期作品の渦巻き一本うんちは、円錐をROKURO Proで作りましたが、その後はひたすらWings3Dで頂点を ずらしました。ずらしていったら歪な形に;; ... 考えました。なんとかしなきゃ、そだ、 OBJを直接変更しよう。で、OBJを見てたら 前述の通り意外とシンプル。ということで変換ツール作りが始まった次第です。 どこかで述べましたが、本ツール機能の一部はROKURO Pro/TATARA/3Dソフトに含まれます。だけど作っちゃったので 紹介します。

Windowsでのプログラミング経験はありません。そこで、使い慣れたツールを組み合わせ ることにしました。 私のマシンはCygwinが入っていますので、Unix系のコマンドが使えます。変換ツールは、 bshスクリプトでできています。座標変換はawkで行っています。

いないとは思いますが、ここで紹介するツールが必要な方は私までIM下さい。 返事が無いときはAFKしてるか、SL落ちてます:p パッケージしましたのでご自由にお持ちください。

 

動作環境

  • Windows + Cygwin
  • Unix系OS(Linux等) --- たぶん

機能一覧

今入れてある機能をとりあえず列挙します。一部のリンク先では、頂点変換手順を示しています。手順に出現するx[],y[],z[]は頂点座標を保持する配列で、要素1-994となります。前述のWavefront OBJについてで示した 第1頂点~第994頂点に相当します。
Erlangの使い方が分かればWings3Dのplugin化するんですが...教えてくれる人いないだろか(ぼそっ)

モード 説明
gpl_gen OBJをgnuplotで表示できる形式に変換します。
他のモード実行時もファイル名固定で作ります
tga64_gen OBJからTGA(64x64)を作ります(使いものにならず;;)
tga32_gen OBJからTGA(32x32)を作ります(使いものにならず;;)
magnify x,y,z方向に指定した倍率で拡大・縮小します。各軸別々の倍率指定可能です。
sculpt textureを変えながら変形する場合に有効です。
maximize OBJを(-1,-1,1)-(1,1,1)の範囲で最大になるように拡大します。
SLでの誤差を減らします。
grid -1~1を何等分するかを指定し、そのグリッドに頂点をずらします。
規定値は254でROKURO Proの作る色諧調と一致します。
radiation Z軸を中心とする放射線状に頂点をずらします。
(うんち作るとき使いました)
mirror 鏡像を作ります。面は指定できます。
後日説明する斜め線問題解決に有効です。
symmetry 面対称図形をつくります。対称面は指定できます
swap_xy x,y座標を入れ替えます(作った理由を忘れました:p)
half_rev 半分だけ座標を入れ替えます。cutモデルなようなものが作れます
reverse オブジェクトを裏返します
後日説明する内側編集に有効です。x,y,zの何れかの座標を符号反転するだけです。
rotation 指定した頂点数だけテクスチャをずらします
テクスチャの切れ目でdetailを描画したいとき、ずらせば描きやすくなります。
offset 指定しただけ各頂点を移動します。
analyze 座標の解析を行います。最大・最小座標を報告します。
clean 中間ファイルを消します。

  • gpl_gen
    gnuplotでOBJを表示することができます。

  • maximize
    オブジェクトを(-1,-1,-1)-(1,1,1)の範囲で最大化します。手前のグレーが最大化前、奥の赤が最大化後です。

  • mirror
    指定した面に対して鏡像をつくります。中央のグレーがオリジナルで、赤、緑、青 が、それぞれ、x,y,z軸を法線とする面で鏡像に変換したものです。

    変換手順:

    
        #yz平面でミラーする場合
        #xz平面の場合は変数xでなくyの符号を反転する
        #xx,yy,zzに処理後の座標が格納される(copyじゃなくswapすればよかったかも:p)
        xx[  1] = -x[  1]; yy[  1] = y[  1]; zz[  1] = z[  1];
        xx[994] = -x[994]; yy[994] = y[994]; zz[994] = z[994];
        for (i = 0; i < 31; i++) {
            for (j = 0; j < 32; j++) {
                p1 = 32 * i +2+j; p2 = 32 * i +33-j;
                    xx[p1]=-x[p2];yy[p1]=y[p2];zz[p1]=z[p2];
                }
            }
        }
        #xy平面でミラーする場合はループ処理を以下のようにする
        for (i = 0; i < 31; i++) {
            for (j = 0; j < 32; j++) {
                p1 = 32 * i +2+j; p2 = 32 * (30 - i) +2+j;
                xx[p1]=x[p2];yy[p1]=y[p2];zz[p1]=-z[p2];
            }
        }
    	

  • symmetry
    指定した面に面対称な図形に変換します。中央のグレーがオリジナルで、赤、緑、青 が、それぞれ、x,y,z軸を法線とする面で対称に変換したものです。

    変換手順:

    
        #yz平面で対称化する場合
        x[1] = 0.0; x[994] = 0.0;
        for (i = 0; i < 31; i++) {
            x[32 * i +10] = 0.0; x[32 * i +26] = 0.0;
            for (j = 0; j < 8; j++) {
                p1 = 32 * i +2+j; p2 = 32 * i +18-j;
                if ( axis == "X") { p3 = p1; p1 = p2; p2 = p3; } #対称化対象を反転
                x[p2]=-x[p1];y[p2]=y[p1];z[p2]=z[p1];
            }
            for (j = 1; j < 8; j++) {
                p1 = 32 * i +34-j; p2 = 32 * i +18+j;
                if ( axis == "X") { p3 = p1; p1 = p2; p2 = p3; } #対称化対象を反転
                x[p2]=-x[p1];y[p2]=y[p1];z[p2]=z[p1];
            }
        }
        #xz平面で対称化する場合
        y[1] = 0.0; y[994] = 0.0;
        for (i = 0; i < 31; i++) {
            y[32 * i +2] = 0.0; y[32 * i +18] = 0.0;
            for (j = 1; j < 16; j++) {
                p1 = 32 * i +2+j; p2 = 32 * i +34-j;
                if ( axis == "Y") { p3 = p1; p1 = p2; p2 = p3; } #対称化対象を反転
                x[p2]=x[p1];y[p2]=-y[p1];z[p2]=z[p1];
            }
        }
        #xy平面で対称化する場合
        x[1] = x[994]; y[1] = y[994]; z[1] = -z[994];
        for (i = 0; i < 15; i++) {
            for (j = 0; j < 32; j++) {
                p1 = 32 * (30-i) +2+j; p2 = 32 * i +2+j;
                if ( axis == "Z") { p3 = p1; p1 = p2; p2 = p3; } #対称化対象を反転
                x[p2]=x[p1];y[p2]=y[p1];z[p2]=-z[p1];
            }
        }
        for (j = 0; j < 32; j++) {
            z[32 * 15 +2+j] = 0;
        }
    	
  • half_rev
    指定した面に対して半分だけ折り返します。中央のグレーがオリジナルで、赤、緑、 青が、それぞれ、x,y,z軸方向に折り返したものです。

    変換手順:

    
        # x軸方向に折り返す場合
        for (i = 0; i < 31; i++) {
            for (j = 0; j < 8; j++) {
                p1 = 32 * i +2+j; p2 = 32 * i +18-j;
                x[p1]=x[p2];y[p1]=y[p2];z[p1]=z[p2];
            }
            for (j = 0; j < 7; j++) {
                p1 = 32 * i +33-j; p2 = 32 * i +19+j;
                x[p1]=x[p2];y[p1]=y[p2];z[p1]=z[p2];
            }
        }
        # y軸方向に折り返す場合
        for (i = 0; i < 31; i++) {
            for (j = 0; j < 15; j++) {
                p1 = 32 * i +3+j; p2 = 32 * i +33-j;
                x[p1]=x[p2];y[p1]=y[p2];z[p1]=z[p2];
            }
        }
        # z軸方向に折り返す場合
        z[994] = z[1];
        for (i = 0; i < 15; i++) {
            for (j = 0; j < 32; j++) {
                p1 = 32 * (30-i) +2+j; p2 = 32 * i +2+j;
                x[p1]=x[p2];y[p1]=y[p2];z[p1]=z[p2];
            }
        }
    	
  • rotation
    テクスチャをずらします。左がオリジナルで、右が8頂点分ずらしたものです。

    変換手順:

    
        #xx,yy,zzに処理後の座標が格納される
        #rotはずらし量(1-31)
        xx[  1] = x[  1]; yy[  1] = y[  1]; zz[  1] = z[  1];
        xx[994] = x[994]; yy[994] = y[994]; zz[994] = z[994];
        for (i = 0; i < 31; i++) {
            limit = 32 * i + 33;
            for (j = 0; j < 32; j++) {
                p1 = 32 * i +2+j; p2 = p1 + rot; if (p2 > limit) p2 -= 32;
                xx[p1]=x[p2];yy[p1]=y[p2];zz[p1]=z[p2];
            }
        }
    	
  

Posted by Ada Quinnell at 04:43Comments(0)TrackBack(0)私流スカルプテッド