Skip to main content

オブジェクトの位置の自動補正について

3 replies [Last post]
mcs03005
Offline
Joined: 2004-09-12

Reply viewing options

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

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

On Sun, 24 Oct 2004 03:12:28 EDT
interest_ja@javadesktop.org wrote:
> オブジェクトを3D空間上に配置するたびに、
> 自動的にオブジェクトの位置が補正されてしまうのです。
> あとからオブジェクトを追加すると、今まで表示されて
> いたオブジェクトが、わずかに手前のほうに
> 移動してしまうのです。
>
> なんとかしてこの自動処理をOFFにしたいのですが、
> 方法がなかなか見つかりません。

この処理は SceneManager が行なうので、Off するのは難しいと思
います。SceneManager はオブジェクトが重ならないように、z 座
標をずらしてオブジェクトを配置しています。nakamura さんが仰
られる位置の補正というのはこのことだと思います。

# 同じ z 座標だったら 2D のウィンドウシステムと同じですよね。

SceneManager が行なっているので、一般のアプリケーションから
それを抑制させるというのは難しいのではないでしょうか。

もう少し具体的に話をします。LG3D の現在のデフォルトの
SceneManager は GlassySceneManager です。GlassySceneManager
は表示する Frame3D を貼るために Container3D を派生させた
StarndardAppContainer を持っています。

この StandardAppContainer のレイアウトマネージャが ZLayeredLayout
になっています。ZLayeredLayout のレイアウト処理は次のように
なっています。

public void layoutContainer(Container3D cont) {
float z = 0.0f;

// FIXME -- deal with the possible race condition
for (int i = cont.numChildren() - 1; i >= 0; i--) {
Component3D comp = (Component3D)cont.getChild(i);
float d = comp.getDepth() * 0.5f;
Vector3f trans = comp.getTranslation();
z -= d;
trans.z = z;
comp.changeTranslation(trans, 350);
z -= d;
z -= spacing;
}
}

つまりオブジェクトの奥行きに応じて z 軸座標を変更していること
がお分かりだと思います。

SceneManager が持っている StandardAppContainer をアプリケー
ションから取得できれば、レイアウトマネージャを変更することも
できるのですが、今の実装ではそれもできないようです。

解決策としては
・自前の SceneManager を作り、ZLayeredLayout を使わないように
する
・あきらめる ^^;;

ZLayeredLayout や StandardAppContainer を書き換えてしまうとい
う方法もありますが、お勧めはできません。

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

mcs03005
Offline
Joined: 2004-09-12

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

とても詳細な返事をどうもありがとうございます。
お礼が遅くなってしまって申し訳ありません。

初めての書き込みでいきなりわからないことを質問するなんて、非常識でしたね。

今回の疑問に関しては、GlassySceneManagerクラスやDisplayServerControlクラス、SceneManagerBaseクラスなどには目を通したのですが、StandardAppContainerクラスやZLayeredLayoutクラスの存在までは突き止めることができませんでした。
調査不足でしたね。。。

さくらばさんのおっしゃるとおり、既存のクラスのコードを直接書き換えるようなことはしないほうがよいと思いますので、なんとかしてオリジナルのクラスを用意して目的を果たせるようにがんばってみます。

本当にどうもありがとうございました。

sakuraba
Offline
Joined: 2003-06-17

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

> 初めての書き込みでいきなりわからないことを質問するなんて、非常識でしたね。

ぜんぜん OK です。どんどんやりましょう (^^)/

> さくらばさんのおっしゃるとおり、既存のクラスのコードを直接書き換えるようなことはしないほうがよいと思いますの
> で、なんとかしてオリジナルのクラスを用意して目的を果たせるようにがんばってみます。

確かにコアのクラスを自分用に書きかえるのはあまりよくないと
思うのですが、コアのクラスの機能がそれでいいかどうかはまた
別の話だと思います。

位置の補正に関してはある意味しかたないと思うのですが、補正
をどのように行うかは議論してもいいのではと思っています。
たとえば、補正量や補正のためのアルゴリズムなどです。また、
こられを切り替えられるようにするべきかなどについても議論で
きると思います。

今はまだコアの部分も固まっていないようなので、リクエストを
あげるなら今がチャンスではないでしょうか。