2010年7月21日水曜日

VideoCube 2

この先どう見ていこうかしばし悩んだが、三角関数をググってみるとWikipediaの親切な説明が。なんだ三角関数、なかなか分かりやすいじゃないか。 だがまてよ。どうして直角にこだわるのだ? 結局3つの角度が分かれば、辺の割合が分かるわけだから、そうしたユニバーサル(汎用的・普遍的)な関数が あってもいいはずだ。例えば正三角形は1:1:1だとか。2つの直角三角形に分解すれば・・・あ、なるほど。だから直角三角形のケースが分かれば、他のど んな角度にも応用できるというわけか。失礼しました。

何となく公式は見た、というところで、三角関数がサイコロくるくるにどう生かされるのか、全く想像できないところでコードを見ていくことにする。

まずPointというのはx,y,zを持つ。つまり3次元上の1点をさしている。これをFaceクラスの中で、ul,ur,lr,llという4つの変数に 展開している。名前からupper-left,upper-right,lower-right,lower-leftだろう。すなわち左上、右上、右 下、左下という風に4つの点をトレースしているイメージで宣言しているように思われる。だがこれがそのままサイコロを描いているようには思えない。どうも 3次元というのはイメージしづらいが、この中でzがズレたら変形したサイコロになるし、x,yで正方形が描けている保証もない。

def z = bind ul.z + ur.z + lr.z + ll.z;

でFaceの持つz座標が4つのPointの和になっている。それぞれの点の奥行きの合計・・・ますます分からなくなって来たが、まいっか。

戻ってFaceクラスを頭から。

var source:String on replace old {

置換トリガ。ってなんだっけ。な るほど、設定イベントハンドラみたいなもののようだ。
ということでsoueceに設定されたら?何するのかというと、値が違う場合のみ、errorをクリア(false)し、mediaに新規にインスタンスを設定する。その内容は、sourceにsource@自分(Faceのインスタンス変数)、onError関数に"Loading error"と出すための関数をセット。か。じゃあ誰がsourceを(再)設定するのか。まずStageで宣言したFaceのインスタンスの1つをstartVideoURLで初期化する時と、面をクリックしたときにファイル選択して設定する時。この面をクリックしてというのは、実際動かしてそうなっているので分かっているのだが、onMouseClickedの処理自体はまだ理解していない。場所もなんでここなの?という状態な今。

続いて前出のdef z。
def z = bind ul.z + ur.z + lr.z + ll.z;

何やら変数。
var start:Number;
var length:Number;

をっとここでTimeline登場。タイムラインとは? なるほど。これはとても分かりやすい。というか、今までアニメーションに注意が行っていなかったが、今回はその辺、読む側の姿勢が違う。ただatの書き方はこちらを参考にした。

def animation = Timeline {
repeatCount: Timeline.INDEFINITE
keyFrames: [
at(0s) { start => 90; length => 0 },
at(2s) { start => 90; length => 360 },
at(4s) { start => 450; length => 0 }
]
}

このat()の時間をいじってみると、ビデオ以外の各面のくるくる回る時間のようだ。
だがstart=>90が2回連続しているのは合っているのだろうか? start,lengthが何か分かってないので何とも言えない。見たところ角度のようだが。

def animate = bind z > 0 and error on replace old {
if (animate != old) {
if (animate) {
animation.play()
} else {
animation.pause()
}
}
}

またこの怪しいbind。そしてon replace。
だがbindはそこに含まれる変数が変わったら実行されるという単純なルールなわけだから、zかerrorが変わったらz>0 and errorが評価されてanimateに設定されるということだろう。そしてそのときon replaceが働くので、animateが変化したら何か処理する。何かというと、trueならanimation.play、falseならanimation.pause。このanimationは直上のくるくる。
ただこの条件が解せない。errorがonならくるくるするのはいいが、このときz>0じゃないとダメだ。zが0以下がどういう時かというと、どういう時?

zが設定されるのは、bindによる効果のみ。つまり、ul..llのzが変化したとき、その和になる。見えている面のことか。いや最大で3面しか見えないから違う。

(2010.7.28追記) Faceは面1つだから見えてる面が3つとか、関係ない。ある1つの面=Faceの四隅の座標のzが0、ということは奥行きがないので、ということなのだろう。ただしそれで(PCの画面の)正面から見えなくなるというのは良く分からないというか、zの基準がよく分からないと言った方が良い。ただ逆を言えば、z>0のとき面が見えるような座標にになるよう、各面が配置されているはず、ということ。この辺の理解は全体としては多少進んでいるが、まだ下書きな状態なので、zのことも含めて分かれば、ここでの条件の意味も分かっていることだろう。(2010.7.28追記)

その先を見ていくと、PerspectiveTransformのulx..llyにul..llをbindしている。で、PerspectiveTransformを見ると、なるほど。といってもまだ半分ぐらいしかピンと来ないが。APIリファレンスの例を見ると、Groupに対してeffectにPerspectiveTransform指定している。多分このGroupに入れたcontentにeffectが掛けられるという仕様なのだろう。この例では、RectangleとTextが入ったGroupに4つの頂点の座標を指定している。これがulx..llyであり、ul..llが対応するものになるわけか。で半分というのは、RectangleとTextの例は分かりやすいが、VideoCubeに対するPerspectiveTransformというとどうなのよ?ということ。Rectangleだと4つの点がそのまま四角の角に対応するけど、VideoCubeの場合のイメージがまだ出来ない。ちなみにPerspectiveは遠近法とかの意味があり、ま、普通の3Dというか、ナビの鳥瞰、ダンジョンの通路、みたいな感じで思っている。ただ最初に浮かんだのがEclipseのパースペクティブ。Eclipseは使ったことがないが何故かパースペクティブがどうとかいう噂は耳にしたことがあり、私をEclipseから遠ざけているバリアの役目を果たしている。だから妙に記憶に残っているのだ。

ところでNetbeansでrの検索をしようとしたら、検索プロセスとやらが一向に返ってこなくなってしまった。netbeansを終了しようとすると検索プロセスが終了しますけど?と聞いてくる。再起動した後再現しないが、まず起動直後だと検索のダイアログがポップアップではなく、コードエディタの下に張り付く格好で出てくるのが違う。ここで「使用状況を検索」とやった後検索するとダイアログがポップアップするようになり、この状況でrを検索すると、返ってこなくなる。これは頂けない。あと頂けないついでに言うと、ポップアップメニューが表示された状態で他のアプリに移っても、ポップアップメニューが最前面に表示されてしまい、非常にうざったい。これを解消するには、またnetbeansに戻って関係ない場所をクリックして消してこなければならないのだ。どうしてこうなるかと言われると困るが、使用状況の検索をしようとして、関連情報を検索したくなるとか、だろうか。今度また起きたら、状況を確認しておこう。

0 件のコメント:

コメントを投稿