私は Qt3D モジュールを初めて使用し、現在 Qt3D を使用して Qt5/C++ でゲームを作成しています。この質問は、「私は正しい道を進んでいますか?」に関するものです。または「...についてアドバイスをいただけますか」。
ゲームのシーンには、静的な部分 (「世界」) といくつかのオブジェクト (建物と可動ユニット) があります。一部の建物は将来的にアニメーション化される可能性がありますが、それらのほとんどは非常に静的です (もちろん破壊可能です)。
質問を 2 つの部分に分けます。シーン内の異なる位置に配置された同じモデルのコピーを処理する方法と、ビューア クラスでシーン全体を管理する方法です。
シーン内の冗長オブジェクト:
もちろん、オブジェクトは建物/可動ユニットの同じライブラリを共有するため、これらのオブジェクトのモデルをそのようなユニットのすべてのインスタンスのグラフィックス カードにアップロードするのはばかげています。QGLSceneNode のドキュメントを読みました。複数のシーン ノード間で同じ QGeometryData を共有するように設計されていると思いますが、シーン内の異なる位置にオブジェクトを配置するために異なる変換を適用します。建物のすべてのインスタンスに対して同じ QGLSceneNode を共有するのは間違った方法だと思います。
私は現在、建物/可動ユニットの各タイプのプロパティ、とりわけテクスチャを含むジオメトリを伝えるユニット「ライブラリクラス」を持っています。ここで、このライブラリ クラスの各建物に QGeometryData を提供します。これは、ゲームの読み込み手順でアップロードされます (起動時にすべての建物に対してこれを行うことにした場合)。
ユニットの新しいインスタンスを作成するとき、新しい QGLSceneNode を作成し、ライブラリから (明示的に共有されている) QGeometryData を要求し、それをノードに設定します。次に、この新しいノードの変換を設定し、シーンに配置します。これは、私の質問の 2 番目の部分につながります。
シーン全体を管理する:
私の「シーン」は現在、QGLSceneNode でも QGLAbstractScene でもありませんが、シーン内のオブジェクト (またはオブジェクトのコレクション) ごとに 1 つずつ、いくつかの QGLSceneNodes の構造体です。私は3つのアプローチを見ています:
私の現在のアプローチですが、それは「間違った方法」だと思います。
構成: すべてを子ノードとして 1 つのルート QGLSceneNode に配置します。このような構成で特定のノードにアクセスするのが非常に難しいことに気付くまで、これは私にとって正しい方法のように思えました。しかし、いつそのような「特定の」ノードにアクセスする必要があるのでしょうか? ほとんどの操作では、すべてのノードを考慮する必要があります (それらのレンダリング、アニメーションの位置の更新)、またはシグナルスロットベースで操作することさえできるため、手動でノードを見つける必要さえありません。たとえば、アニメーションは QPropertyAnimations を使用して実行できます。ゲーム エンジン コアの QObject (すべての建物はエンジンのコア部分の QObject) を対応する QGLSceneNode に接続することによって、イベントに作用することもできます。
しかし、このアプローチには別の欠点があります。レンダリング中に QGLPainter のいくつかのプロパティを変更する必要があるかもしれません。どのプロパティを変更する必要があるのか わかりません.これは、Qt3Dについて十分に知らず、プロパティを変更せずに何ができるかを推測できないためです(たとえば、特定のシェーダーを使用して特定のシーンノードをレンダリングする) .
その後、QGLAbstractScene を見つけましたが、シーンでのレンダリング プロセスを定義できないため、上記の 2 つのソリューションと比較しても利点がわかりません。しかし、それを定義する正しい場所ではないのでしょうか?
Qt3D でそのようなシーンを管理するための最良の方法はどれですか?
「最高」とは、つまり、何が間違っているのでしょうか? どうすれば改善できますか? 他にどのようなことを考慮に入れる必要がありますか? Qt3D ライブラリで重要なことを見落としていませんか?