2011年4月29日金曜日

llGetNumberOfSidesの使い道っす

日曜日にPrimToText(仮)のα版配布っす。
出力とアップデートの機能だけっす。
テストしてもらわないと分からないっすからね。
どうもぺんぎんっす( ◎v◎ )


あんまり使われない関数にスポットライトを当てるっす。
プリムの面の数を取得するllGetNumberOfSides関数っす。

面の数を直接どうこうするって、おそらく無いっすよね。
間接的にfor/while文で威力を発揮するっす。

例えば、プリムの透明度を変更して、さらに元に戻すとき、
元に戻すわけっすから、透明度は取っておかないといけないっすね。
llGetAlphaでALL_SIDESを使うわけにはいかないので、
全ての面で個別に取ってくる必要があるっす。
そこでllGetNumberOfSides関数っす。
全ての面で個別に→面の数だけfor/whileで
と考えればカンタンに書けるっすよね。
これは透明度だけじゃなく、色やテクスチャにも応用できるっす。


リンク版のllGetLinkNumberOfSides関数もあるっす。
たまには普段使わない関数のリファレンスも眺めると良いかもっす。

2011年4月27日水曜日

Pinは固定?っす

メモリ関係の新関数が出てきたので、今度からメモリ量も表記するっす。
プリム数を表記するのと同じ感覚っす。
流れは向かうと思うんっすけどね。
どうもぺんぎんっす( ◎v◎ )


本体にバージョンチェンジの仕掛けを入れるっす。
Pinを使うことになるっす。
前から思ってたんっすけど、皆さん、Pinの値は固定なんっすかね?

固定しちゃうと、バレたら書き換え放題になるっすね。
ユーザー側で自由に書き換えるようにするなら、
こんな回りくどい方法ではなく、Mod権限を付与すれば良いっす。
バレたときの心配をするより、公開したときのメリットを
考えてみてるんっすけど、思い浮かばないんっすよね。


メリットが無いのなら、やらないだけなんっすけどね。

2011年4月25日月曜日

今週はインターフェース作成週間っす

もうすぐ大型連休っすね。
連休前に試作型を作って配布したいっす。
実際に試してもらうのが一番っすからね。
どうもぺんぎんっす( ◎v◎ )


HUDは使わない方針で進めてるっす。
プリムをいじりながら操作することになるので、邪魔になるっす。
使えるのはオブジェクトへのTouchと、ダイアログくらいっすかね。
llTextBoxはビューワによっては使えないんっすよね。

必要な大項目は「出力」、「プリムをRez」、「設定」の3つっす。
「設定」の中項目は
・出力フォーマット
・おおよそのプリム数
・出力スピード
・アップデートする
の4つで、アップデート以外の3つにはさらに小項目が続くっす。
今のところ3層っす。

いくつか候補があるんっすけど、
候補1.ダイアログ
候補2.ダイアログ+パネル
候補3.パイメニュー+パネル(自信あり!)
というわけで候補3.でやるっす。
評判が悪ければ作り直すっす。
パネルにしちゃうとプリム数が少し多くなる欠点はあるんっすけど、
それ以上に分かりやすいと思うっす。


今週は頂点座標を求める算数はお休みっす。
試作品を完成させるっす。
日曜日をお楽しみにっす。

2011年4月24日日曜日

ボックスの穴っす

トーラス、リング、チューブのrevolutionsが抜けてたっす。
LSL Portalを見て書いてたんっすけど、日本語ページには
revolutionsが抜けてたっす。
編集しておいたので、後から観る方は大丈夫なはずっす。
どうもぺんぎんっす( ◎v◎ )


中空はシリンダーから手を付けようと思ってたんっすけど、
ボックスでひらめいた事があるので、ついでにやったっす。
こんな感じっす。

ボックスが面倒なのは、for文で回しにくいからっす。
円とか楕円だと、周囲をぐるっとやるとき、三角関数一発っす。
ボックスはポンっとは出来ないので、4辺それぞれ別に作ったっす。
でも似たような処理になるので、まとめられるならまとめたかったっす。
メモリ量も減るっすからね。

上面の縁だけをまず考えるっす。中空はあとっす。
z = prim_size.z / 2 平面っすね。
xとyが動くっす。

4つの辺は
x = prim_size.x / 2(固定)
y = [prim_size.y / -2, prim_size.y / 2]

x = [prim_size.x / -2, prim_size.x / 2]
y = prim_size.y / -2 (固定)

x = prim_size.x / -2(固定)
y = [prim_size.y / -2, prim_size.y / 2]

x = [prim_size.x / -2, prim_size.x / 2]
y = prim_size.y / 2 (固定)
どっちか止まって、どっちか動いてるっす。


じーっと見てると、なんだか一次式が見えてきたっす。
prim_size.x ・ {(-1 or 1) × 0.5 + (0 or 1) × i / 分割数}
prim_size.y ・ {(-1 or 1) × 0.5 + (0 or 1) × i / 分割数}
2×2の4パターンではなく、ペアの取り方は
(1, 0), (-1, 0), (-1, 1)
の3通りになるっす。
ここまで分かればもう1つfor文を書いて、まとめられるっす。


この方法、パスカットに取りかかるときに苦労が少なくなりそうっす。
中空+パスカットが考えただけでもゾッとする面倒くささなので、
今のうちに技をかけておくっす。

2011年4月23日土曜日

20m? 100m? いやSIM全域っす

ソラマメが復旧したみたいなので、新関数のネタを書いたっす。
こっちはこっちで「どう使うか」を書くっす。
どうもぺんぎんっす( ◎v◎ )


PrimToText(仮)に使って下さいと言わんばかりの新関数っす。
llRegionSayToは便利すぎるっす。
SIM全域に散らばるプリムの形状データ、全部取れるっす。
Sayの20m、Shoutの100mなんてケチなことは言わないっす。
データ送信用のスクリプトが入っていればの話っすけど。

方法っす。
1.本体からチャンネルAで存在確認命令を送る(llRegionSay)
2.プリムは命令を受けたら、llRegionSayToで本体に存在を知らせる
3.本体はプリムの数をカウント、オーナーに出力するか尋ねる
4.本体からチャンネルBで形状データ送信命令を送る(llRegionSay)
5.命令を受けたら、llRegionSayToで本体に形状データを送る。

チャンネルAとBは固定っす。
問題があるとすれば、命令やデータの送受信に失敗したときっす。
「失敗したのでもう一度命令」を送る必要があるっすね。
そのくらいかと思うっす。


まだメイングリッドに適用されてないので、完成時に使えないかもっす。
たぶん自分の完成の方が遅いと思うんっすけどね。
ちょっと心配っす。


進捗状況
・ボックス
  パスカット ×
  中空 ×(方針決定済み)
  ひねり ○
  テーパー ○
  上部層 ○
・シリンダー
  パスカット ×
  中空 ×
  ひねり ○
  テーパー ○
  上部層 ○
・プリズム
  パスカット ×
  中空 ×
  ひねり ○
  テーパー ○
  上部層 ○
・球体、スカルプト
  パスカット ×
  中空 ×
  ひねり ○
  くぼみ ×
・トーラス
  パスカット ×
  中空 ×
  ひねり ○
  穴寸法 ○
  上部層 ○
  プロフィールカット ×
  テーパー ○
  半径 ×
  回転体 ×
・チューブ
  パスカット ×
  中空 ×
  ひねり ○
  穴寸法 ○
  上部層 ○
  プロフィールカット ×
  テーパー ○
  半径 ×
  回転体 ×
・リング
  パスカット ×
  中空 ×
  ひねり ○
  穴寸法 ○
  上部層 ○
  プロフィールカット ×
  テーパー ○
  半径 ×
  回転体 ×

2011年4月22日金曜日

vector型の文字を含んだCSV形式のstringっす

今回はタイトルが長ったらしいっすね。
ピッタリなのが思い浮かばなかったっす。
いつものことっすけどね。
どうもぺんぎんっす( ◎v◎ )


新関数についてはソラマメでやるっすよ。
こっちは細々とやっていくっす。

プリムの形状データはlistenで受け取ることになるっす。
カンマで区切られた文字列、つまりCSV形式を使いたいっす。
プリムの位置をSay、次は姿勢をSay…なんてやってられないっすからね。
1回でまとめてやるっす。

カンマで区切ると言っても、vectorの中の区切りもカンマになるっす。
CSV形式の文字列をlistに変えるllCSV2List関数があるわけなんっすけど、
そのままやっちゃっても良いのかと調べてみたっす。
ダメなら区切り文字にカンマ以外の文字を使うだけなんっすけどね。

LSL Protalの記述を見ると、そのままで良いんっすね。
vector、rotationはきちんと区切ってくれるみたいっす。
ただし、文字列としてlistに格納されるので、ちゃんとキャスト
してやらないといけないっす。
ここら辺はintegerでもfloatでも同じっすね。


1つラクできるっす。

2011年4月21日木曜日

トーラス2回転半ひねりっす

丸々1週間かかったっす。
算数の力がだいぶ衰えたみたいっすねえ…
どうもぺんぎんっす( ◎v◎ )


では成果っす。


これはin-worldのプリム変形では作れないカタチっす。
パラメータは
サイズ: X=0.500 Y=0.500 Z=0.500
穴寸法: X=1.00 Y=0.50
ひねり: B=900° E=0°
残りのパスカット、上部層、中空とかはデフォルトのままっす。
調子に乗って2回転半ひねったっす。
スクリプトから出力してるからこそ出来るっすね。

算数の話なので、分かればカンタンなんっすけどね。
トーラスを作る3つのステップは合ってたっす。
 1.楕円を作る
 2.平行移動する
 3.回転させる
ひねりの処理は1.と2.の間に入るっす。
楕円を回転させることが、ひねることになるわけっす。

楕円の回転で間違ってたっす。
昨日の記事を見てもらえば良いんっすけど、
 x=a・cosθ
 y=b・sinθ
っていう楕円を回転させるのに、θ→θ+ひねり分としてたっす。
つまり
 x=a・cos(θ+δ)
 y=b・sin(θ+δ)
とやってたわけっす。
θが0から2πまで動くところを、δから2π+δまで動かすだけっすから、
できる軌跡は同じになるっすよね。
やるならベクトルの大きさを三平方で求めて、さらに
x軸とのなす角をatanで出して、それを回転させ…
なくてもrotationを使って回転させれば良いっす。
atanとかを使った方法は、良い子は1度だけならやっても良いかもっす。
rotationを直接記述しても良かったんっすけど、llAxisAngle2Rot
っていう便利な関数があったので、それを使ったっす。


同じタイプのチューブやリングも似たような感じになると思うっす。
明日までに出来るっすかね?

2011年4月20日水曜日

トーラスのひねりっす

詰まったので、UIをどうするのかを考えてたっす。
いくつか案があるので、作ってみて評判を聞いてみるっす。
やれるところからやっていくっす。
どうもぺんぎんっす( ◎v◎ )


球のひねりは解決できたっす。
次はトーラスのひねりっす。

SLのトーラスは、楕円に楕円なんっすよね。
楕円を楕円の周囲に沿って回転させた軌跡になるっす。
やり始めたとき、2.7秒ほどボールペンが止まったっす。
いきなりの難関だったっす。

トーラスの基本形は3ステップからなるっす。
媒介変数表示していくと分かりやすいかもっすね。
1.楕円を作る
  x = a・cosθ
  y = b・sinθ
  z = 0
2.平行移動する
 x = a・cosθ
 y = b・sinθ + R
 z = 0
3.回転させる
 x = a・cosθ
 y = (b・sinθ + R)cosφ
 z = (b・sinθ + R)sinφ

θ = -(μ + π/2)とおくと
x = -a・sin(-μ) = a・sinμ
y = {b・cos(-μ) + R}cosφ = (b・cosμ + R)cosφ
z = (b・cosμ + R)sinφ
見た目は違うっすけど同じことっす。

本題のひねりは、自分の予想では最初の楕円を作る時、
θ → θ+ひねり分 としてやれば良いんじゃないかと思ったっす。
小円(楕円になってるんっすけどね)が傾いて、
大円(これも楕円っす)には変化が無いように見えたからっす。


媒介変数表示がマズイのか、それとも組んだスクリプトがマズイのか。
うまくいかないっすねえ。

2011年4月15日金曜日

形状タイプの分類っす

上部層の実装中っす。
チューブだけがちょっと違う感じなんっすけど、
他は似たようなことをやるので問題ないっす。
どうもぺんぎんっす( ◎v◎ )


プリムのタイプは8種類あるっすよね。
だいたい分かると思うっすけど、3つに分けられるっす。
  ・ボックス系(ボックス・シリンダー・プリズム)
  ・球系(球・トーラス・リング・チューブ)
  ・スカルプテッド
チューブは穴の空いたシリンダーとカタチは似てるっすけど、
似てるのはカタチだけっす。
頂点計算はトーラスの応用編みたいな感じっす。
llGet/SetPrimitiveParamsのパラメータも違うっすよね。

スカルプテッドは球の基本形(中空・パスカット・ひねり・くぼみなし)として
出力することにしてるっす。
作ってるのは7種類になるっすね。


今後「ボックス系」「球形」って書いてたら、上の分け方で書いてると
思ってくださいっす。


進捗
1.リング「基本形」「穴寸法」バグ取り   完了!
2.チューブ「基本形」「穴寸法」   完了!
3.トーラス・リング・チューブ「ひねり」「上層部」「テーパー」 10%完了
4.ボックス・シリンダー・プリズム「中空」「パスカット」
5.球・トーラス・リング・チューブ「中空」「パスカット」
6.球「くぼみ」
7.トーラス・リング・チューブ「プロフィールカット」
8.トーラス・リング・チューブ「半径」「回転体」

2011年4月14日木曜日

引数のリレーっす

上層部の変数だけ用意して、計算式に入れてなかったっす。
平行移動なので難しくはないっすね。
書き換え量は多いっすけどね…
どうもぺんぎんっす( ◎v◎ )


Prim2Text(形状, サイズ, 位置, 姿勢, 出力形式)
{
   ……
  Output(頂点A, 頂点B, 頂点C, 出力形式);
   ……
}
っていう関数を作ってあるっす。
出力形式っていう引数が複数回出てくることになるので、
もっとうまい方法が無いかと考えてたっす。

引数として渡さないとなると、考えられるのは
グローバル変数に出力形式の値を格納しておくことっす。
うっかり代入して値を書き換えないよう、関数を作った方が良いっすね。

string 出力形式;
Set出力形式(string s)
{
  出力形式 = s;
}
string Get出力形式()
{
  return 出力形式;
}
Prim2Text(形状, サイズ, 位置, 姿勢)
{
   ……
  Output(頂点A, 頂点B, 頂点C, Get出力形式());
   ……
}

なんか重たいっすね。
負荷の話じゃなく、囲碁用語で言う「重たい」っす。
やりすぎと言うか、なんと言うか……そんな感じっす。


今の方法(リレーする方法)でも書けないことはないっすから、
とりあえずこのまま行くっす。
しっくり来ないっすけどね。

2011年4月13日水曜日

出力テストっす

DXFエクスポーター(仮)となってたんっすけど、
他の形式でも出せるようにしたので、変えないと変っすね。
PrimToText(仮)とでもしておくっす。
どうもぺんぎんっす( ◎v◎ )


基本プリム7種の基本形が出力できるようになったっす。
バグチェックも兼ねて、これまでの成果をカタチにしてみるっす。

くちばしは中空が設定されてるので出してないっす。
他はご覧の通りの感じっす。
0.3mくらいの小さいオブジェクトなので、誤差が結構出てるっす。
floatの仮数部23bitを絞り出す手もあるんっすけどこのままにしておくっす。

詳細度は「高」で出したっす。
気になるデータ量は、驚愕の1.35MBっす。
ついにMBの単位に突入しちゃったっす…
3,272回のllOwnerSayっす。


「まとめてポン」の部分が出来てないので、データの結合は全手動っす。
詳細度を1段階下げて「中」にすると、データ量は半分くらいになるっす。
さらにもう下げて「低」にするとまた半分、「高」の1/4くらいになるっす。
ホントなら「中」「低」の出力結果も載せれば良いんっすけど、
めんどくs…


進捗
1.リング「基本形」「穴寸法」バグ取り   完了!
2.チューブ「基本形」「穴寸法」   完了!
3.トーラス・リング・チューブ「ひねり」「上層部」「テーパー」
4.ボックス・シリンダー・プリズム「中空」「パスカット」
5.球・トーラス・リング・チューブ「中空」「パスカット」
6.球「くぼみ」
7.トーラス・リング・チューブ「プロフィールカット」
8.トーラス・リング・チューブ「半径」「回転体」

2011年4月12日火曜日

出力形式っす

機能についての要望があれば今のうちっすよ。
後からだとLSL独特の面倒臭さが邪魔をするっす。
提案してもらえれば、レスポンスは返すっすよ。
どうもぺんぎんっす( ◎v◎ )


とりあえずDXF(R12以前)形式で出力させようとしてたんっすけど、
ご要望にお応えしてWavefront OBJ形式も追加っす。
テキスト形式で出せるなら、リクエストしてもらえば作るかもっす。
DXF R13以降の形式も未実装っすけど、作るのは決まってるっす。
実装済み
  ・DXF(R12以前)
  ・Wavefront OBJ
未実装(後でやる)
  ・DXF(R13以降)
未実装(ホントの未定)
  ・COLLADA

COLLADAもテキスト(XML形式)なので、出そうと思えば出せるはずっす。
コメントアウト出来るっすから、直接出力しちゃっても良いわけっすか。
前と後ろで文字数がプラスになるんっすけど、頂点座標の記述自体は
改行タグを書かない分、文字数がすくなくなるっすね。

DXFは面を1つずつ書いていくので、出力させやすいっす。
でも、COLLADAとかは頂点を最初にだーっと全部書いて、
あとから頂点の組み合わせを書くことになるっす。
まともにやると、頂点の座標を全部格納しないといけないっす。
64KBしか容量が無いっすから、これじゃダメっす。
まともじゃない方法は既に考えてあって、書き換えも少ないっす。
まともじゃないのが問題なんっすけどね。
1.三角形を構成する3頂点を出力
2.「出力する面の数」をインクリメント
3.プリムの構成頂点を全部出力するまで1.と2.を繰り返す
4.面の組み合わせを1-2-3、4-5-6、7-8-9…として、
 「出力する面の数」だけ繰り返し出力

なんかイケそうな感じっすよね。
というわけで「未定」から「後で実装」に格上げっす。
実装済み
  ・DXF(R12以前)
  ・Wavefront OBJ
・未実装(後でやる)
  ・DXF(R13以降)
  ・COLLADA


頂点が重複しまくる「まともじゃない方法」っす。
COLLADAだけじゃなく、Wavefront OBJ形式にも使えるだけに
タチが悪いっす…



進捗
1.リング「基本形」「穴寸法」バグ取り  完了!
2.チューブ「基本形」「穴寸法」
3.トーラス・リング・チューブ「ひねり」「上層部」「テーパー」
4.ボックス・シリンダー・プリズム「中空」「パスカット」
5.球・トーラス・リング・チューブ「中空」「パスカット」
6.球「くぼみ」
7.トーラス・リング・チューブ「プロフィールカット」
8.トーラス・リング・チューブ「半径」「回転体」

2011年4月11日月曜日

プリムを外にっす

自粛期間終了っす。
バリバリやっていくっすよ。
どうもぺんぎんっす( ◎v◎ )


ブログを書いてなかっただけで、作業は進めてたっす。
「プリムの形状データを外部に持ち出す」ツールを作ってるっす。
コピーボットとは全く違うっすよ。
llGetPrimitiveParams関数を使って、プリムの形状をテキストの
データに変換して出力させるものっす。

進み具合をまとめると、こんな感じっす。
・ボックス
  基本形 ○
  パスカット ×
  中空 ×
  ひねり ○
  テーパー ○
  上層部 ○
・シリンダー
  基本形 ○
  パスカット ×
  中空 ×
  ひねり ○
  テーパー ○
  上層部 ○
・プリズム
  基本形 ○
  パスカット ×
  中空 ×
  ひねり ○
  テーパー ○
  上層部 ○
・球
  基本形 ○
  パスカット ×
  中空 ×
  ひねり ○
  くぼみ ×
・トーラス
  基本形 ○
  パスカット ×
  中空 ×
  ひねり ×
  穴寸法 ○
  上層部 ×
  プロフィールカット ×
  テーパー ×
  半径 ×
  回転体 ×
・チューブ
  基本形 ×
  パスカット ×
  中空 ×
  ひねり ×
  穴寸法 ×
  上層部 ×
  プロフィールカット ×
  テーパー ×
  半径 ×
  回転体 ×
・リング
  基本形 △
  パスカット ×
  中空 ×
  ひねり ×
  穴寸法 △
  上層部 ×
  プロフィールカット ×
  テーパー ×
  半径 ×
  回転体 ×

「基本形」っていうのはサイズ・位置・姿勢の3点セットっす。
○が付いてるのは実装済み、×は未実装っす。
△が付いてるのはバグ取り作業中のところっす。
全部○になってからリリースするので、もうちょっとかかりそうっすね。

作っていく順番は
1.リング「基本形」「穴寸法」バグ取り
2.チューブ「基本形」「穴寸法」
3.トーラス・リング・チューブ「ひねり」「上層部」「テーパー」
4.ボックス・シリンダー・プリズム「中空」「パスカット」
5.球・トーラス・リング・チューブ「中空」「パスカット」
6.球「くぼみ」
7.トーラス・リング・チューブ「プロフィールカット」
8.トーラス・リング・チューブ「半径」「回転体」
各工程3日から1週間くらいで作って、5月の中ごろ完了予定っす。

さらにインターフェースを考えたり、オブジェクトとして作ったり、
形状データをテキストに直しただけでは完成しないっす。
算数ばっかりやってるのもアレっすから、平行してやるっす。
完成は5月中にさせるっす。


完成時期を明言しておいて、自分にプレッシャーをかける作戦っす。
Free Avatar