[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Java3Djp:01644] Re: Z 座標値の取得について2



 〜 12月1日新しいビジネスが始まる!ビジネスも楽天、楽天ビジネス誕生 〜
         ●●●●●●●●●●●●●●●●●●●●●●●●●●●
         ● サービスリリース第一弾!ビジネスサービス商談市場 ●
         ●●●●●●●●●●●●●●●●●●●●●●●●●●●
〜〜〜〜〜 今すぐアクセス! http://business.rakuten.co.jp 〜〜〜〜〜
----------------------------------------------------------------------


渕田@鹿大情報です

#マルチレスですが、

> 質問の内容というのはこの前教えて頂いたSimpleUniverse
> 内の物体のZ座標値の取得方法についてなんですが、
> 方法としては↓の方法で取得することが出来たのですが
> 処理のスピードが余りにも時間がかかりすぎるので、
> もっと早く計算できる方法はないでしょうか?

「余りにも時間がかかりすぎる」というのはどういう状況だろうと
疑問だったのですが、

> 成功したのですが、疑問が発生しました。
> 計算に異常に時間がかかったのです。
> Pickする物体がこの前のいしいさんのサンプルの
>
> Point3f[] p = {new Point3f( 0.0f,  0.6f, 0.0f),
>                    new Point3f(-0.6f, -0.3f, 0.5f),
>                    new Point3f( 0.6f, -0.3f, 1.0f) };
>
> でしたら、1秒もかからないのですが、私がPickしようとしている
> 物体はファイルから1万点の座標を読み込んでノードとしてぶら下げて
> いるので、1点を計算するのに5秒はかかります。
> これはやはり物体が複雑になったためなのでしょうか?
> どなたか、分かる人がいらっしゃれば意見を聞かせて下さい。

この文から推察するに、1万点の座標からなる立体の
表面座標を取得しようとして、「時間がかかる」という話
だったのでしょうか。
私が以前に紹介した以下のページ、

  http://suuri.ics.kagoshima-u.ac.jp/research/3d/java3d-topics/index.html

の [2000.1.21] でも指摘しているとおり、[2000.1.20] の方法は
内部でクイックソートによる面の並べ替えを行っています。
一般にクイックソートは O(n log_2(n)) の時間がかかるので
(要素がランダムに存在する場合)、
並べ替える要素数が4倍に増えると時間は8倍に、
要素数が8倍に増えると時間は24倍になります。(およそ)
したがって、面1つではたとえば 1[ms] を要したとすると、
面数が 10000 倍になると時間は、

   10000 * log_2(10000) => 132877.1238

で、約 133 秒かかる計算になります。
扱っている立体がどのようなものなのか分かりませんが、
1つの頂点に3つの面が集まっているとすると、1万点の頂点では
大体1万面程度が存在します(三角形で)から、上記の計算が成立し、
実行速度は目に見えて遅くなるわけです。

実際は、時間は並べ替えだけに要するわけではないですし、
シーングラフによるクリッピング処理などを行っていると思われますから、
ここまで遅くならないとしても、5秒程度はかかっても仕方ないのでは
ないでしょうか。

このような問題の場合、力技で全部の面の交点を求めるのではなく、
木構造などで立体を表しておいて、以下にうまく枝刈りを行うかが
重要になると思います。

それから最初のメールにも書きましたが、この方法は Java3D 1.1.3 の
頃のテクであり、最新バージョン 1.2 にはピック用のユーティリティが
標準で提供されているようですから、そちらを使うほうが正当な
方法だと思います。
私自身はすでに Java3D は使っていないので、新しいバージョン
についてはよく分かりません。(ユーティリティということですから、
ソースがついているのではないのでしょうか)

以上、コメントでした。
--
渕田孝康
鹿児島大学工学部情報工学科