Quickの中で3D表現を実現するより良い方法の研究を続けてきました。3Dという新しいプロジェクトを立ち上げるに至りました。Quickの中でユーザーインターフェイス用の3Dコンテンツを作成するための、ハイレベルなAPIを提供します。シーングラフ自体の3Dコンテンツ向け拡張および拡張されたシーングラフノードの描画エンジンを提供しています。これは、Qtにこれまでとは異なる新しい3Dソリューションを作ったということなのでしょうか?いいえ、実は必ずしもそういうわけではありません。Studioの描画エンジンから派生したものだからです。この描画エンジンは、Qtのマルチプラットフォーム対応のために移植され、Qtプロジェクトのコーディングスタイルに合わせてリファクタリングされています。究極の目標は2D/3Dにかかわらずシームレスな描画を実現することです。現在Qtでは、2Dおよび3Dのそれぞれにスムースなユーザーインターフェイスを作成するための異なるソリューションを提供しており、それぞれに対応するツールがあります。このどちらか一方しか使用しないのであれば、全く問題はありません。これらを併用した場合、実行時のパフォーマンスや開発効率に問題があることがわかりました。Studio)というシンプルなソリューションを目標にすることにしました。これにより、機能やパフォーマンスや開発効率といった問題をすべて解決することができます。私たちの開発リソースを集中することができるので、より多くの機能やより早いバグ修正も実現可能になります。3Dのもう一つの目標は、コンピュータグラフィックスの細かな知識がなくても3Dコンテンツを定義できるAPIを提供することです。ほとんどの場合、アプリケーションごとに3D描画エンジンの細かな調整は必要はなく、どちらかというと2Dと並べてちょっとした3Dコンテンツを表示させたいだけであったりします。3Dを開発してきました。いえ、パワーユーザーの要望にも応えるべく、より高度なケースに使えるレンダリングAPIを更に公開していく予定でもあります。APIを公開することを目標としています。Studioの後継として企画されています。Studioに置き換えられることになります。Studioに組み込む予定です。Studio内で両方を扱うことができるようになります。現在、この実装に取り組んでおり、近日中にプレビューを公開する予定です。3Dに変換するための移植ツール開発に取り組んでいます。それについてはまた後程お伝え出来ればと思います。自動アセット最適化3Dシーンを扱う場合、使用されるアセットの種類が増え、全体的に巨大になる傾向があるため、アセットの最適化がより重要になります。Quickで効率的に扱える形式にする方法を検討してきました。設計時には、アセット作成ツールが生成するものに基づいて使用するアセットを指定する必要があります(3Dモデルの場合はMayaのFBXファイル、テクスチャの場合はPhotoshopのPSDファイルなど)。実行時にこれらの形式を使用することは望ましくありません。代わりに、アセットを実行時に効率的な形式に変換し、ソースアセットが変更されるたびに更新するようにします。これを可能な限り自動化して、これをビルドシステムおよびQtのツールに組み込みたいと考えています。使用し、複数のネイティブグラフィックスAPIをサポートするというものもあります。6ではQtRHIを使用し、OpenGLに加えてVulkan、Metal、Direct3Dを介したレンダリングもサポートできるようになります。Quickの機能拡張です。非常にシンプルなプロジェクトだと、下記のようになります。"red"}]}}}}3Dコンテンツの定義は、2Dと同じくらい簡単であるべきではないでしょうか。ライトやカメラ、マテリアルなど、追加で考慮する必要があるものはいくつかありますが、それらは全てグラフィックパイプラインの実装の詳細ではなく、ハイレベルのシーンの概念です。APIをシンプルにすることは、カスタマイズ性を少し犠牲にすることでもあります。3Dの完全にカスタマイズ可能なフレームグラフとは異なり、シーンのレンダリング方法を完全にカスタマイズすることはできません。その代わりに、一般的なフォワードレンダラーがあり、シーンの中の様々なプロパティを使用してレンダリング方法を定義できます。これは、他の既存のエンジンと同様で、通常、選択可能なレンダリングパイプラインがいくつかあり、それらがロジカルシーンをレンダリングします。3Dでは、以下の6つの要素の組み合わせで様々なシーンを実現することができます。NodeNodeは、3Dシーンの基本部品です。3D空間での座標変換を表しますが、目には見えません。QuickでのItemタイプの動作と同様に機能します。CameraCameraは、シーンがどのように2Dの面へ投影されるのかを表します。Cameraには3D空間中の位置および投影方法を定義します。シーンをレンダリングするには、少なくとも1つのカメラが必要です。LightLightは、シーン内の照明を定義します。現在、ディレクショナル(デフォルト)、ポイント、エリアの3種類のライトがあります。ModelModelは、シーン内の物体を表します。ジオメトリ(メッシュ)と1つ以上のマテリアルの組み合わせで定義されます。3Dで使用されるランタイム形式である.meshファイルが必要です。meshファイルは、アセットインポートツールを使用して3Dモデルを変換することで生成することができます。いくつかの基本図形が組み込まれていて、Sourceプロパティに次の値を設定することで使うことができます:#Cube、#Cylinder、#Sphere、#Cone、#Rectangle実行時に独自のジオメトリを定義できるプログラマブルな方法も追加する予定ですが、プレビューではまだ利用できません。モデルをレンダリングする前に、マテリアルも必要です。これは、メッシュのシェーディング方法を定義します。MaterialsDefaultMaterialは、使いやすい標準のマテリアルです。必要なのは、このマテリアルを記述し、定義したいプロパティを設定するだけです。すると、必要なシェーダーコードはすべて自動的に生成されます。シーンに設定した他の全てのプロパティも考慮されます。グラフィックスシェーダーコード(頂点シェーダーやフラグメントシェーダーなど)を自分で記述する必要はありません。独自のシェーダーコードを使用する、いわゆるCustomMaterialを定義することもできます。QMLに以下のライブラリのimportを追加すれば、様々なCustomMaterialの例を試すこともできます。1.0TextureTextureは、3Dシーン内のテクスチャおよびメッシュへのマッピング方法を表します。テクスチャのソースは、画像ファイルを指定することができますし、さらに後述するようにQMLを指定することもできます。Quick内の3Dコンテンツを表示するには、2D面上で平らに表現する必要があります。これを行うため、View3Dを使用します。View3Dは、API全体で唯一のQQuickItemベースのコンポーネントです。シーンをView3Dの子要素として定義することが出来、又はsceneプロパティをレンダラーにしたいシーンのルートノードに設定して、既存のシーンを参照することも可能です。複数のカメラがある場合は、シーンのレンダリングに使用するカメラを選ぶこともできます。デフォルトでは、シーンで定義された最初のアクティブなカメラを使用することになっています。View3Dアイテムは、レンダリングされる前に必ずしもオフスクリーンテクスチャにレンダリングされる必要はないということを覚えておいてください。以下の4つのレンダリングモードの中からいずれかを設定して、3Dコンテンツをいつレンダリングするかを定義できます。2Dコンテンツと同じ空間の中にレンダリングされます。5で深度バッファーを使用するために、想定外の動作につながる可能性があります。Quickコンテンツをレンダリングすることもできます。Quickコンテンツをテクスチャとしてシーンを描画することが可能になります。3DはQML上に構築されているため、3D用にも再利用可能なコンポーネントを作成することができます。複数のモデルで構成されるCarモデルを作成する場合は、Car.qmlに保存するだけです。他のQMLタイプと同様、Carを再利用するだけで、複数のCarをインスタンス化できます。これは、2Dシーンと3Dシーンの異なるアプローチを処理するのではなく、同じコンポーネントモデルを使用して2Dシーンと3Dシーンを作成できるため、非常に重要です。Quickプロジェクト内のどこにでも存在できるため、複数のView3Dからそれらを参照することができます。シーンに複数のカメラがある場合、各カメラから異なるView3Dにレンダリングすることもできます。4視点からみた同じティーポット影の表現それぞれのLightについて影の有無を指定できます。これを有効にすると、影がシーンに自動でレンダリングされます。条件にもよりますが、影のレンダリングは非常に高コストになる可能性があるため、各モデルに追加のプロパティを設定することで、どのモデルコンポーネントが影をつくるか、あるいは投影されるかを微調整できます。Lighting標準のLightコンポーネントに加えて、定義されたHDRIマップでシーンを照らすこともできます。このテクスチャは、View3D全体を対象にする場合はSceneEnvironmentプロパティで設定できますし、個別にそれぞれのマテリアルにおいて設定することも可能です。Quickと同じアニメーションシステムを使用します。任意のプロパティをアニメーターにバインドすると、期待どおりに変化し、更新されます。QtQuickTimelineモジュールを使用すると、キーフレームベースのアニメーションを使用することもできます。コンポーネントモデルと同様に、アニメーションシステムを統一することで、2D/3D間のギャップを小さくし、相互の分断や矛盾を根本的に解決することができます。今のところリグアニメーションには対応していませんが、将来的には対応する予定です。3Dをテクニカルプレビューとしてリリースすることを計画しています。ソースコードはQtレポジトリ中で公開されているので、https://wiki.qt.io/Building_Qt_5_from_Gitを参考に5.14ブランチをチェックアウトしてビルドしてみてください。Studioを使うことで、3Dシーンを表現するために必要な全てが手に入る、というところが、このプロジェクトにとってのゴールです。それは、シーンを視覚的にレイアウトし、メッシュ、マテリアル、テクスチャなどの3Dアセットをインポートし、それらのアセットをエンジンで使用される効率的なランタイム形式に変換することを意味します。3Dは、QMLコードを手動で記述することでも使用できます。したがって、アセットを変換するための独立したユーティリティもいくつかあります。そのうちの一つが、”balsam”とよばれるアセット変換ツールです。Maxなどの3Dアセット作成ツールで作成したアセットを入力すると、シーンを表すQMLコンポーネントと、使用するテクスチャ、メッシュ、マテリアルを生成します。現在、このツールは次の形式からのシーンの生成をサポートしています。(blend)GLTF2ファイルmyTestScene.fbxを変換するには、次のように実行してください。myTestScene.fbxこれにより、必要なアセットとともにMyTestScene.qmlというファイルが生成されます。することで、シーン内の他のコンポーネントと同じように使用できます。sceneRoot}}このツールで生成されるアセットの改善に取り組んでいるところです。今後数か月で改善されることを期待しています。Studioプロジェクトを変換するアセットインポートツール用のプラグインも作成しました。Studioを使用したことがある場合、そのプロジェクトはXML形式で保存されています。3Dプロジェクトが生成されます。3Dとは異なるため、全てが変換されるわけではありません。既存のプロジェクトを変換するための適切な開始点を提供する必要はあります。Studioユーザーのために、このサポートを引き続き改善していきたいと考えています。3Dを使用しないのか?これが恐らく、真っ先に浮かぶ疑問でしょう。私達もこれについて、ここ数年間検討を重ねてきました。Quickのすべてを構築できるのでは、ということです。Studioの2.3リリースでこれを行うことを目指し、開発を開始しました。Studioで期待される動作を再現するレンダリングエンジンを実装するための強力な抽象化されたAPIがあります。Quickとグラフィックスハードウェア間の別のレベルの抽象化からも、特定のオーバーヘッドが伴います。そのため、ローエンドのデバイスも含む幅広いプラットフォームのサポートを継続しながら、グラフィックバックエンドの統合をしようとしたときに、現状のQt3Dはその基盤として最適ではないのです。Studioには私たちがちょうど必要としていた機能を備えたレンダリングエンジンがあり、追加の機能を構築するための良い基盤となりました。3Dに付属する強力なAPIがなくなったという欠点がありますが、もしQt3D上で描画エンジンを実際に構築しようとすると、その挙動を最初に決めてしまわなければならないので、フレームグラフのカスタマイズ性はすでに制限されてしまうのです。Studioレンダリングエンジンをベースとして使用し、それを基に構築するのが一番実用的だということでした。今後の展望このリリースは、今後にむけた予告になります。LTSから提供する計画です。5.14でテックプレビューをリリースします。5シリーズでは、バイナリ互換を維持しなければならないため、2Dと3Dの結合の深さは制限されています。Quickにより深く結合させることを目指しています。ここでの目標は、3Dを全く使用しないユーザーにオーバーヘッドを追加することなく、2Dコンテンツと3Dコンテンツの混合を可能な限り効率化することです。Quickアプリに新しいレンダラーを強制追加させるようなことは行いません。APIを利用できるようにしたいと考えています。6(およびRHI移植)の進捗をみながら、そのバイナリ互換保証をする前に、パブリックなAPIとして公開します。3Dは現在テックプレビューであるため、現状の多くは変更の可能性があります。API周りに関しては荒削りな部分も多いので、不足しているもの、意味をなさないもの、機能するもの、しないものもあることと思います。Trackerを通してフィードバックをいただけると幸いです。Quick:3Dと指定してください。