Qt CreatorでのFBX SDKの設定

QtでのFBX読み込み 最近QtではもっぱらQt3Dを使ってますが、FBXファイルを直で読み込みたくなり設定してみました。 以降覚書です。 FBX SDKのインストール AutoDeskのダウンロードページよりSDKをダウンロードします。 FBX Software Developer Kit 2018.0 | Autodesk Developer Network 最新のSDKはVisualStudio2015用で2017用はないです。 ただVC++2015と2017は互換性があるということなので2015用を使ってみます。 VC++2015と2017についてはこちらに記述があります。 Visual Studio 2015 と Visual Studio 2017 の間の C++ バイナリ互換性 | Microsoft Docs まずはVisualStudioで使ってみる こちらのサイトを参考にVisualStudio2017のC++プロジェクトで使ってみました。 FBX SDK準備編 – ファイルからデータを取得しよう – Code Labo ところがビルドするとエラーが発生!! こちらの記事にドンピシャのことが書いてありました。 FbxSdkがVisualStudio2017でビルド出来なかったお話 - Qiita FBXSDKがVisualStudioの非標準のC++構文を使っているためだそうです。ふーん。 Qt Creatorへの設定 FBX SDKのインストールされたディレクトリをみると、サイズ的に動的リンク版(libfbxsdk.lib)と静的リンク版(libfbxsdk-md.lib, libfbxsdk-mt.lib)があるようです。 今回は静的リンク(libfbxsdk-md.lib)で試してみます。 環境はWindows10でコンパイラはVisualStudio2017の64bitを指定。 Qt Creatorのプロジェクトで「ライブラリの追加」を選択し「外部ライブラリ」を選択。 「ライブラリファイル」にlibfbxsdk-md.libへのパスを入力 「インクルードパス」にfbxsdkの「include」フォルダへのパスを入力。 プラットフォームはとりあえずWindows Only リンク方法は「スタティック」を選択 これで「次へ」を押して進むと、~.proファイルにFBX SDKへのリンク情報が書き込まれます。 あとはmain.cppに以下のコードを書いてビルドし実行してエラーが発生しなければOK。 FbxManager* manager = FbxManager::Create(); manager->Destroy(); 実行すると正常に動作しました。Qt CreatorではVisualStudio2017の時に見られたエラーも発生しませんでした。 まとめ Qt CreatorにFBX SDKを設定することができました。 これを使ってFBXファイルを使って遊んでみます。 ...

2018-10-17 · 1 分 · 83 文字 · ayumax

ニコニ立体ちゃん(アリシア・ソリッド)をQt3Dで表示する

ニコニ立体ちゃん(アリシア・ソリッド) 今回Qt3Dの学習をするのに使う3Dモデルを探していたところ、とても良さそうなモデルを発見しました。 ニコニ立体ちゃん特設サイト - ニコニ立体 映像作品や自作ゲーム、技術デモ、同人活動などの様々なシチュエーションにおいて表記不要で無料で使える3Dモデル「アリシア・ソリッド」を公開します。 使用は無料で、2次加工なども認めている、かなり利用しやすいライセンスです。 3Dモデルの配布形式は以下の3種類あります。 FBX MMD Unity Package 今回はこの中のFBXを利用します。 MMDはアドオンを追加することでBlenderでも利用できますが、オブジェクト名に日本語が含まれる等今後の利用にマイナスな点があるため今回は利用しません。 Unity PackageはUnity専用のためこれも利用はしません。 Qt3Dで読み込む(FBX編) まずは以下の感じでfbxを読み込んでみました。 Entity { components: [ SceneLoader { source: "/FBX/Alicia_solid_MMD.FBX" }, Transform { translation: Qt.vector3d(0, 0, 0) } ] } 結果、画面には何も表示されず、fbxは読み込めないようです。 (よく調べると時間がかかりすぎているだけで読み込みは行われていました。ただしダウンロードした素のfbxではテクスチャ読み込みでエラーが発生し結局表示はされませんでした) Blenderで読み込む 次にQt3Dでそのまま読み込むのが無理ならいったん加工しようとBlenderで読み込んでみました。 すると、、、 ASCII FBX files are not supported. うーん、FBXにも種類があるのでしょうか? 調べるとFBXにはASCIIタイプとバイナリタイプがあるということ。 (今までそんな事は気にしたことがなかったです) FBXの変換 BlenderでFBXを読みたいので、調べるとAutoDeskがFBXのコンバーターを公開していました。 またASCII→バイナリの形式変換だけでなく、テクスチャなどのリソースファイルも外部か埋め込みか選べるようです。 FBX Converter Archives | Autodesk Developer Network 使い方は対象のファイルを追加してFBX Save ModeをBinaryにし、Convertを押すだけです。 Blenderで読み込む(2回目) バイナリ形式にしたFBXをインポートすると、今度はエラーなく読み込みが完了しました。 Qt3Dで読み込む形式にエクスポート Qt3Dで個人的に以前に読み込み実績のあるobj形式でエクスポートしてみました。 するとやはりテクスチャの読み込みでエラーが出ている模様。 objファイルのテクスチャ情報はmtlファイルに書かれているらしいので、mtlの中身を見てみるとイメージファイルの参照が.tgaと.psdの2パターンありました。 ...

2018-09-16 · 1 分 · 180 文字 · ayumax

Qt勉強会の成果 Qt3Dを使ってみた

Qt3D StudioとQt3D 以前Qt3D Studioを使って3Dの表現を試したことはあったのですが、今日はQtCreatorでQt3Dを使ってみました。 Qt3D Studioはタイムラインを使って3Dモデルを動かすシーケンサーのような印象を持ちましたが、Qt3Dはもっとプラグラマがゴリゴリ実装する感じ。 サッと3Dを使った表現を作るにはQt3D Studioは向いてそうですが、1個のアプリとして色々やるにはQMLでQt3Dを使ったほうが良いのかなと今は思ってます。 実装したプロジェクトはこちら できたもの 自分ではモデリングできないので、フリー素材を利用させていただきました。 雰囲気をだすために建物を置いて、道路を車が直進していくというものです。 ただ真っ直ぐ走るだけでは面白くないので、マウスクリックすると車がジャンプするアニメーションを追加してみました。 {{< x user=“ayuma_x” id=“1033362618197524480” >}} 実装の中身 今回はC++は使わず全てQMLで書いてます。 車や建物の3Dモデル やっている事はSceneLoaderのsourceにファイルを指定するだけで、あとはQtが勝手に読み込んでくれてます。便利! 車については、移動させたいのでTransformのtranslationの値を外から触れるようにプロパティにしてます。 rotationも指定してるのは、3Dモデルを普通に読みこむと横を向いちゃったので90度回転させてます。BlenderなどのモデリングツールでちゃんとQtと座標系をあわせてあげれば、これは必要ないとは思います。 余談ですが、普段Unreal Engine触っているのでX, Y, Zの座標系がいつもと違い戸惑いました。YとZがUnrealとQtでは逆でした。 車の3Dモデルを読み込む部分 Entity { components: [ SceneLoader { source : "/model3d/track.obj" }, Transform { id: myCarTransform property real locationX: 0.0 property real locationY: 0.0 rotation: fromAxisAndAngle(Qt.vector3d(0, 1, 0), 90) translation : Qt.vector3d(locationX, locationY, 0) } ] } 道路 地面と道路と白線は板ポリに色付きのマテリアルを貼って表現してます。 ...

2018-08-26 · 1 分 · 180 文字 · ayumax

Qt勉強会の成果。TCP/IPのサンプル作った

Qt名古屋勉強会に参加 1週間過ぎてしまいましたが、先週名古屋のQt勉強会に参加してきました。 前回はQMLを中心に触っていたので、今回はC++中心に触る事にしました。 色々あとあと使えそうなTCP/IPで通信する機能を実装することに。 作ったソフト できたソフトがこんな感じ。 {{< x user=“ayuma_x” id=“1023149422077562880” >}} やっていることはシンプルで、Client側のViewをマウスでドラッグするとマウスの座標をServer側に飛ばしてServer側のViewに表示してます。 上記のプロジェクト一式はこちら 書いたコード抜粋 Webにもいくつかサンプルコードが載ってたので、あまり迷わず書けました。 ソケットの送信側はこんな感じ void TCPClientModel::SendMessage(QString message) { if (tcpClient == nullptr) return; QByteArray messageBytes = message.toUtf8(); int messageSize = messageBytes.length(); QByteArray sizeBytes; QDataStream stream(&amp;sizeBytes, QIODevice::WriteOnly); stream &lt;&lt; messageSize; tcpClient->write(sizeBytes, sizeBytes.length()); tcpClient->write(messageBytes, messageBytes.length()); tcpClient->flush(); } TCP/IPのデータ部分はシンプルにサイズ領域とメッセージ領域の2つに分けて、サイズ部分に格納されたバイト数分メッセージが続く感じに。 このサイズをbyte arrayに書き込む部分が地味に悩んで、結果QDataStreamっていうのを見つけてこれを使う事にした。 あとは通信時の遅延を減らすために、1回送信する度にflushしてる。ちょっと探した感じNoDelayオプションの設定方法が見つからなかった。。 今度ちゃんと探そう。 次に受信部分はこんな感じ void TCPClientModel::OnReceived() { while (tcpClient->bytesAvailable() > 0) { tempBuffer.append(tcpClient->readAll()); while ((bodySize == 0 &amp;&amp; tempBuffer.size() >= 4) || (bodySize > 0 &amp;&amp; tempBuffer.size() >= bodySize)) { if (bodySize == 0 &amp;&amp; tempBuffer.size() >= 4) { QByteArray numArray = tempBuffer.mid(0, 4); QDataStream stream(&amp;numArray, QIODevice::ReadOnly); stream >> bodySize; tempBuffer.remove(0, 4); } if (bodySize > 0 &amp;&amp; tempBuffer.size() >= bodySize) { QByteArray bodyArray = tempBuffer.mid(0, bodySize); tempBuffer.remove(0, bodySize); bodySize = 0; emit dataReceived(QString::fromUtf8(bodyArray)); } } } } TCP/IPは受信したときにデータが足りてなかったり、逆にデータと次のデータがくっついてるときとかあるので、送信するときよりは面倒。 ...

2018-07-28 · 1 分 · 134 文字 · ayumax

Qt勉強会いってきた

今日はQt名古屋の勉強会に参加してきた。 前回初参加で今日は2回目。 前回は[初参加]+[Qt初見(言い訳)]+[設定失敗してエラー多発]でほぼアワアワして終わったので、今日はちゃんとやりたい事を決めて参加した。 1日の成果がこれ。 今日のQt勉強会で作ったソフト。 C++使った開発環境でこんなにスムーズに作れるとは感動した。Qt Quickすげー。 pic.twitter.com/UpbV1nQKXx — ayuma (@ayuma_x) June 16, 2018 ちなみに動画に映っている画像はImageNetから拝借。 QtでWPFみたいにMVVMでやってみたくて、 リスト形式のモデルデータをViewにバインドする仕組みをやってみた。 C++側で任意のディレクトリ内の画像ファイルをかき集めて、QQmlListPropertyのリスト形式プロパティを作って、Viewにバインド。 Viewは画面左をListView, 右側をGridViewにして、それぞれのmodelに上記の同じQQmlListPropertyを差し込んでみました。 ListViewとGridViewの選択状態の同期も敢えてC++のプロパティを経由して実施。 見た目は置いといて、機能的には自分としてはいい感じに仕上がった。 試行錯誤を繰り返しているので、ソースは汚すぎて公開できないけど、そのうち全部書き直してGitHubにあげよう。 今日は楽しかった。

2018-06-16 · 1 分 · 24 文字 · ayumax