Skip to main content

LG3D、Java3D、独自PureJa vaエンジンでのMQOレンダリング結 果

6 replies [Last post]
Anonymous

Reply viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
Yuichi SAKURABA

こんにちは、中口さん。さくらばです。

On Mon, 17 Oct 2005 00:22:42 +0900
Takao Nakaguchi wrote:
> Zテストがうまく行ってないように見えます。
> lg3d環境では、レンダリング関係の、なにか特殊なフラグが設定
> されてたりするんでしょうか。
> 一応RenderingAttributesのsetDepthBufferEnable()と
> setDepthBufferWriteEnable()はいじってみましたが、
> 結果は同じでした。

Java3D のバージョンはいくつを使っていますか?
西本さんの blog に Z テストがうまくいっていない例が出ていま
すが、Java3D のバージョンに依存するようなことが書いてありま
したけど。

http://cappuccino.jp/keisuken/logbook/20050918.html#p02
http://cappuccino.jp/keisuken/logbook/20050921.html#p03

---------------------------------------------------------------------
To unsubscribe, e-mail: interest_ja-unsubscribe@lg3d.dev.java.net
For additional commands, e-mail: interest_ja-help@lg3d.dev.java.net

NISHIMOTO Keisuke

西本です.

MQOモデルローダすばらしいですね.私も興味があります.

Yuichi SAKURABA wrote:
> On Mon, 17 Oct 2005 00:22:42 +0900
> Takao Nakaguchi wrote:
>>Zテストがうまく行ってないように見えます。
>>lg3d環境では、レンダリング関係の、なにか特殊なフラグが設定
>>されてたりするんでしょうか。
>>一応RenderingAttributesのsetDepthBufferEnable()と
>>setDepthBufferWriteEnable()はいじってみましたが、
>>結果は同じでした。
>
> Java3D のバージョンはいくつを使っていますか?
> 西本さんの blog に Z テストがうまくいっていない例が出ていま
> すが、Java3D のバージョンに依存するようなことが書いてありま
> したけど。
>
> http://cappuccino.jp/keisuken/logbook/20050918.html#p02
> http://cappuccino.jp/keisuken/logbook/20050921.html#p03

どうもJava3Dのバージョンによる原因だけではないように思ってい
ます.Java3Dのバージョンによって違うのも事実ですが.

現象だけお伝えしておきますと,

----

確認環境:
RADEON9600, Windows 2000
Java3D: java3d-1_4_0-build5-windows-i586.zip
LG3D: lg3d-daily-dev-0-7-0-linux-i686-0506240938.tar.gz

日記でいうZテストがうまくいっていると思われれてた環境です.

1.Component3D(ボタン)を,GlassPanelなどの手前に配置したケース

添付1(button_top.png): 画面上部で表示したとき
添付2(button_bottm.png): 画面下部で表示したとき

添付2の[<<前][>>後]ボタンのGrassPanelが後ろのパネルのテクス
チャに隠れてしまっています.

2.resources/models/galleon.objを表示した例

添付3(galleon.png)

galleon 3Dオブジェクト(ModelLoader)自体は,正常に表示されて
います.galleon自体はかなり手前に配置しています.

----

経験則として,Component3D系のオブジェクトをかなり近い距離で
配置すると,この現象が発生します.

Java3DGraphやShape3D系での詳しい調査はしていないので,この現
象が出るかどうか分かりません.

---------+---------+---------+---------+---------+---------+----------
NISHIMOTO Keisuke
[button_top.png]
[button_bottom.png]
[galleon.png]
---------------------------------------------------------------------
To unsubscribe, e-mail: interest_ja-unsubscribe@lg3d.dev.java.net
For additional commands, e-mail: interest_ja-help@lg3d.dev.java.net

Takao Nakaguchi

中口です。
こんばんは。

NISHIMOTO Keisuke wrote:
> MQOモデルローダすばらしいですね.私も興味があります.

ありがとうございます。
MQOのローダくらいあると思ってたんですけど、意外と見あたらない
もんですね。

> どうもJava3Dのバージョンによる原因だけではないように思ってい
> ます.Java3Dのバージョンによって違うのも事実ですが.

lg3d-fcs-rel-0-7-0-generic-0506241329
と
java3d-1_4_0-build4-windows-i586
java3d-1_4_0-build5-windows-i586
java3d-1_4_0-build6-windows-i586
java3d-1_4_0-pre7-0509200059-windows-i586-vc
java3d-1_4_0-beta1-windows-i586
の組み合わせ、

D:\unzipped\lg3d-daily-dev-0-7-1-windows-i586-0510170035
と
java3d-1_4_0-beta1-windows-i586

でやってみましたが、同じでした。
java3d-1_4_0-beta1-windows-i586
上でlg3dと等価のクラスを使った場合は、正常に表示されました。

う〜む。何でしょうね。

> 現象だけお伝えしておきますと,

感謝です。参考になります。
ちなみに、うちの環境は、
WinFast A170(GeForce4 MX)
Windows 2000
Athlon 1900+
です。

---------------------------------------------------------------------
To unsubscribe, e-mail: interest_ja-unsubscribe@lg3d.dev.java.net
For additional commands, e-mail: interest_ja-help@lg3d.dev.java.net

hideya
Offline
Joined: 2003-07-22

ひでやです.

中口さん, 西本さん,こんにちは.

Zテストの不具合の件,思い当たるフシをご連絡いたします(細かいところ,間違っていたらごめんなさい).お送りいただいた添付の画像を見られなかったので,見当違いのことを長々と書いているかもしれませんがご容赦ください...

LG3Dでは,SceneManagerがFrame3Dに対してマウスが抜けた時に半透明にする効果を,強引に付加します.マウスが再度Frame3Dに入った時には,不透明なジオメトリは完全な不透明に戻るハズなのですが,もしかしたらそこにバグがある可能性があります(つまり,かすかに半透明になってしまっている).

半透明のジオメトリの描画は,不透明なジオメトリの描画の後,遠方から近方に向かって行われます.その際Zテストは行いますが,Zバッファの更新はしなかったと思います.たとえかすかに半透明でも,この要領で描画されます.

遠方から近方に向かって描画するために,ソーティングをするわけですが,そのソートの単位はShape3Dです.ソートの際の比較は,視点とShape3Dの中心の間の距離をベースに行われたと思います.この「Shape3Dの中心」は,デフォルトでは,Java 3Dがジオメトリを元に計算するShape3DのBoundsの中心だったと思います.

ここで,たとえば,半透明薄緑色のタスクバーと右端のLG3D終了のボタン(透明を含むPNG画像なので,半透明のジオメトリとして扱われます)の描画を考えた場合,両方とも半透明なので,ソーティングの後,遠方から描画することになります.が,が,タスクバー本体の中心は,右端のLG3D終了のボタンの中心より視点に近いので,LG3D終了のボタンの方がタスクバーより先に描画されてしまいます.つまり,順番が逆になってしまいます.

半透明なジオメトリを描画する際のトランスペアレンシーソーティングは「大筋OK」でしかないというのはご存知のことかと思います(多数の半透明なジオメトリを,見た目正しく且つ効率的に描画するのは非常に難しい問題).ですので,LG3Dのように半透明を使いまくると,アラが目立ち始めます.

上のような理由で,たとえば,Lg3dHelpを移動したりして揺らしつつ,本体と右上のボタンの描画の順番をよく見てみると,順番が視点からの距離で入れ替わっているのが分かるかと思います(本体の色が透明に近いので,あまり露骨には分かりませんが,ボタンの色が薄くなったり濃くなったりするので分かります).

ちなみに,タスクバーでは,タスクバー本体のBoundsをウソついて,Java 3Dに先に本体を描画するように仕向けています.具体的にはGlassyTaskbarの以下の行です:
https://lg3d-core.dev.java.net/source/browse/lg3d-core/src/classes/org/j...
[code]
// Move the bounds of the bottomBar back so that the transparency sorting
// in Java 3D renders it first and the icons second.
// This also requires a bug fix which is in Java 3D 1.3.2
bottomBar.setBoundsAutoCompute(false);
bottomBar.setBounds(
new BoundingBox(
new Point3f(-0.5f * width, -0.5f * barHeight, -0.5f),
new Point3f( 0.5f * width, 0.5f * barHeight, 0.0f)));
[/code]
ほかにも数箇所,上と同じような処理を加えているところがあります.

話が長くなりましたが,以上のような状況に結構悩まされましたので,ご報告の「Zテストの不具合」に見える原因は,もしかしたら「SceneManagerの半透明化効果」+「Java 3Dのトランスペアレンシーソーティングのクセ」の悪さに陥ってしまっているかも,と思いました.

これを簡単にチェックする方法があります.SceneManagerによる半透明にする効果を強引に無視させます.そのためには,以下のようなFrame3Dの派生クラスを作っていただいて,これにMQOのローダの本体を追加してみてください.これでSceneManagerがトランスペアレンシーをいじらなくなります.
[code]
class Frame3DWithoutTransparencyAnimation extends Frame3D {
public void changeTransparency(float transparency, int duration) {
// ingnore
}
}
[/code]
これで状況が改善しましたら,「SceneManagerの半透明化効果」+「Java 3Dのトランスペアレンシーソーティングのクセ」が悪の根源です.その場合,当面は,上のようなFrame3Dでお茶を濁してくださいっ(汗)

Java 3Dのトランスペアレンシーソーティングの問題に関してはPaul ByrneがJava 3Dのチームと話をして,状況を改善するための仕組みをJava 3D 1.4に入れる(入れた)と聞いています(半透明のジオメトリの描画順番のソートのポリシーを指定できるようになる,と聞いた気がしますが,まだ具体的にはAPIをみていません).問題は完全にはなくならないですが,Boundsをウソつくといった極めてHackyな対応はしなくてよくなるハズです.それをどのようにLG3D側に見せるかは,現在検討中です.

以上,長くなりましたが,ご参考になれば幸いです.
(ご報告の問題に似た状況に私もハマりまくりました...)

ひでや

Takao Nakaguchi

こんばんは、ひでやさん。

interest_ja@javadesktop.org wrote:
> これで状況が改善しましたら,「SceneManagerの半透明化効果」+
> 「Java 3Dのトランスペアレンシーソーティングのクセ」が悪の根源です.
> その場合,当面は,上のようなFrame3Dでお茶を濁してくださいっ(汗)

完璧です!!
正常に表示されるようになりました。

半透明はやっかいですよね。
Shape3D一つでも、モデルが複雑だと同じ問題が起こったので、
そういう場合、面単位でソートして描画しないとだめですね。

ともあれ、これで次に進めます ^^;
ありがとうございます。

[boyOnLG3D_notransparency.jpg]
---------------------------------------------------------------------
To unsubscribe, e-mail: interest_ja-unsubscribe@lg3d.dev.java.net
For additional commands, e-mail: interest_ja-help@lg3d.dev.java.net

NISHIMOTO Keisuke

ひでやさん,こんばんは.

ソートによる問題だとは思っていたのですが,いろいろモヤモヤ
していた事が解決しました.ありがとうございます.
ちょっと試してみます.

Takao Nakaguchi wrote:
> interest_ja@javadesktop.org wrote:
>> これで状況が改善しましたら,「SceneManagerの半透明化効果」+
>
> > 「Java 3Dのトランスペアレンシーソーティングのクセ」が悪の根源です.
> > その場合,当面は,上のようなFrame3Dでお茶を濁してくださいっ(汗)
>
> 完璧です!!
> 正常に表示されるようになりました。

うまくいくようになりましたね:-).

---------+---------+---------+---------+---------+---------+----------
NISHIMOTO Keisuke

---------------------------------------------------------------------
To unsubscribe, e-mail: interest_ja-unsubscribe@lg3d.dev.java.net
For additional commands, e-mail: interest_ja-help@lg3d.dev.java.net