1

回転する基本的な質問 - 2 つの図形 (立方体のどこにでも球体があるボックス/立方体) を結合して、これらの 2 つが回転的に結合されるようにする方法 (そのため、球体を結合したくないのはそのためです)。立方体の中心にあります) 視点で。

つまり、立方体をマウスで回転させて球体を手前に「持ってくる」(たとえば 180 度回転させる) と、それに応じて遠近法が変わり、視覚的に球体が大きくなります (上の位置と比較して)。戻る)?

何人かの ScalaFX 専門家に尋ねたところ、どちらも非常に良い質問であり、ここに投稿することを勧めました。

乾杯:

ザー

>

4

6 に答える 6

1

あなたが何をしようとしているのかは完全にはわかりませんが、それらすべてのオブジェクトを含む にRotate変換を適用することで、複数のオブジェクトを回転させることができます。Groupすべてではなく一部のオブジェクトのみを回転させたい場合は、回転するオブジェクトが共通の親を持つようにシーンを構成する必要があります。つまり、回転Groupしないオブジェクトは親に属しません。Rotateその親に変換を適用するGroupと、その子オブジェクトもすべて回転します。回転は、その親の原点を中心に行われGroupます。

更新: 視点の問題に対処する方法について言及するのを忘れていました。遠近法はシーンのレンダリング方法のプロパティであるため、シーン内の 3D オブジェクトは遠近法の影響を直接受けません。このレンダリングはCameraオブジェクトによって実行されます。パースペクティブを使用してシーンをレンダリングするには( JavaFX / ScalaFXで参照されるように、直交または平行を使用するのではなく)、 をシーンに追加し、そのカメラを使用してシーンを表示します。詳細については、次を参照してください。JavaFX 3D グラフィックスの概要: カメラPerspectiveCamera

更新 2 : これを行うための完全なプログラムを含むGist を GitHubに作成しました。

更新 3 : ボックスを透明にし、球体をボックス内に移動しました。マウスの左/主ボタンをドラッグすると、ボックス + 球体が回転します。マウスの右/副ボタンでカメラ ドリーをボックスに近づけたり遠ざけたりして、それに応じて視点を変更します。

更新 4 : 3D シーンの形状を変換して、遠近法が適用されているかのように見えるようにする必要があります。私はその権利を持っていますか?

その場合、これが「組み込み」機能ではない理由は、以下に概説する理由によるものです。ちなみに、これをすべて知っている場合はご容赦ください-私は包括的な答えを提供しようとしています. :-)

  • シーン グラフ( JavaFXなどの保持モードの 3D システムで通常使用される) は、階層ツリー構造で 3D シーンのジオメトリ、位置、回転、色などをキャプチャします。モデラーは、シーンの内容についてのみ心配する必要があり、寸法、位置合わせなどが正しいことを確認する必要があり、シーンがどのようにレンダリングされるかについて心配する必要はありません。
  • パースペクティブは、特定の視点から見えるようにシーンをレンダリングするときに適用できます。つまり、シーンがGUIウィンドウなどの 2D プロジェクションに変換されるときです。(シーンが遠近法でどのように見えるかを決定するプロセスは、レンダリングアルゴリズムの一部ですが、シーンの変更や変形などは必要ありません) 。消失点、明らかなスケーリングなど。ここでの重要な点は、シーン自体がどのように表示されても影響を受けないことです。
  • この配置により、同じシーンの複数のビューを持つことが可能です。それぞれが異なる視点を持つことができるだけでなく、直交するものもあれば遠近法を使用するものもありますが、それぞれが混乱するアーティファクトなしでシーンを正しくレンダリングできます。あなたが思っているように機能した場合、その唯一の視点から正しく見えるようにするには、レンダリング中にシーンを変形する必要があるため、一度に 1 つのシーンしか表示できません。シーンを編集するときは、モデラーが驚くような混乱を避けるために、これらの変形を削除する必要があります。

要するに、遠近法でどのように見えるかを示すためにシーン自体を変形するという非常に珍しい要件です。そのため、私が知っているどの 3D システムにも、これを行うための機能が組み込まれていません。

JavaFXを使用して先に進みたいと仮定すると、次の点に注意してください。

  1. 通常の 3D プリミティブ (つまりBoxSphere& Cylinder) を変形して、それらの透視図を表すことができるとは思いません。TriangleMeshおよびオブジェクトを使用して形状を構築する必要がありMeshViewます (前者は形状のジオメトリをキャプチャし、後者はそれを 3D 形状として扱うことができます)。
  2. 遠近法を適用するには、インスタンスの頂点を再配置してTriangleMesh、シーンを適切に変形する必要があります。視点を変更したり、ボックスと球体を回転させたりする必要がある場合、計算された頂点座標が視点や回転の変化に反応するように、これらの変更は動的である必要があります。パースペクティブ拡張のレベルが高いと魚眼効果が発生するため、予想よりも多くの頂点が必要になる場合があります。
  3. 要件を考えると、シーンを表示するにはカメラが必要です。明らかに、シーンのレンダリングに を使用することはできませんPerspectiveCamera。そうしないと、シーンが調整されていないものとして扱われ、第 2 レベルの遠近法が適用され、慎重に計算された変形が台無しになります。ParallelCamera次に、 を使用してシーンの直交ビューを生成する必要があります。
  4. 残念ながら、JavaFXの 3D シーンでの使用に対するサポートParallelCameraは、まだ非常に未熟です。(ParallelCameraは主に、ダイアログ、ボタン、メニュー、スライダーなどの 2D シーンをレンダリングするために使用されます) 実際には使用が難しいと感じるかもしれません。PerspectiveCamera(非常に狭い視野を利用し、カメラをシーンから少し離すことで、を使用して正射影を近似することができます。また、画像が消えないようにクリッピング プレーンを調整する必要があります。)
  5. 最後に、ある時点で、遠近法変形に使用される視点と同じ位置にカメラを配置できる必要があります。カメラがその視点と同期すると、シーンは直交してレンダリングされますが、意図したシーンの正しい透視投影として表示されます。カメラと視点が離れていると、シーンが不自然で歪んで見えますが、それはあなたの意図であることは理解しています。

要約すると、あなたがやろうとしていることは些細なことではなく、実装はStackOverflowの回答の範囲をはるかに超えていると言えます。幸運を!

于 2017-02-01T14:33:35.360 に答える