ソラマメブログ

  

Posted by at

2009年03月23日

スカルプ備忘録

SLスカルプのお勉強をしたので、備忘録。。。
すみません。あんまり、親切な解説じゃないです。

■ Blender
スカルプを作ることのできるツールは色々ためしたのですが。。。結局いきついたのが、Blenderというフリーのソフト。やっぱり・・・というか、結局・・・というか、他にも高機能なツールはありますが、SL関連の情報が一番多い気がします。私のような新参者には嬉しい。。。

特に、とっかかりの基本操作が少々わかりにくいので、文章よりも動画で説明してくれるサイト(Machinimatrix)がお勧めです。ここ海外サイトですが、SLに特化したBlenderの使い方を動画を交えて説明してくれます。一般的なインターフェースをまるで無視した操作感にのっけから戸惑うこと必至ですので、こういうサイトはかなり重宝します!!

■ Blenderスクリプト
Blenderを使って、SLに取り込む用のスカルプマップを生成するのには、なんだか面倒な設定が必要になる。。。そのため、あらかじめ設定が済んでいるテンプレートをDLして使っている人が多いのでは?しかし!もっと便利なものを発見!上記のサイトで紹介してあったのですが、Domino Maramaさんという方が公開しているBlenderに組み込めるスクリプトがある!(Blender Python Scripts for Second Life Primitives)これを使えば、SL用のメッシュを生成(Space → 追加 → メッシュ → SculptMesh)してくれたり、SL用スカルプマップの出力(メニュ:レンダリング開始 → Bake SecondLife Sculpties)をしてくれたり、テンプレートをわざわざ使わなくっても、面倒な作業に煩わされることがありません!

特に便利なのは、LOD(Level Of Detail)のチェック機能。SecondLife内でスカルプを表示するのには、3つの表示段階があります。LODとは、この段階のこと。視点を遠ざけたときと近づけた時では、表示の綿密度が変わるんです。SL内のスカルプの形状は、1024個の頂点で形成されているのですが、視点を遠ざければ遠ざけるほど、この頂点が簡略化されていきます。視点を遠ざけるとグシャ!っと、くずれてしまうスカルプがあるのはこのためです。省略されてしまう頂点がどれなのか把握せずに形を生成すると、型崩れを起こしやすいスカルプになります。このツールを使うとBlender内でLODの3段階のチェック(MultiresのLevel:1~3を選択)を行うことができます!これとっても便利~~~^^

■ Conv2Sculpt
今回は、剣道の胴を作りたかったので、実際の作業過程を見てみます。ある程度自分の思うような形になってきたら、これをSLに取り込めるスカルプマップに変換しSLにアップロードします!と、ところが!!SLにとりこんだとたんオブジェクトがぐにゃりとしたメリハリのないものになってしまう・・・。みなさんも、こんな経験ありませんか!?スカルプをSLにアップロードするのに、いつもドキドキ。。。www なんだか、どうもBlenderでスカルプマップを生成すると形状がボケちゃうみたいなのです。思考錯誤するもののどうも上手く取り込めず・・・。



そこで、みつけたのがこのツール!!Conv2Sculpt。これは、ブレンダーなどで生成した3Dのオブジェクトのボケを減らしシャープなスカルプマップを生成するのにとても役立ちます!一度使ったらもう手放せません!!特に、家具のような、エッジをきかせたものを作る方にはお勧めのツールです。Blenderで作ったオブジェクトをX3D形式か、VRML形式にExportし、そのファイルをConv2Sculptに読み込ませるだけ!(って、こんな説明じゃわからないかな・・・)後は、全部このツールがやってくれます。Convertボタンを押すと、スカルプマップを生成してくれるので、Save PNGボタンでファイルに保存しましょう。出来上がったPNGファイルをそのままSLにアップロードできます。

ちなみに、このツールのImage Width/Heightという部分で指定するサイズが、生成されるスカルプマップのピクセルサイズなのですが、この数値に裏技があります。先ほどLODの話をしましたが、崩れにくいスカルプを作るのにこのスカルプマップのサイズが影響するようです。例えば、縦方向の頂点が重要!!という場合、通常、64x64で出力するところ、縦方向のサイズを倍にして(その代わり横方向を1/2とします)32x128で出力してやると、縦方向のLODのレベルが一段階上がります。つまり縦方向の頂点が落ちにくくなります。その分横方向は崩れやすくなりますが。あんまり原理がわかってないので大きなことは言えないのですが・・・形によって使い分けるとより強固なスカルプができます。

剣道の胴の場合、横方向の頂点が落ちてしまうと、遠めで見たときに胴が崩れて中の着物が突き出てしまいます。そこで横方向を落ちにくくするため、128x32で出力しています。これにより遠めで見ても中の着物がはみ出なくなりました!色々なパターンを作って、実際にアップロードして具合のいいモノを見つけてみてください。

実際に遠めからみて、型崩れをチェック。



(わざわざ、遠めからみなくても、設定 → 表示 → オブジェクト、の値を調整するればチェックできます。。。)

■ フォトショップの力技
今回の胴のような滑らかな形を残したい場合、凹凸とかギザギザができてしまうのが気になります。。。



気になるところを部分的にフォトショップなどの画像処理ソフトで強引に直す方法があります。スカルプマップを直接編集します。滑らかにしたい部分をあらかじめBlenderなどで確認しておき、その部分に「ぼかし(ガウス)」をかけます。だいたい、1.0~2.0程度かければ充分だとおもいます。それ以上かけると返ってのっぺりしてしまうかもしれません。



だいぶ、なめらかな胴ができてきました!!

それから、垂の唾のように左右対称のオブジェクトを作りたいときは、同じように画像処理ソフトでスカルプマップを直接編集し、「左右の反転」 & 「階調の反転」を行います。これで左右対称のスカルプマップができます。SL内の設定項目でスカルプの左右反転(ミラー)っていう機能を使えば、同じスカルプマップを利用して左右対称のオブジェクトができますが、これはローカルのビュアー側の処理で、古いビューアなどにはこの機能がありません。ビュアーによって見え方が変わってしまうので、できれば左右反転したスカルプマップを個別に作りアップロードすることをお勧めします。



また、オブジェクトが部分的に裏返しになっちゃうようなことがあると思います!これ、SL側での読み込み時に、マップが変に判断されちゃうみたいで・・・困っていたのですが、これも直接、画像処理ソフトで解決できます。裏返しになってしまう部分をあらかじめBlenderなどで確認しておき、その部分に「左右の反転」か「階調の反転」のどちらかをかけます。(どちらをかければいいのか・・・私もよくわかってません。。。^^; 私の出くわした状況だと、ものによってまちまちだったのですが。。。詳しい情報を持っている方がいたら教えてください!!)後述する、SLVなどを使ってローカル環境で確認しながら作業するとよいでしょう。

■ SLV
スカルプの形が満足いったら、今度は表面に貼るテクスチャの作成です。スカルプの表面に貼れるテクスチャは必ず1枚です!どんな複雑な形をしてても1枚なのです>< ですので、テクスチャのどの部分が、どこに表示されるかを確認できるツールが必要になってきます。ローカルの環境で、スカルプの形状の確認と、テクスチャの貼り付け(直接、描くこともできる)ができる便利ツールがこのSLVです。

このツールをつかって、テクスチャの大体のあたりをつけましょう。使い方は同サイト内に、動画ヘルプがあるので、一通り目を通すといいと思います。直接絵がかけるので、こんな感じで私はだいたいのあたりをつけてます。



(うへ!汚い。。。)

こんな感じで、手書きでだいたいの位置の当たりをつけておきます。
これをフォトショップなどの描画ソフトで開いて、柄を描き描きしていきます!

わざわざ、アップロードしないでも、スカルプの形状の確認もできるので、Blenderで直接、テクスチャまで生成しちゃう人にも便利なツールだと思います!ローカル環境である程度の調整ができちゃいます。

出来上がったテクスチャをアップして貼ってみる。。。



■ テクスチャのポイント
慣れてくると、テクスチャがどのようにスカルプに貼られるのかがわかってくると思います。そーしたら、そもそもテクスチャを描きやすいような形でスカルプを作ったりすると作業効率が上がると思います。例えば、テクスチャの切れ目が正面に来ないようにしたりするだけでもずいぶんと違うと思います。

それから、テクスチャは厳密に頂点に対応していますので、頂点が密集しているところは、テクスチャがより詳細に表示され、頂点が希薄になっているところは、テクスチャは、ノビノビになってしまいます!ですので、SL上で綺麗にテクスチャを表示するためには、なるべく頂点のばらつきがすくないよう形を形成していくのが良いと思います。

■ 胴づくりの続き・・・
以上を踏まえて、胴の縁取り部分と、胸当ての部分を作ってみたらこんな感じになりました!





これに、紐を付けたり結びを付けたり更に細かく作りこんでいきます。

最後に、サイズ変更、テクスチャ変更のスクリプトを仕込んでようやく商品化です!
(スクリプト講座は、機会があればいずれ別の記事で・・・。)



十五屋本店に、DEMOもありますので、お散歩がてら来店くださいませ!^^

スカルプ新参者ですので、記事中間違った記載があったらごめんなさい><
また、こんないいツールあるよーーー!とかいう方がいましたら、
是非、教えてくださ~~い。  


2008年05月16日

スカートが消える!

WindLightが登場して以来、たまにスカートが表示されないとか、一部消えてしまうとかいう問合せがくるようになりました。調べてみると、リンデン側の周知のバグのようですね。。。確かに、たまーにそういう現象が起こり、私自身は最新のViewerを使用するのを辞めてしまいました。 WindLightが登場する以前の古いViewerでは、スカートが消えることはなくなりました。とはいえ、一般的には最新版のViwerを使用している方が多いと思いますので、いくつかの解決方法を記述しておきます(一時的なものですが。。。)

調べてみた限りだと、以下のどれかを試すと解決する(ことがある)ようです。
1. キャッシュをクリアし、再ログイン
編集 → 環境設定 → ネットワーク → キャッシュ(MB): 「クリア」ボタン
※ キャッシュのクリアは再ログイン時に有効になります。

2. Rebake Texturesを実施(デバッグモード)
Ctrl+Alt+Dにて、デバッグモードとする
メニューバーの一番右に新たにAdvancedメニューが追加されます。
このメニューから、Character → Rebake Textures を選択

3. 容姿の編集でスカートの値をいじって保存しなおす
アバターを右クリック → 容姿... → スカート → <値をいじる> → 保存

複数回、同じことをやったら直ったということもあるようですので、だましだましやってみてください。
ただ、原因はリンデンのバグですので、こちらが解決されないことには。。。
あくまで、一時的な対処法として試してみてください。
最近は、プリムスカートが流行っているので、あまり重大視されてないのかなぁ。
和ものの着物を着る身としては、ひじょーに困った事象です。。  


2007年11月08日

時計

まいど、十五屋の時計台のご利用ありがとうございます。
今日も、時を刻み続けております。

この十五屋の時計の針はスクリプトで動かしているのですが、
時計の針の動かし方についてご質問があったので時計台のスクリプトを公開いたします。
サンプルも無料でおいておきますので、是非十五屋にお越しくださいませ。


時計の針を動かすには、大きく2通りあるのじゃないかと思います。ひとつは、円形のプリムにテクスチャを貼ってテクスチャを回転させるもの(IBMのCODESTATIONというSIM に無料のサンプルがあります。)この方法だとプリムの位置は気にせずテクスチャの回転だけを意識すればよいので簡単だと思います。針の部分以外を透過にした、テクスチャを用意する必要があります。そもそも、テクスチャで時計の針を描きたい方は、迷わずこの方法を使うのがよいと思います。IBMの WallClockというサンプルを参考にしてみてください。

時計台の場合は、時計の針のプリム自体を回転させております。この方が針に厚みをもたせることが出来るので、個人的にはこちらの方法のほうが好きです。ただ考慮しないといけないことがいくつか出てきますので、ちょっと面倒かもしれません。おそらく時計の針の動作でうまくいかない方はこの2番目の方法を取っているのではないでしょうか?今回、公開するサンプルは、この2番目の方法になります。

軽く説明します。。。

オブジェクト自身を回転させるときは、llLocalRot()という関数を使うのですが、回転軸を考慮する必要があります。(オブジェクトを編集するときに表示される赤青緑の矢印の交差点がオブジェクトの中心点になります。)この中心点を軸にオブジェクトは回転します。つまり、針のオブジェクトをプリムで作るときにちょっと工夫が必要になります。時計の中心に軸がくるように偏ったオブジェクトを作ってやる必要があります。



針さえできてしまえば、後はサンプルのスクリプトを針自身に埋め込むだけですので、時計を動かすこと自体は難しくないと思います。長針、短針、(必要であれば)秒針にそれぞれ同じスクリプトを適応します。※timer()の中身を時針、分針、秒針によって書き換えてください。スクリプトサンプル参照。

--------------------------------------------------
//GMTとの時差
float TIME_DIFF = 9.0;

set_pos_hours(){
float rotTime = ((llGetGMTclock() / 60 / 60) + TIME_DIFF) * 30;
llSetLocalRot(llEuler2Rot(-(<0, 0, rotTime * DEG_TO_RAD>)));
}

set_pos_minutes(){
float rotTime = (llGetGMTclock() / 60) * 6;
llSetLocalRot(llEuler2Rot(-(<0, 0, rotTime * DEG_TO_RAD>)));
}

set_pos_seconds(){
float rotTime = llGetGMTclock() * 6;
llSetLocalRot(llEuler2Rot(-(<0, 0, rotTime * DEG_TO_RAD>)));
}

default{
state_entry(){
set_pos_seconds();
llSetTimerEvent(1);
}

timer(){
//長針、短針、秒針に組み込むスクリプトによってここを
//変えてください。
set_pos_hours(); //← 短針に組み込む場合はこの行のみ有効にする
set_pos_minutes(); //← 長針
set_pos_seconds(); // ← 秒針
}
}
--------------------------------------------------

ところが、、、この後、僕はハマったのですが。。。

リンクの仕方にちょっとコツがあるのです。回転させる軸だけでなく回転させる方角に注意する必要があります。時計を作り終わってオブジェクトを「リンク」したとたん、ヘンテコな動きになることがあります。そんなときは以下の注意点をチェックしてみてください。

注意点1
リンクするとき、スクリプトを埋め込んだ針をルートプリムに「しない」。ルートプリムに適応したスクリプトはリンクしたオブジェクト全体にかかる特質があります。ので、時計の針をルートプリムにすると、針ではなく時計全体が回転し始めます。サンプルでは、動きのない時計の中心の丸ポチをルートプリムにしています。(リンクする直前に、一番最後に選択したプリムがルートプリムになるようです。Shiftキーを押しながらルートにしたいプリムを最後に選択しなおしましょう。)



注意点2
ルートプリムの角度に注意する。時計の針をサンプルだとZ軸の方向に時計回りに回転させています。。。が、このZ軸というのは何に対してZ軸か?ってことに、注意してください。リンクした瞬間から、「ルートプリム」のZ 軸に対して針が回転し始めます。ですので、時計の針とルートプリムのZ軸が同じ方向を指していない場合、リンクしたとたん針は思わぬ方向に回転し始めます。サンプルでは、針の軸と、ルートプリムの軸の角度が同じになるようにしています。簡単なのは、回転(度)の部分を全て0にして作成するのがよいと思います。



最後に十五屋の腕時計の宣伝です。
十五屋の腕時計も基本的には同じような、考え方で作られております。
腕時計の針を動かしてみたいという方は、是非上記の方法で試してみてください。



ついでに、時計の針の回転をマスターしたら、次はLSLであえてデジタル時計なんかを作ってみてはどうでしょう?時刻によってデジタル番号の各パーツの色を変更するようなスクリプトを書いております。こんな感じ。。。デジタル時計。(店舗の外に展示してあります。)



同じようなスクリプトをいろいろ工夫するとものづくりの幅が広がりますね。

以上、簡易講座でした。。。