重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

ボタンをクリックすると、予めモニタ上のパラメータ欄に入力した数値(半径・高さ・配置位置-X方向変位など)に応じて、Java3D behavior で描いた円錐・直方体・球のサイズが変るプログラムを作りたいと取り組み始めました。

しかし、下記の点などソースコードの具体的記述方法がわからず困っています。私が途中まで作成したソースコードのどの部分をどのように改めればよいか教えていただきたく、よろしくお願いします。

1) 入力した設計変更後データの反映のしかた(TextField欄の数値を条件変更後パラメータに与える方法)
2) CHANGEボタンをクリックする度に、設計パラメータに応じた形状に変える方法(Event処理のしかた)
更に、
3) 設計パラメータ一覧中で物体名称欄など入力しない箇所は変更できないように変える方法(現在は、TextFieldで記載しています。)

未完成の完成イメージとソースコードの何れも、下記のサイトに示します。
以上、よろしくお願いします。

URL: http://www.geocities.jp/java3dtest/QA06/question …

A 回答 (4件)

>3. パラメータ・データを変更したい場合に、パラメータ一覧中のデータを入力し、これらデータを認識させる(データを変更しない場合も、改めて一覧中のデータを認識させる)



R1,R2,R3,H1,H2,H3,D1,D3に入力欄の宣言時に初期値を与えておいて
データ変更されたら読み込むようにすれば可能です。
final TextField tfield02a = new TextField("0.30", 16);
R1 = 0.30f;
tfield02a.addFocusListener( new FocusListener() {
 public void focusGained(FocusEvent e) {
 }
 public void focusLost(FocusEvent e){
  String r1 = tfield02a.getText();
  R1 = Float.valueOf(r1); // float R1と宣言する必要はない(代入するだけで良い)
 }
});

4,5についてはCHAGEボタンを押された時のEventとして
createObjectsメソッドを呼べばどうにかなりそうな気がします。
まず、universeとrootの間に1つBranchGroup(仮にbgとします)をはさんで
rootを更新することで描画し直す感じです。

Sample3Dのメンバ変数としてbgとrootを宣言します。
BranchGroup bg = new BranchGroup();
BranchGroup root = new BranchGroup();
それと
private AmbientLight ambientLight = new AmbientLight();
これはprivateを取ってcreateObjectsメソッド内に入れて良いかと思います。

コンストラクタ内の最後あたりに
root = createObjects();
bg.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
bg.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
bg.addChild(root);
を追加して
universe.addBranchGraph( createObjects() ); を
universe.addBranchGraph(bg); に修正

またCHANGEボタンについては
final Button addbutton = new Button("CHANGE");
addbutton.addActionListener(new ActionListener() {
 public void actionPerformed(ActionEvent e) {
  bg.removeChild(root);
  root = createObjects();
  bg.addChild(root);
 }
});

createObjectsメソッド内では
rootを宣言した後にDETACHの許可を出します。
BranchGroup root = new BranchGroup();
root.setCapability(BranchGroup.ALLOW_DETACH);

初期条件の部分は全てコメントアウトにしても可。
条件変更後の部分のコメントをはずす。


こんな感じでしょうか…。

この回答への補足

lailai2580さん、ありがとうございました。

お陰様にて今回の課題に対し私が掲げた問題点の全てを解決することができました。

教えていただいた記述を加えソースコードを変更し、第3回修正としてサイトに追加するとともに、イメージも最新修正版に置き換えました。
パラメータ・データを変更入力後にCHANGEボタンをクリックするとイメージが変わります。

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

テーマ1件あたり同一の回答の方にはお礼ポイントは1件しか付けられないとのOKWaveの決まりがあるようですので最終回答 ANo.4 について贈らせていただきたいと思います。

尚、教えていただいた方法を目下取り組んでいる回転機械の構造を3Dbehaviorプログラムに早速適用させて同様の結果になるかトライしてみます。

また、近々今度は3Dbehaviorではなく、3D回転アニメーションに適用させたいと思いますが、behaviorとInterpolatorとではコーディングが多少異なると思いますので、また自分で解決できないときには機会を改めて教えていただくことになろうかと思います。そのときはよろしくお願いしまう。

補足日時:2008/07/30 10:52
    • good
    • 0
この回答へのお礼

lailai2580さん、教えていただいた方法にて、取り組んできた回転機械の構造の3Dbehaviorプログラムにも使ってみました。

その結果、こちらの方も上手く作動して同様の結果を得ることができました。ありがとうございました。

尚、3Dbehaviorではなく、3DRotationInterpolatorで取り組んでいるプログラムにもトライしてみましたが、私の未熟さのためにまだできていません。しばらく、考えてみますが、また別の質問をさせていただくことになろうかと思います。また、よろしくお願いいたします。

お礼日時:2008/08/01 09:30

No.1です。


修正版を拝見させて頂きました。

入力欄の背景色はsetBackgroundメソッドで指定可能です。
tfield00a.setBackground(Color.WHITE);
といった感じです。

CHANGEボタンクリック後にオブジェクトの位置や大きさを変える方法は分かりませんが、
おそらく前回回答したactionPerformedメソッド内に処理を追加すれば良いかと思います。
円錐の位置を変えるのであれば、
Transform3D pos = new Transform3D();
coneGroup.getTransform(pos); // coneGroupにくっついているTransform3Dオブジェクトを取得
pos.setTranslation(new Vector3d(Double.parseDouble(tfield03.getText()), 0.0, 0.0)); // 位置変更
coneGroup.setTransform(pos); // 反映??
のような感じになりそうな気がします。
もちろん、coneGroupには
coneGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
これをやっておく必要があります。

幅や高さを変更するにはオブジェクトを作り直すか、
Transform3DのsetScaleメソッドを使って頑張るしかないように思えます。

この回答への補足

lailai2580さん、早速、追加回答をいただきありがとうございました。

背景色につきましては、第2回修正欄に加えるとともにイメージ最新修正版に反映させました。
ありがとうございました。

CHANGEボタンのクリック後にオブジェクトの位置や大きさを変える方法について、Javaコードの記載方法の基本がわかっていない私ですが、自作の未完成ソースコードは以下のような考え方で構成させています。

1. 各オブジェクトに対するパラメータの初期値を予めプログラム内に与えておいて、この初期値に対応してグラフィック表示させておく
2. 同時に、この初期値はグラフィック上部のパラメータ一覧中に予め入力しておく
3. パラメータ・データを変更したい場合に、パラメータ一覧中のデータを入力し、これらデータを認識させる(データを変更しない場合も、改めて一覧中のデータを認識させる)
4. 全パラメータ・データをまとめて変更後データ群として、上記の1の初期値群と置き換える
5. CHANGEボタンをクリックした時点で、変更後データ群に基づくグラフィック表示をさせる

以上のような作業フローにて実行できるソースコードがJavaでできればと思うのですが、私は残念ながらコーディング方法に疎く、どのように記載していけばよいのか見当もつきません。

上記の1については、
private BranchGroup createObjectsコード内に「初期条件」として記載し、その後の各オブジェクトに対するプリミティブ・コントラクト(Cone、Box、Sphere)並びにVector3Dにデータとして与えるようにしています。

3については、例えば第1物体-円錐の半径であれば、public Sample3D中の下記部分でR1としてfloatデータとして認識させることができれば良いのではないかと考えました。

final TextField tfield02a = new TextField("0.30", 16);
tfield02a.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
String r1 = tfield02a.getText();
float R1 = Float.valueOf(r1);
}
});
uppanels[2].add(tfield02a, BorderLayout.CENTER);

但し、この記述ではR1がfloatデータとして認識されているかどうかも不明です。

4については、3で全パラメータ・データを認識させた後、これらをprivate BranchGroup createObjectsコード内で、条件変更後のデータとして第1物体-円錐の半径(R1)であれば、Rconeに置き換えて変更後データ群とします。(これらデータは現ソースコードでは // を付して読み込まれないようにしています。)

5については、CHANGEボタンをクリックした時点で上気4の変更後データ群に置き換えるようなevent処理ができれば変更後のグラフィック表示ができるのではないかと考えましたが、そのようなことができるのかどうか不明です。

以上記載のように、Java初心者の私ですから、lailai2580さんから教えていただいたactionPerformedメソッド内の記述方法を理解できず、解決に向けて近づけることができていません。

もし、私が記載したような上記の作業フローに基づくソースコードで実現できそうでしたら、第2回修正欄の未完成ソースコードを直していただけるでしょうか?

或いは、実現不可でしたらlailai2580さんがANo.3で書かれた方法でプログラミングして示していただけるとありがたいのですが。

勝手なお願いで申し訳ありませんが、よろしくお願いいたします。

補足日時:2008/07/29 10:29
    • good
    • 0

No.1です。


間違えましたので訂正を。

×:actionPerformed(ActionEvent e){
○:public void actionPerformed(ActionEvent e){
    • good
    • 0

1については分からないので、2と3について答えたいと思います。



2.
Event処理の仕方ですが、ActionListenerに登録するのはCHANGEのボタンだけで大丈夫です。
そのactionPerformedメソッドの中に1の処理を入れれば良いかと思います。
例えば
final Button addbutton = new Button("CHANGE");
addbutton.addActionListener(new ActionListener() {
 actionPerformed(ActionEvent e){
  System.out.println(tfield00a.getText());
 }
});
と書けば、CHANGEボタンを押した時にコンソール上に「物体名称」という出力が得られます。

3.
tfield00aの欄を変更できないようにするには、
tfield00a.setEditable(false);
で可能です。

この回答への補足

lailai2580さん、訂正版ご回答も含めご親切な回答ありがとうございました。
お教えいただいた方法にて、質問した同じサイト(下記)に第1回修正としてソースコードと実行結果を加えました。また、イメージ欄には修正最新版を掲載しています。

3につきまして
お教えいただいた方法にて、私の希望がかないました。
設計パラメータ一覧中で入力・変更したくない箇所をすべてを教えていただいた方法で直しました。これら箇所すべて背景色も「グレー」に変わり見やすくなりました。ありがとうございます。
但し、できることなら、入力・変更はしないですが、データ箇所の2ヶ所(第2物体に対する変位-X方向、第3物体に対する高さ(Y方向))の背景色をグレーとせずに、白色のままとすることが可能でしょうか?

1につきまして
お教えいただいた方法にてソースコードを改めました。ご回答には「CHANGEボタンを押した時にコンソール上に「物体名称」という出力が得られます。」ということでしたが、サイトのイメージ/修正最新版
で「CHANGEボタン」を押してもこの画面上に変化が表示されません。尚、eclipseで実行をさせると確かにコンソール上に「物体名称」と出力されることを確認いたしました。

未回答の3につきまして、私の前回の質問内容がわかりにくかったかと反省し、改めて下記します。

「サイトのイメージ/修正最新版の画像で設計パラメータ一覧中データ(背景色が白色の箇所です)を変更後にCHANGEボタンをクリックすると設計パラメータ一覧中データに基づいて3D-behavior(物体上にマウスを載せ操作すると物体が動く)で描かれた3物体のサイズ、配置X方向位置が変化するようにしたい」というのが私の希望です。

これを実現する方法(ソースコードの変更)を教えていただけると、私が現在取り組んでいる別の物体形状(より複雑構造をしています)に対しても可能と考えています。

以上、是非ご教示ください。

URL: ​http://www.geocities.jp/java3dtest/QA06/question …

補足日時:2008/07/28 11:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!