問題タブ [scenegraph]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
optimization - Scene graphs: recursion or iteration?
A colleague and I are talking about how scenes are typically rendered in complex games. He believes the world is rendered recursively in the truest object-oriented fashion, with the world's many actors each overriding a virtual function like Actor.Draw() (e.g. Koopa.Draw(), Goomba.Draw()).
By contrast, I imagined that complex games today would iterate over their scene graph, avoiding virtual function overhead and allowing more flexibility for specialized iterators (e.g. near-to-far vs. far-to-near, skipping certain objects in the tree, etc.) And my experience with OpenGL and DirectX suggested to me that they tend to draw objects in batch, and passing a batch context through a recursive call (i.e. the batch into which a class's Draw() function would draw) seemed like additional parameter-passing overhead that could be avoided with iteration.
Is one method favored over another nowadays? If so, why?
3d - java3d SceneGraph を動的に変更する
最近、java3D の作業を開始しました。現在、私は java3D レーシング ゲームに取り組んでいます。コンパイル済みのシーン グラフに、球体、ボックスなどのオブジェクト (つまり、シーングラフ ノード ノード) を追加できるかどうかを知りたかっただけです。
keyPress イベントまたはタイミング イベントでオブジェクトをグラフに追加したい場合、どうすればよいですか?
c++ - 4x4マトリックスを回転させると、時間の経過とともにスケーリングが発生します
glm::rotate
シーン内の立方体の変換行列を回転させるために使用しています。
"cube->t = glm::rotate(cube->t, stepTime * 50.f, glm::vec3(0.f, 1.f, 0.f));"
フレームごとに1回呼び出されます。ここcube->t
で、は問題のマトリックスです。
奇妙なことに、20分(またはのstepTime * 5000.f
代わりに回転する場合は2分stepTime * 50.f
)の間に、立方体はX軸とZ軸で顕著にスケーリングし、これら2つの軸のスケーリングは常に同じです(高さ)立方体のは変化しませんが、幅と深さはまったく同じ量だけ変化します)。の場合は5000.f
小さくなり、ノーマル50.f
またはの場合100.f
は大きくなります。
これは丸め誤差の問題かもしれないと思いましたが、それ以外は何が原因であるのかわかりません。この丸め誤差ですか?定期的に行列を正規化して解決できますか?glmには行列を正規化する関数がありますか、それとも自分で作成する必要がありますか?
c++ - Openscenegraph-それを超えるとカメラが進まない不可視の境界を作成する方法
私は3Dプログラミングに不慣れなので、ここに行きます。部屋をシミュレートしようとしています。壁の画像をロードしていませんが、コードで境界をシミュレートしたいと思います。どうすればこれを達成できますか?
以下は、カメラの動きを処理するコードです
webgl - 行列を使用してThree.jsシーングラフを変換する
ファイルからThree.js(Three.jsがサポートするものではなくカスタム形式)にシーンをロードしようとしています。この特定の形式は、ツリー内の各ノードに4x4行列として指定された変換があるシーングラフを記述します。それをThree.jsにプッシュするプロセスは次のようになります。
または、少なくともそれが私が望んでいることです。私が指摘したように、このapplyMatrix
線は私が期待するようには機能しません。シーンの大部分は問題ないように見えますが、回転された特定の要素が適切に配置されていません(他の要素は適切に配置されていませんが、奇妙です)。
COLLADAローダー(私がやろうとしているのとほぼ同じことを実行します)を見ると、マトリックスを変換/回転/スケールに分解し、それぞれを個別に適用しているように見えます。上記のapplyMatrixの代わりにそれを試しました:
これもまた、ほとんどの要素が正しい場所にあるが、以前は位置がずれていたメッシュがどこかで忘却に変換され、まったく表示されなくなったシーンを生成します。したがって、最終的には、これはapplyMatrix
上からの結果よりも優れているわけではありません。
このトピックに関するいくつかのオンラインディスカッションを見ると、変換に行列を使用するための推奨される方法は、ノードではなくジオメトリに直接適用することであるように思われるので、次のように手動で変換行列を作成してみました。
これは実際に正しい結果をもたらします!(法線のいくつかの癖を除いて、それを理解することができます)それは素晴らしいですが、問題は、シーン階層を効果的にフラット化したことです:親の変換を変更すると、子に予期しない結果が生じるため、これで、変換スタックがメッシュに「ベイクイン」されます。この場合、それはシーンに関する情報の許容できない損失です。
では、Three.jsに同じロジックを実行するように、ただしシーングラフの適切なポイントで実行するように指示するにはどうすればよいでしょうか。
(申し訳ありませんが、ライブコードの例をいくつか投稿したいと思いますが、残念ながら、この場合はオプションではありません。)
java-3d - java3d オブジェクトのピッキング
ユーザーがコードを知らなくてもカスタムシーングラフを作成できるJava3d GUIを構築しています。マウスを使用して特定のボックスを選択し、それらを移動できるようにしたい..そのためには、選択する必要があります..
私のシーングラフには、2 つのボックスと 2 つの球体があります。そのうちの1つを選び、どれが選ばれたかを知りたいだけです。特定の球体やボックスをクリックすると、クリックされたオブジェクトの種類を見つけることができますが、それがどのオブジェクトであったかを知る方法がわからないので、それを処理できます。
誰かが私に問題の解決策を提案できますか? 私が知りたいのは、どのオブジェクトが選択されたかを知ることだけです。それで全部です。
c++ - オブジェクトのレンダリング順序、シーングラフ?
OpenGLを使用して3Dオブジェクトをレンダリングしています。3Dワールドの各オブジェクトには、オブジェクトをパーツ座標系(PCS)からワールド(WCS)に変換するための境界ボックスと関連するモデルマトリックスがあります。バウンディングボックスもPCSにあります。各オブジェクトの重心はWCSで計算され、各オブジェクトに関連付けられます。
WCSでカメラの位置とターゲットの位置を指定します。->すべての不透明なオブジェクト(アルファ== 1)を前面から背面にレンダリングしたいと思います。->不透明なオブジェクトをレンダリングした後、すべての半透明のオブジェクトを後ろから前にレンダリングしたいと思います。
これがグラフィックエンジンを実装する最初の試みなので、シーングラフがここでどのように役立つかわかりません。カメラからの距離に基づいてオブジェクトを手動で並べ替えてから、不透明/半透明のオブジェクトに基づいて同じものをレンダリングする必要があると思います。本当にシーングラフが必要ですか?エンジンの実装はどのようにすればよいですか。利用可能な他のエンジンを使用することはできますが、使用したくないので、自分で実装したいと思います。
android - キャンバス操作と要素操作
一部のアプリケーションの基礎として小さなライブラリを開発しています。シーングラフ (2D) を作成しようとしているので、パフォーマンス、保守性、使いやすさなどの観点から、次のアプローチのどれがより有望に見えるか疑問に思っています.
- 各ドローアブル要素に、平行移動や回転などを実行するマトリックスを与えることができます。
- 要素ではなく、キャンバス上ですべてを行うことができました。
最初の解決策には欠点があります。描画呼び出しで行列を渡すことができない円のようなプリミティブ要素の場合、次のように行列から変換された値にアクセスする必要があります。
したがって、すべての描画呼び出しで、getter 呼び出しごとに float 配列を作成します (getX() 用に 1 つ、getY() 用に 1 つ)。画面上に多くの要素があると仮定すると、メモリとパフォーマンスに影響を与える可能性があります。
2 番目のアプローチには、「否定的な」考え方という欠点があります。要素を点 100/100 に描画する場合は、キャンバスを 0/0 に描画するように -100/-100 に変換する必要があります。その後キャンバスを元に戻すと、必要な 100/100 に要素が描画されます。この否定的な考え方がコードの保守性と理解の低下に大きな影響を与えるかどうかはわかりません (単に何かを否定するのを忘れてバグを導入することを考え始めたことさえありません...)。
誰かがどの方法を優先すべきかのヒントを持っていますか?
c++ - シーングラフのようなツリー構造をトラバースするにはどうすればよいですか?
私は私が持っているシーングラフを持っています:
したがって、Transformメソッドでは、ノードとそのすべての子の座標を変換したいので、最初にGetChildTransformStreamを使用してすべての子のリストを取得する必要がありますが、トラバースする方法がわかりません。子ノードはいくつでもあり、子ノードもいくつでも持つことができます。通常、これをどのように処理しますか?
javafx - javafxシーン.ルックアップ
既存の swing アプリを JavaFX に変換しています。このコードは「#paneRightBottom」というノードを返すと思いますが、null を返します。netbeans デバッガーを使用して、「topNode」をドリルダウンし、6 レベルの深さの「#paneRightBottom」ノードを見つけることができました。オンライン ドキュメントを読み、ノードを取得する必要があると考えています。誰かが私がどこで間違ったのか考えていますか?