質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Q&A

1回答

1485閲覧

JAVAFXのMeshViewについて

tsugutsun

総合スコア6

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

0グッド

0クリップ

投稿2017/04/01 13:28

javafxでSTLファイルから読み込んだ3Dモデルに対していろいろしたいと思ってツールを作成しています。

読み込んだモデルに対して丸だったり四角だったりの物体をクリックしたら配置するようにしたいのですが、
その際に、配置した物体の一部分がモデルを貫通してしまうので、貫通している部分を削りたいのですが、
貫通している部分の面情報を取得することはできないのでしょうか?
重なっている部分が取れれば、その面情報をTriangleMeshから削除すればいいのかなと思っています。

作成中のコードは以下になります。

java

1//MeshView1のクリックイベント 2meshView.addEventHandler(MouseEvent.MOUSE_PRESSED, e -> { 3 //クリック時に長方形生成 4 FXCylinderMesh cylinder = new FXCylinderMesh(); 5 TriangleMesh cylinderMesh = cylinder.getMesh(); 6 7 MeshView cylinderView = new MeshView(); 8 cylinderView.setMesh(cylinderMesh); 9 10 try { 11 CSG childCSG = Mesh2CSG.mesh2CSG(cylinderView); 12 13 MeshContainer fxMexhContainer = childCSG.toJavaFXMesh(); 14 cylinderView = fxMexhContainer.getAsMeshViews().get(0); 15 16 } catch (IOException e1) { 17 e1.printStackTrace(); 18 } 19 20 // 色を設定 21 PhongMaterial spMaterial = new PhongMaterial(); 22 spMaterial.setDiffuseColor(Color.BLUE); 23 cylinderView.setMaterial(spMaterial); 24 cylinderView.setDrawMode(DrawMode.FILL); 25 26 //長方形を置く位置を設定(クリックした箇所) 27 cylinderView.setTranslateX(e.getX()); 28 cylinderView.setTranslateY(e.getY()); 29 cylinderView.setTranslateZ(e.getZ()); 30 31 //MeshView1とMeshView2の貫通している部分を取得 32 33 //MeshView2の貫通部分を削る 34 35 //ルートに追加 36 root.getChildren().add(cylinderView); 37 38}); 39

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

FXCylinderMeshはJavaFXの標準クラスではなく

org.eclipse.eavp.geometry.view.javafx.render.FXCylinderMesh

でしょうか?自分はそうした独自のライブラリーについてはわかりませんので標準のJREに含まれているものという前提でコメントいたします。

貫通している部分の面情報を取得することはできないのでしょうか?

リファレンスを見る限り、おそらくそうしたことを簡単にやってくれる機能はなさそうです。Node#clipプロパティーで自動的に除外できたら便利かもと思ったのですがリファレンスには「clipは2D前提クリッピング用です」と書いてあるので駄目みたいです。

なおコードを拝見する限りでは表面を不透明にしておられるようなので表示上の話に限ればShape3Dオブジェクトどうしのどの部分が重なり合っているかを気にする必要はないと思います。しかし表示がどうなるかではなく、モデリング機能として重なった部分を除外したいということなら、前述したとおり3Dでの陰面消去結果の面情報などを提供する機能はなさそうなので、自前で計算するしかなさそうですね。

投稿2017/04/01 14:11

編集2017/04/02 06:18
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsugutsun

2017/04/02 05:28

回答頂きありがとうございます! やはり自分で計算して出すしかないですかね・・・。 なんとかやってみます。ありがとうございました!
KSwordOfHaste

2017/04/02 06:21

いざやろうとすると面倒そうですね。単なる個人的印象ですがOpenGLのような他のライブラリーの機能を拾い読みしたりすると、それに比べてJavaFXはかゆいところに手が届くほどには機能は豊富でないのかなと思います。
KSwordOfHaste

2017/04/03 16:08

3Dベクトルについての基本演算(大きさ、内積、外積)やアフィン変換機能はJavaFXの中にもありますが、それ以上の幾何計算、例えば直線と平面の交点、平面と点との距離、平面どうしの交線などは直接利用できるような形で含まれてなさそうです。一般的な演算なのでおそらく誰かが既に書いたものがある気がするのですが(真剣に探したことがないせいか)自分はこれまで見つけたことがなく探すより自分で書く方を選んでました。
tsugutsun

2017/04/05 11:05

検索の仕方が悪いのか、確かになかなか見つからないです。そもそも考え方として私は間違えているのかなと思ってきました。1つの物体に対して別の物体を乗せて、貫通している部分を削るのではなく、最初から乗せたい物のクリックした位置の一定範囲の面を取得して、その情報からポリゴンを作る?など他のやり方も含めて考え直しています・・・。
KSwordOfHaste

2017/04/05 11:44

ご質問に挙げておられるページでは「モデルの表面に巻き付くひも」のモデリング例が載っていますが、ひもの結節は球になってて、この球をモデル表面にくっつくように配置するという考え方でできていると思います。 > 最初から乗せたい物のクリックした位置の一定範囲の面を取得して、その情報からポリゴンを作る? つまりはそういう考え方で設計されているような気がしますね!
tsugutsun

2017/04/05 14:44

面の情報をうまく取得する方法を考える必要がありますね・・・。検討してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問