2010年8月12日木曜日

VideoCube 11

ところで、O3D。demoを見たが、CPUの負荷がとても少ない。と思っていたら、WebGLと統合? X3DのサイトでX3Demoを見ようとすると見れない。ついていけない。まあどうせ今見る話じゃないし。

でもHome Designer Demoとかinfinite journey Demoとか Beach Demoとか、どれもすごいので、なくなるのはもったいないと思うが、そのままそう簡単にWebGLに引き継がれるものなのだろうか。

それにしてもこれらデモ達のキビキビした動きを見ると、どうしてVideoCubeはCPU100%近くまで行くのか、すごい不思議。

PerspectiveTransformの四隅の位置。
def pt = PerspectiveTransform {
ulx: bind d + ul.x
uly: bind d + ul.y
urx: bind d + ur.x
ury: bind d + ur.y
lrx: bind d + lr.x
lry: bind d + lr.y
llx: bind d + ll.x
lly: bind d + ll.y
}
dは2rだが、Faceの四隅をdにしているので、d/2ではないか?と思い、d/2にしてみると、左隅によってしまった。あれ? よく見ると、Faceを初期化する際のxの位置が-r〜rになっている。なるほど、中心が原点か。つまりdを足すというのは、左端から中心(原点)までの距離を足すということ。なるほどね。dが何の略か分からないのでピンと来ないが、sceneに対して余白と考えると、どうもしっくり来ない。それにbindにこんな固定的な足し算を入れるのはどうなの(速度というより無駄な気がする)。でも他に方法ないんじゃない?どっかで足さなきゃいけないんだし。あ、Faceの初期化でdを足しとけば良いのか。いやそれは無理。Faceの初期化で渡すのはPointだから。かといってPointの座標を変えようにもうまくいかない。やはりbind時にdを足すで正解なのか。

だいたい分かってきた気がする、と思ったら雨、雨じゃないか。嬉しいような嬉しくないような事情もあり。

分かった事を整理して、この中でJavaFX的に何がわかったかを整理しよう。

1. タイマによる定周期処理
Timelineクラスの変数を定義して繰り返しを無限(repeat:Timeline.INDEFINITE)、時間に周期を設定(time:40ms)、アクションに処理を書けば(action:function() {})実現できる。

2. マウスイベントハンドラ
onMouseClicked:function(event) {}で書けば良い。今回はPolygonに書いているが、書けるクラスは色々あると思う。また、重なっている場合の順序については良く分かっていない。CustomNodeの場合は、単純にcontentにセットする順番で最初に記述したものが下にくるようだ。Polygonを最後に書くと真っ黒になる。だがMouseイベントはどうなのか。Polygonが最初の場合でも受けているのは、なぜか。と思って色々場所を動かしてみると、なんと、最初のGourpの直下でないと受からない。これが仕様だとは思えないので何か書き方の問題なのだろうが、はて何だろう。

いろいろ調べていると、JavaFXのチュートリアルにGroupにonMouseEnteredを書いているところが。あれGourpに書けるの? そうすると範囲はどうなるんだろうね。中の要素全体かな。とにかくGroupにonMouseDraggedを移動してみると、おお確かに利くじゃないか。しかもPolygonに入れたときは、動いてる方向と逆側にドラッグすると中心付近で止まってしまい、一旦マウスボタンを離してからじゃないとドラッグが利かないのに、そんな突っかかる事も無く、かえってスムーズに動いてる感。

どうでもいいけど、色々いじったせいで、コードがぐしゃぐしゃになってしまった。

あ。ドラッグしたまま(当然マウスボタンを押したまま)にして、そこからちょっと動かすと、突然マウスポインタが手から矢印に戻ってしまう。ドラッグも終了してしまう。なぜか。元に戻してみると・・その前にblocksMouseがfalseだったのでtrueに戻してみると・・変わらない。

反対側にドラッグしたら利かなくなるというのは、おそらくこのドラッグが終わってしまう現象だったのだと思う。結局、

(1) Polygonに付けても、Gourpに付けても、マウスイベントの動きに差はなさそう。
(2) ネストしたGroupのcontentのオブジェクトのマウスイベントは何故か拾えない。
(3) ネストしたGroupにマウスイベントを貼ったらどうかというと、やっぱりダメ。

実はmacだからだったしりて。blocksMouseも関係なし。まとめようとしていたのにぜんぜんまとまらなくなってしまった。

でもネストしたからというのは考え難いので、いろいろ取っ替え引っ替えやってみると、ほら、やっぱり単純にTextをGroupのGroupに入れただけならマウスイベントは取れる。

もしやと思ってPerspectiveTransformを外してみると...当たりだ。というか、断定するわけではないが、PerspectiveTransformをCustomNodeのcontent内のオブジェクトのeffectにセットした場合マウスイベントが拾えない状況で、effectをはずすと拾えるようになる。

PerspectiveTransformのAPIリファレンスを見ると”containment methods are undefined”とあるが、単にGroupにTextを入れて、TextのeffectにPerspectiveTransformしても、Text内に入るとカーソルがちゃんと(ハンドに)変化する。ところがCustomNodeに入れたGroupで同じことをすると全く変化しない。

ネストがダメなはずはさすがにないだろうと思ったが、やはりそんなことはないようで、その点はとりあえず良かった。

0 件のコメント:

コメントを投稿