2017-06-20 10 views
1

私はJavaFXで3Dモデルを作成しています。私はthis guideに続き、私自身のデータを追加するときを除いて、すべてがピーチで動作しています。 buildMolecule()関数本体を交換する:JavaFX 3D for> 100万ボックスオブジェクト

Random rand = new Random(System.currentTimeMillis()); 
int dim = 10; 
int dimhalf = dim>>1; 
for (int i = 0; i < dim; i++) { 
    for (int j = 0; j < dim; j++) { 
     for (int k = 0; k < dim; k++) { 
      Box b = new Box(10, 10, 10); 
      b.setTranslateX((i-dimhalf)*10); 
      b.setTranslateY((j-dimhalf)*10); 
      b.setTranslateZ((k-dimhalf)*10); 
      b.setMaterial(new PhongMaterial(new Color(rand.nextFloat(), rand.nextFloat(), rand.nextFloat(), 1.0))); 
      root.getChildren().add(b); 
     } 
    } 
} 
最小限の作業例として、ガイド( double modifierFactor = 0.1;:あなたがガイドから欠落していた以下のクラス変数を追加する必要があります ノート)から前記サンプルアプリケーションを考えます

アプリケーションを実行します(私は追加のフラグ-Xmx6g -Xms6gを使用します)、その効果を見るためにdimの値で遊びます。ちらつきが発生した場合(SceneインスタンスのdepthBuffering = trueのために)、CAMERA_NEAR_CLIP = 100を設定してみてください。また、より大きな値のdimに対してCAMERA_INITIAL_DISTANCE-1500のように設定することもできます。

dim = 012の場合、初期レンダリングはまだ高速ですが、標準操作(LMBで回転、RMBで回転、MMBで変換)は不安定です。これは、最初のレンダリングには数秒かかるが、シーンとのやりとりは基本的に不可能になるまで、70になるまで暗くなるにつれて悪化し、悪化する。

私は100万〜1000万の間のどこかでレンダリングする必要がある状況に直面しています。(dim> = 100)Boxこれは可能ですか?パフォーマンスを向上させるために私が使用できるトリックはありますか?

興味のある人にとっては、基礎となるモデルはオクトリーです。

+0

パフォーマンスを向上させるためのトリックはありますか?はい。とにかく他の 'Box'sで覆われているすべての' Box'sを削除してください。これにより、dim = 20(3 *50²<20³) – fabian

+0

@ fabianのシーンのパフォーマンスでdim = 50のシーンをレンダリングすることができますが、残念なことにその形状は完全に直方体ではなく、ミニキューボイドは簡単な作業ではありません。しかし、まだ役立つかもしれません...一方で、私はまだdim 100に達することができません:( – Warkst

答えて

0

現在のアプローチの問題は、レンダリングシステムに関係なく、すべて管理、イベント検出、レンダリング/オクルードなど、100万個の独立した3Dシーングラフノードを追加することです。 このような超高密度3Dシーングラフの場合は、データポイントを表示するだけの方法で三角形が巻かれた単一の連続三角形メッシュにデータを変換する必要があります。間違いなく心の弱い人のためではありません。そのため、私たちはhttp://www.fxyz3d.org/レコにScatterMesh classというレポを作成して簡単にしました。

あり、このクラスにはサンプルがまだありませんが、ここでは2:05 of this videoで実証されたように、私はそれを使用する方法は次のとおりです。

DirectedScatterMesh periapsisMap3D =新しいDirectedScatterMesh(真のデータ、point3dSize、0); periapsisMap3D.setDrawMode(DrawMode.FILL); //ミニ三角形を固定します periapsisMap3D.setTextureModeVertices3D(1530、colorByAngleOut); // colorByAngleOutはx、yの数値を色にマッピングする関数です。

setTextureModeVertices3Dはあなたが関数で指定した色が正しい面にマッピングされるように、テクスチャに変換し、次いでPhongMaterialと3D構造の周囲に正確に巻かれるカラーマップを指定することを可能にします。

機能colorByAngleOut = P - > Math.abs(Math.atan2(PY、Math.sqrt(PX PX:あなたは、少なくともそれがどのように動作するかのアイデアを持っているので、以下

は私のcolorByAngleOut機能です+ pz p。z)))); //のJavaFXで 3次元Y - その逆> Zおよび

pがたPoint3Dであり、Iは、本質的に黄道面から宇宙船の角度を算出しています。

それがダウンしてそれに来るとき見せかけTriangleMeshあるこの全体の3D構造を、追加するには、他のオブジェクトのような3Dシーンに追加するのと同じくらい簡単です:

sceneRoot.getChildren()。追加(periapsisMap3D);

実際にビデオには、指示された四面体を可能にする修正されたバージョンのScatterMeshが表示され、追加のデータディメンションをレンダリングすることができます。これは現在のFXyzビルドではサポートされていませんが、オープンソースではないカスタム化です。

+0

私はHTML + JavaScriptで一度同様のことをしました。キャンバス上で、オフスクリーンキャンバスで1つのフルレンダリングサイクルを終了し、その結果をイメージ(メモリ内)にエクスポートしてマウス操作で基本的にイメージ上のビューポートを移動させました。 3Dオブジェクトでいっぱいのシーングラフからscattermeshを派生させる方法があるのでしょうか?私がレンダリングしているものの物理的な形状は非常に不規則です(実行時に毎回異なります)。難しい – Warkst

関連する問題