2018年04月12日

独自フォーマットでスキニングアニメーション

何ヶ月ぶりかなんて最早覚えてないけど、独自フォーマット開発を再開しました。
今回はアニメーションの仕上げをしましたよ。

test21.gif

LBS、デュアルクォータニオン・スキニング(DLS)ともに無事動きました。アニメーションクリップの読み込みも問題ないようです。なんか普通にモデルフォーマットぽくて感動。

アニメーションデータとスキニングは半年前にメッシュの描画ができたときには実装済みだったので、再開後はボーンの可視化を実装してノードの親子関係が壊れているところを直しただけでボーンアニメーションは動きました。
ボーンが動いてしまえば後はバインドポーズ行列を掛けるだけでした。
放置期間も長かったとはいえ、ここまでに1年もかかるとは思わなかった。。
独自フォーマットの前身となったglTFエクスポータを作り始めたのが去年の2月頃だったので、それも含めると1年2ヶ月ほどになります。なげぇよ。

これでもまだフォーマットが完成したわけではなくて、シェイプキーやスキニング以外のアニメーションなどが残っています。
一応シーンフォーマットなので、カメラ・ライトといったノードの書き出しもあります。
無駄にPythonスキルが上がることでしょう。

posted by gency at 02:59| Comment(0) | 3DProgramming

2018年01月23日

WindowsのSDL2でIMEの変換候補リストを取得するコード

WindowsのSDL2のIMEヘルパーが変換候補リストを表示してくれないので、IMEを叩いて変換候補リストを取得してみました。


void getCandidateList(SDL_Window* window, std::vector<std::wstring>& candidate_list)
{
SDL_SysWMinfo window_info;
SDL_VERSION(&window_info.version);
SDL_GetWindowWMInfo(window, &window_info);
HWND hwnd = window_info.info.win.window;
HIMC himc = ImmGetContext(hwnd);

DWORD dwsize = ImmGetCandidateList(himc, 0, nullptr, 0);
if (dwsize == 0) return;

HGLOBAL hmem = (LPCANDIDATELIST)GlobalAlloc(GHND, dwsize);
if (hmem == NULL) return;

LPCANDIDATELIST lpcdl = (LPCANDIDATELIST)GlobalLock(hmem);
ImmGetCandidateList(himc, 0, lpcdl, dwsize);

candidate_list.resize(lpcdl->dwCount);
for (int i = 0; i < lpcdl->dwCount; ++i)
candidate_list[i] = (wchar_t*)((char*)lpcdl + lpcdl->dwOffset[i]);

GlobalFree(hmem);
}


コードは下記のサイトを参考にさせて頂きました。
http://www.kumei.ne.jp/c_lang/sdk3/sdk_282.htm

参考サイトのコードはそのままだと自動構文解析エラーが出ていたので、色々と修正してあります。

↓は応用例。

sdl_candidate_list.gif

OSはWindows10Home64bit、MSVCのエディタ文字コードはUTF-8(BOMなし)で動作確認しています。

入力コンテキストの作成と削除やIMEのオン・オフの切り替えはSDL2がやってくれるので、これらの処理を自分で書く必要はありません。SDL_StartTextInput()を呼び出した後に上記のコードを実行すれば変換候補リストが取得できます。

IMMの導入方法は、SDL2のIME機能が使えて且つSDL2をスタティックリンクしているなら、imm32.libはすでに追加しているはずなので、この場合は何もする必要はありません。
dllについてはよく分かりませんが、リンクエラーが出るならimm32.libを追加すればよいかと思います。


以上です。

(*´Д`*)ああああありがとうございました。
posted by gency at 02:11| Comment(0) | 3DProgramming

2017年12月16日

マルチプラットフォーム開発はじめました

近況&生存報告です。
最近は、12月5日にMac miniの一番安いやつとSSD&外付けケース合わせて6万ほどで購入しまして、自作エンジンをMacに移植するなどしてました。
Linuxへの移植は2ヶ月前に終わっていて、今現在の開発の拠点もLinuxMintに移行しています。
更新をサボっている間にいろいろな事が一気に進んでしまったので、何から書けばいいやら迷う感じですが、とりあえず移植は大きなトピックだと思ったので、今回はそれだけでもお伝えしたかった感じです。
拙作の自作エンジンは、Windows,Linux,Macの3つOS上で動くようになりました(ご満悦

ただ、残念なことにSDL2のIMEサポートによる日本語入力機能については、OS間で挙動が異なったため移植を保留しています。
Windows版では、以前から日本語入力中に変換候補リストが表示されない問題がありましたが、移植の結果、それがWIndowsの標準IMEで発生する固有の問題だということが分かりました。
LinuxとMacの日本語入力は、基本的にSDL2がIMEのUIを起動してくれて、それが入力処理全般を行ってくれるようでしたが、WIndows用に作った自作の入力機能とIMEがかち合って誤動作を起こしたため、移植はできませんでした。まあ、もとから不具合があったのでそもそも移植対象外という感じでしたが。
日本語入力の修正については、WindowsはIMEを自分で叩かないとダメっぽいですが、LinuxとMacはSDL2のサポートが行き届いてるようなので、Wiki見ながら実装すればそれで済むかと思います。
日本語入力以外の機能については全て無事に移植できています。


開発環境について。
現在テストで使っているOSは以下になります。

Windows10 HomeEdition
LinuxMint Mate
MacOS 10.13

全て64bitOSで、LinuxとMacへの移植は64bit版のみを対象に行いました。
Windows7については、Kabylake世代で新PCを自作したため使えなくなりました。そのためWindows版は10のみテストしています。

最後に、Macに移植した自作エンジンのスクショを貼って終わります。

スクリーンショット 2017-12-16 21.41.04.png

ちなみにですが、このスザンヌの描画には独自フォーマットのモデルデータを使用しています。
独自フォーマットモデルのスクショを貼ったことがなかったので、序でに撮ってみました。
移植が落ち着いたら独自フォーマットも再開したいですね。

では。

posted by gency at 22:10| Comment(0) | 3DProgramming