2007年05月23日
動くsculpture
sculpted primの形をぐにゃぐにゃ動的に変えてみました。
つまりsculpted textureをスクリプトで差し替えることでアニメ化したものです。
ともかく下のビデオのようになります。(追記:っと思ったら出てないじゃん。wmvアップロードの不具合?)
アイデア自体は以前からあったが、忙しかったので今日実施してみました。
というか今日も明日も仕事が忙しいので、本当はこんなことしている暇じゃないんだけど
現実逃避モードです。
ネタのテクスチャは例によってPostScript言語による生成です。原理的には3Dソフトや
他の2D画像生成ライブラリなどでもできますが、手作りのオブジェクトだとちょっとつらいかも。
今まで3Dソフトによらず、あえてこのマニアックな方法をとってきたのは、単に慣れの
問題だったのですが、ここにきて、アニメなので「連続的にパラメータを変えてたくさんの画像を生成する」必要が出てきて、この方法が功を奏しました。今までPostScriptはフォトショに読み込ませていたのですが、今回は画像枚数の関係でGhostScriptを使いました。
ほかの人の参考になるかどうかわかりませんが、そのときの起動オプションと、生成した画像、アニメに使ったLSL、生成元のPostScriptファイルを載せます。
ちなみにこの方法はタイマを使用しているので、多用するとラグのもとになるのだと思います。(多分)
//関係ないけど、この記事のタイトルは色々悩んで何度も変えました。俺ってアホ・・・
つまりsculpted textureをスクリプトで差し替えることでアニメ化したものです。
ともかく下のビデオのようになります。(追記:っと思ったら出てないじゃん。wmvアップロードの不具合?)
アイデア自体は以前からあったが、忙しかったので今日実施してみました。
というか今日も明日も仕事が忙しいので、本当はこんなことしている暇じゃないんだけど
現実逃避モードです。
ネタのテクスチャは例によってPostScript言語による生成です。原理的には3Dソフトや
他の2D画像生成ライブラリなどでもできますが、手作りのオブジェクトだとちょっとつらいかも。
今まで3Dソフトによらず、あえてこのマニアックな方法をとってきたのは、単に慣れの
問題だったのですが、ここにきて、アニメなので「連続的にパラメータを変えてたくさんの画像を生成する」必要が出てきて、この方法が功を奏しました。今までPostScriptはフォトショに読み込ませていたのですが、今回は画像枚数の関係でGhostScriptを使いました。
ほかの人の参考になるかどうかわかりませんが、そのときの起動オプションと、生成した画像、アニメに使ったLSL、生成元のPostScriptファイルを載せます。
ちなみにこの方法はタイマを使用しているので、多用するとラグのもとになるのだと思います。(多分)
//関係ないけど、この記事のタイトルは色々悩んで何度も変えました。俺ってアホ・・・
gs -g64x64 -r72 -sDEVICE=bmp16m -dNOPAUSE -dBATCH -sOutputFile=out%d.bmp neta.ps
PostScript:
%!PS-Adobe-1.0 EPSF-1.0
%%BoundingBox: 0 0 64 64
%
% Sculpted 1-Prim sandglass for Second Life using PostScript
% by Conorcon Laszlo 2007-05-10
% Usage
% (1)Paste this script to a text editor and save it as beans.ps.
% (2)Open the file with a PostScript-aware graphical editor, e.g. Photoshop.
% (3)Rasterize it with 72px/inch resolution then save it as 24-bit TGA.
% (4)Upload the TGA image to SL as a sculpt texture.
% Optionally, you could use any out-of-world sculpture previewers.
%
% t, u for vertices
/rstt { /t 0 def } def
/rstu { /u 0 def } def
/inct { /t t 1 add def } def
/incu { /u u 1 add def } def
0 setlinewidth
% paint one pixel
/box10 { moveto 1 0 rlineto 0 1 rlineto -1 0 rlineto closepath fill } def
% paint (t,u) with color r,g,b
% which in fact correspond to x,y,z coordinates respectively.
/P { setrgbcolor t u box10 } def
% 0..64 to 0..360
/todeg { 360 mul 64 div } bind def
% delta
0 20 180 {
gsave
/DELTA exch def
% initialize t,u
rstt
rstu
% increment u
0 1 63 {
/u exch def
% increment t
0 1 63 {
/t exch def
% R=(cos(u)+1)/4+0.5; 0.5≦R≦1;
/R u todeg DELTA add cos 1 add 4 div 0.5 add def
% Red=x coord
t todeg cos R mul 1 add 2 div % A=R*(cos(t)+1)/2; 0≦A≦R;
% Green=y coord
u 64 div 1 exch sub
% Blue=z coord
t todeg sin R mul 1 add 2 div % B=R*(sin(t)+1)/2 0≦B≦R;
P
inct
} for
incu
rstt
} for
showpage
grestore
}for
LSL:
float interval = 0.5;
integer cur = 0;
integer dif = 1;
integer max = 0;
list textures = [
"out1","out2","out3","out4","out5","out6","out7","out8","out9","out10"
];
default
{
state_entry()
{
llSetTimerEvent(interval);
max = llGetListLength(textures);
}
timer()
{
llSetPrimitiveParams([
PRIM_TYPE, PRIM_TYPE_SCULPT,
llList2String(textures, cur), PRIM_TYPE_SPHERE]);
cur += dif;
if (cur >= max) {
cur = max - 1;
dif = -1;
}
if (cur < 0) {
cur = 0;
dif = 1;
}
}
}
Posted by Conorcon Laszlo at 01:27
│Beta
この記事へのコメント
初めまして。
sculpt テクスチャも LSL から動的に変更できるんですね。
(当然そうなるべきとは思っていましたがw)
勉強になります。
sculpt テクスチャも LSL から動的に変更できるんですね。
(当然そうなるべきとは思っていましたがw)
勉強になります。
Posted by Hidenori Glushenko at 2007年05月23日 01:49
そうですねー、できるとは思っていましたが実際やってみてできたのでちょっとうれしかったです。
ブツはbetaのMorrisの三度ボックスにおいてあるので興味があったら見てみてください
(どうせそのうち消されちゃいますが)
ブツはbetaのMorrisの三度ボックスにおいてあるので興味があったら見てみてください
(どうせそのうち消されちゃいますが)
Posted by Conorcon at 2007年05月23日 02:03
LSL初心者です。
LSLの最後にif文で「cur<0」とありますが、curが0より低くなる式が見あたりませんが、これはdifと違うのでしょうか?
間違ってたらすみません。
LSLの最後にif文で「cur<0」とありますが、curが0より低くなる式が見あたりませんが、これはdifと違うのでしょうか?
間違ってたらすみません。
Posted by いいじぃ at 2007年06月05日 18:52
いいじぃ さんこんにちは
timer()は文字通りタイマーによって一定間隔で呼ばれる関数です。なので、curはtimer()の呼出しごとに、difの分だけどんどん加算されていきます。curがmax以上になったら今度はdif=-1になるので、以降curが減算されていき、
最終的には0未満になります。
・・・ということだったような気がしますが、最近SLに触っていないので、間違っていたらすみません。
timer()は文字通りタイマーによって一定間隔で呼ばれる関数です。なので、curはtimer()の呼出しごとに、difの分だけどんどん加算されていきます。curがmax以上になったら今度はdif=-1になるので、以降curが減算されていき、
最終的には0未満になります。
・・・ということだったような気がしますが、最近SLに触っていないので、間違っていたらすみません。
Posted by Conorcon at 2007年06月05日 23:40
あ!よくわかりました。
cur += dif の所ですね。
よく見ずに質問してしまったようですね。はずかしいです。
早速明日試してみます。ありがとうございました。
cur += dif の所ですね。
よく見ずに質問してしまったようですね。はずかしいです。
早速明日試してみます。ありがとうございました。
Posted by いいじぃ at 2007年06月06日 00:40
はじめまして、
LSL初心者ですが大変参考にさせて頂いてます。
上記LSLソースを参考にさせて頂いたのですが、私の環境ではsculpted primの一部が欠けて描画されました。
llSetPrimitiveParamsのパラメータ部分に問題がある様で、以下の様にしたところ正しく表示されましたので報告しておきます。
llSetPrimitiveParams([
PRIM_TYPE, PRIM_TYPE_SCULPT,
llList2String(textures, cur), PRIM_SCULPT_TYPE_SPHERE]);
LSL初心者ですが大変参考にさせて頂いてます。
上記LSLソースを参考にさせて頂いたのですが、私の環境ではsculpted primの一部が欠けて描画されました。
llSetPrimitiveParamsのパラメータ部分に問題がある様で、以下の様にしたところ正しく表示されましたので報告しておきます。
llSetPrimitiveParams([
PRIM_TYPE, PRIM_TYPE_SCULPT,
llList2String(textures, cur), PRIM_SCULPT_TYPE_SPHERE]);
Posted by suda at 2007年07月08日 04:37