• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ボタンクリックで設計変更に応じるJava3D物体を作るには???)

ボタンクリックで設計変更に応じるJava3D物体を作るには???

このQ&Aのポイント
  • ボタンをクリックすると、予めモニタ上のパラメータ欄に入力した数値に応じて、Java3D behaviorで描いた物体のサイズが変わるプログラムを作りたい。
  • しかし、設計変更後のデータの反映の方法や、CHANGEボタンをクリックする度に形状を変える方法、そして物体名称欄など入力しない箇所は変更できないようにする方法について困っています。
  • 完成イメージやソースコードは以下のサイトに掲載しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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); 初期条件の部分は全てコメントアウトにしても可。 条件変更後の部分のコメントをはずす。 こんな感じでしょうか…。

taihey
質問者

お礼

lailai2580さん、教えていただいた方法にて、取り組んできた回転機械の構造の3Dbehaviorプログラムにも使ってみました。 その結果、こちらの方も上手く作動して同様の結果を得ることができました。ありがとうございました。 尚、3Dbehaviorではなく、3DRotationInterpolatorで取り組んでいるプログラムにもトライしてみましたが、私の未熟さのためにまだできていません。しばらく、考えてみますが、また別の質問をさせていただくことになろうかと思います。また、よろしくお願いいたします。

taihey
質問者

補足

lailai2580さん、ありがとうございました。 お陰様にて今回の課題に対し私が掲げた問題点の全てを解決することができました。 教えていただいた記述を加えソースコードを変更し、第3回修正としてサイトに追加するとともに、イメージも最新修正版に置き換えました。 パラメータ・データを変更入力後にCHANGEボタンをクリックするとイメージが変わります。 本当にありがとうございました。 テーマ1件あたり同一の回答の方にはお礼ポイントは1件しか付けられないとのOKWaveの決まりがあるようですので最終回答 ANo.4 について贈らせていただきたいと思います。 尚、教えていただいた方法を目下取り組んでいる回転機械の構造を3Dbehaviorプログラムに早速適用させて同様の結果になるかトライしてみます。 また、近々今度は3Dbehaviorではなく、3D回転アニメーションに適用させたいと思いますが、behaviorとInterpolatorとではコーディングが多少異なると思いますので、また自分で解決できないときには機会を改めて教えていただくことになろうかと思います。そのときはよろしくお願いしまう。

その他の回答 (3)

回答No.3

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メソッドを使って頑張るしかないように思えます。

taihey
質問者

補足

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で書かれた方法でプログラミングして示していただけるとありがたいのですが。 勝手なお願いで申し訳ありませんが、よろしくお願いいたします。

回答No.2

No.1です。 間違えましたので訂正を。 ×:actionPerformed(ActionEvent e){ ○:public void actionPerformed(ActionEvent e){

回答No.1

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); で可能です。

taihey
質問者

補足

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/question6.html

関連するQ&A