2012年9月15日土曜日

未完

MikuMikuOnline開発は終了となります。

本件の開発資産を元に別のソフトに取り組む予定です。

MikuMikuOnline Concept版を以下に置いておきます。



YouTube
http://www.youtube.com/watch?v=xHi3xrA0pMs

twitVideo
http://twitvideo.jp/contents/lists/aopon3


ポータル
http://cozmyportal.blogspot.jp/

2012年9月8日土曜日

アクセサリ3

http://mmo.h2so5.net/
MikuMikuOnline 先を越されてしまった

主目的である底辺層拡大と問題の提起は誰が作っても達成されるので
こちらは適当なとこまで作ってから方向性を再検討しよう

魔が刺して便乗配布してみたけど、ユーザー環境テストとか全然やってない
思いつきで行動するのは自重しないと


(済)ファイルパスD&D
(済)表示モデル数
(済)表示対象距離
(済)自座標のアクセサリ反映
(済)リソース読み込みエラー処理
(済)リソース読み込み処理を非同期
-バッティングする
--物理演算中に剛体追加とか...
--描画処理中にモデル解放とか...
PMDファイルをDirectoryを切らずに置いていると周辺ファイルもまとめて送付してしまう
GPU使用率が100%になることがあるの原因は?
-モデル数に比例増加するのも問題、1体10%喰っている
クライアントとサーバのバージョンチェック
バージョンアップ通知
音源共有とか
-http://d.hatena.ne.jp/araigeta/20081021
-http://mainori-se.sakura.ne.jp/sst/wiki.cgi?page=%B2%BB%C0%BC%A4%CE%BD%E8%CD%FD
-http://www.platinumegg.net/d/?cat=9&paged=10
サーバ側の管理機能


アクセサリ制御
・アクセサリ管理画面
- 衝突判定の有無
- 衝突判定の方法は一から調べないと
- 表示順
- 自アクセサリだけ順番指定してもあまり意味がないか
(済)・指定座標に配置
(済)・指定方向に配置
(済)・モーション設定
(済)・所持ボーン指定
・所持(モデルに追従)
- ボーン変形はGPU...どうやって位置合わせる


カメラ制御
・視点を中心とした視線変更
・視点中心移動
- 基準切替しないとわかりにくい
・ターゲットモデル

検討
・XML読み書きの排他制御
・昇降
・暗号管理
・動画、生放送連携(リクエストとか?)

パフォーマンス
・サーバー、queへの書き込みか読み込み画面表示で負荷


課題

キーイベント
起動直後1回目のpressが無反応になる課題

マウスイベント
press、releaseの瞬間しかイベントが取れないので
Drag状態の判定が怪しい
releaseの取得漏れがある

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな

http://mikudan.blog120.fc2.com/blog-entry-318.html

分割シャドウマップ

http://sssiii.seesaa.net/article/280964095.html

送信間隔はどれくらいにすれば?

http://rob2.jp/mmodev/

OS終了イベントの自動終了


積んでるタスク

1.3Dプログラミング基礎
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変換

https://twitter.com/AEPS1/status/239006371490717696
http://v-nyappon.net/?m=diary&a=page_detail&target_c_diary_id=979053

2012年9月2日日曜日

アクセサリ2

リソース読み込みエラー処理
クライアントとサーバのバージョンチェック
バージョンアップ通知
音源共有とか
-http://d.hatena.ne.jp/araigeta/20081021
-http://mainori-se.sakura.ne.jp/sst/wiki.cgi?page=%B2%BB%C0%BC%A4%CE%BD%E8%CD%FD
-http://www.platinumegg.net/d/?cat=9&paged=10
ファイルパスD&D(済)
自座標のアクセサリ反映
表示モデル数
表示対象距離
リソース読み込み処理を非同期にしたい、排他制御は...
サーバ側の管理機能


アクセサリ制御
・アクセサリ管理画面
- 衝突判定の有無
- 衝突判定の方法は一から調べないと
- 表示順
- 自アクセサリだけ順番指定してもあまり意味がないか
・指定座標に配置(済)
・指定方向に配置(済)
・モーション設定(済)
・所持(モデルに追従)
- ボーン変形はGPU...どうやって位置合わせる
・所持ボーン指定(済)


カメラ制御
・視点を中心とした視線変更
・視点中心移動
- 基準切替しないとわかりにくい
・ターゲットモデル

検討
・XML読み書きの排他制御
・昇降
・暗号管理
・動画、生放送連携(リクエストとか?)

パフォーマンス
・サーバー、queへの書き込みか読み込み画面表示で負荷


課題

キーイベント
起動直後1回目のpressが無反応になる課題

マウスイベント
press、releaseの瞬間しかイベントが取れないので
Drag状態の判定が怪しい
releaseの取得漏れがある

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな

http://mikudan.blog120.fc2.com/blog-entry-318.html

分割シャドウマップ

http://sssiii.seesaa.net/article/280964095.html

送信間隔はどれくらいにすれば?

http://rob2.jp/mmodev/

OS終了イベントの自動終了


積んでるタスク

1.3Dプログラミング基礎
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変換

https://twitter.com/AEPS1/status/239006371490717696
http://v-nyappon.net/?m=diary&a=page_detail&target_c_diary_id=979053

2012年8月24日金曜日

アクセサリ

次の仕事探し開始のせいか集中力が駄々下がり
今年中にコンセプト版出したいな

アクセサリ制御
・アクセサリ管理画面
- 衝突判定の有無
- 表示順
・指定座標に配置
・指定方向に配置
・モーション設定
・所持(モデルに追従)
・所持ボーン指定


カメラ制御
・視点を中心とした視線変更
・視点中心移動
・ターゲットモデル

検討
・クライアントとサーバのバージョンチェック
・XML読み書きの排他制御
・音源共有とか
・D&D
・昇降
・暗号管理
・動画、生放送連携(リクエストとか?)

パフォーマンス
・サーバー、queへの書き込みか読み込み画面表示で負荷


課題

キーイベント
起動直後1回目のpressが無反応になる課題

マウスイベント
press、releaseの瞬間しかイベントが取れないので
Drag状態の判定が怪しい
releaseの取得漏れがある

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな

http://mikudan.blog120.fc2.com/blog-entry-318.html

分割シャドウマップ

http://sssiii.seesaa.net/article/280964095.html

送信間隔はどれくらいにすれば?

http://rob2.jp/mmodev/

OS終了イベントの自動終了


積んでるタスク

1.3Dプログラミング基礎
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変換

https://twitter.com/AEPS1/status/239006371490717696
http://v-nyappon.net/?m=diary&a=page_detail&target_c_diary_id=979053

2012年8月18日土曜日

よろず

モデルとモーションの共有は大体できたかな
アクセサリに入る前に小課題をこなそう
日曜は休みたいな


・基本コマンド以外のモーション反映(済)
・非共有モーションのremoveタイミング(済)
・メッセージ表示位置(済)
・視点を中心とした視線変更
・視点中心移動
・ターゲットモデル

不具合
・メモリリーク
-毎フレームのメッシュ変形処理でリーク
-GPUに渡す定数バッファでリーク
--new SlimDX.DataStreamの解放漏れ

検討
・XML読み書きの排他制御
・アクセサリの扱い
・音源共有とか
・D&D
・昇降

パフォーマンス
・サーバー、queへの書き込みか読み込み画面表示で負荷

・ファイル読み込みの並列化
-先頭から都度サイズを読み取って行くので
-並列化は難しい?

・メッシュ生成の並列化
-テクスチャをtexture2Dにするときに負荷
-並列化すると例外を吐くが成功するまでループしても
-並列前より速い


課題

キーイベント
起動直後1回目のpressが無反応になる課題

マウスイベント
press、releaseの瞬間しかイベントが取れないので
Drag状態の判定が怪しい
releaseの取得漏れがある

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな

http://mikudan.blog120.fc2.com/blog-entry-318.html

分割シャドウマップ

http://sssiii.seesaa.net/article/280964095.html

送信間隔はどれくらいにすれば?

http://rob2.jp/mmodev/

OS終了イベントの自動終了


積んでるタスク

1.3Dプログラミング基礎
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変換

2012年8月10日金曜日

通信7

モデルとモーションの共有は大体できたかな
アクセサリに入る前に小課題をこなそう
日曜は休みたいな

・セッション管理を再検討

・UI整備
 アカウント管理
 キー設定
 モデル設定
 ユーザーリスト
 モーション設定
 アクセサリ設定 ※あとまわし
  アクセサリ配置検討

・サーバー、queへの書き込みか読み込み画面表示で負荷
・視点を中心とした視線変更
・モデル読み込み時の負荷軽減

・モデルの解放がされていない
・ファイル読み込みの並列化
・モデル準備の
・視点中心移動
・非共有モーションのremoveタイミング


課題

キーイベント
起動直後1回目のpressが無反応になる課題

マウスイベント
press、releaseの瞬間しかイベントが取れないので
Drag状態の判定が怪しい
releaseの取得漏れがある

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな

http://mikudan.blog120.fc2.com/blog-entry-318.html

分割シャドウマップ

http://sssiii.seesaa.net/article/280964095.html

送信間隔はどれくらいにすれば?

http://rob2.jp/mmodev/


積んでるタスク

1.3Dプログラミング基礎
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変換

2012年8月4日土曜日

通信6

・モデルの表示
・モデルの移動

モデル読み込みのMemoryStream化
モデル破棄時のbulletからの解放
テクスチャ管理のMemoryStream化

送信間隔はどれくらいにすれば?

http://rob2.jp/mmodev/

とりあえず毎フレーム送信

受信、モーションの反映

サーバー、queへの書き込みか読み込み画面表示で負荷

モーションの確認

回転ベクトルも伝文に乗せる

セッション管理を再検討

UI整備

アクセサリ配置検討


課題

キーイベント
起動直後1回目のpressが無反応になる課題

マウスイベント
press、releaseの瞬間しかイベントが取れないので
Drag状態の判定が怪しい
releaseの取得漏れがある

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな

http://mikudan.blog120.fc2.com/blog-entry-318.html

http://sssiii.seesaa.net/article/280964095.html

積んでるタスク

1.3Dプログラミング基礎
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変換

2012年7月29日日曜日

通信5

クラサバ伝文

・サインアップ 済
・リザイン 済
・ログイン 済
・ログアウト 済
・パスワード変更 済
・静的情報 済
・動的情報 済

動かすのに必要な伝文は終わり

次は受信内容から
・モデルの表示
・モデルの移動




課題

キーイベント
起動直後1回目のpressが無反応になる課題

マウスイベント
press、releaseの瞬間しかイベントが取れないので
Drag状態の判定が怪しい
releaseの取得漏れがある

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな

http://mikudan.blog120.fc2.com/blog-entry-318.html

http://sssiii.seesaa.net/article/280964095.html

積んでるタスク

1.3Dプログラミング基礎
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変換

2012年7月22日日曜日

通信4

クラサバ伝文

・サインアップ 済
・リザイン 済
・ログイン 済
・ログアウト 済
・パスワード変更 済
・静的情報
・動的情報

引き続き静的情報

ファイルアップロード
ブロックリスト
モデル選択
キー設定
状態

をサーバーに送信、保持

ファイル送信時の分割サイズをどうすればいいのか
とりあえず1024*1024/8で追々試してみながら調整

クライアントとサーバーの値の比較のため取得伝文も必要


課題

キーイベント
起動直後1回目のpressが無反応になる課題

マウスイベント
press、releaseの瞬間しかイベントが取れないので
Drag状態の判定が怪しい
releaseの取得漏れがある

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな

http://mikudan.blog120.fc2.com/blog-entry-318.html

http://sssiii.seesaa.net/article/280964095.html

積んでるタスク

1.3Dプログラミング基礎
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変換

2012年7月15日日曜日

通信3

クラサバ伝文

・サインアップ 済
・リザイン 済
・ログイン 済
・ログアウト 済
・パスワード変更 済
・静的情報
・動的情報

とりあえずつまらない部分を完了


モデルファイルを共有するためには
PMX/PMDファイルのみではなく関連ファイルも同梱しなくてはならない。
画像ファイルがその大半となる。

PMX/PMDファイルが存在するディレクトリ内のファイルを
1ファイルに圧縮しパスワードを付与

クライアントからサーバーにアップロードされた圧縮ファイルは
その状態のまま共有される

他クライアントが圧縮ファイルを使用する際は
ファイルとして展開せず、Streamで保持する
※ファイルパスで見ている処理を変更する必要がある

問題はパスワードの隠蔽をどうするかですが
.netで書いている以上、簡単に解析されてしまうので
気休め程度にしかならないと割り切ります

ファイルの送信:
分割したバイト配列を非同期送信
1つ目の応答が正常だったら2つ目を開始
受信側は受信中の状態管理が必要

ファイルの要求:
クライアントから要求する場合、応答伝文で受け取るわけだが
分割受信とかできるのだろうか?


課題

キーイベント
起動直後1回目のpressが無反応になる課題

マウスイベント
press、releaseの瞬間しかイベントが取れないので
Drag状態の判定が怪しい
releaseの取得漏れがある

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな

http://mikudan.blog120.fc2.com/blog-entry-318.html

http://sssiii.seesaa.net/article/280964095.html

積んでるタスク

1.3Dプログラミング基礎
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変

2012年7月7日土曜日

通信2

実装前にクラサバの復習
http://note.chiebukuro.yahoo.co.jp/detail/n1653
http://www.atmarkit.co.jp/fdotnet/vblab/appqa_06/appqa_06_01.html

Monitorを使う場合、受信と受信文処理のタイミングがずれることがある。
イベントを使う場合、即時性はあるが受信文処理に時間が掛かると
イベントが待ち行列を作るため危険



課題

キーイベント
起動直後1回目のpressが無反応になる課題

マウスイベント
press、releaseの瞬間しかイベントが取れないので
Drag状態の判定が怪しい
releaseの取得漏れがある

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな

http://mikudan.blog120.fc2.com/blog-entry-318.html

http://sssiii.seesaa.net/article/280964095.html

積んでるタスク

1.3Dプログラミング基礎
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変

2012年7月1日日曜日

通信

忘れないうちに( ..)φメモメモ
http://mikudan.blog120.fc2.com/blog-entry-318.html
剛体位置を強制的に戻すのはいいとして、回転は保持しないとカクカクする
剛体が数珠繋ぎになっている場合、位置ずれが連鎖する
そもそもどこを基点とした移動制限なのか



とりあえず操作可能になったので

http://bowlroll.net/up/dl6121

次はネットワーク通信をしてみたいと思います。

通信方式として
1.クライアントサーバモデル
2.ピアツーピアモデル

選択課題として
・サーバ負荷
クラサバの場合、負荷が集中してしまう
・情報管理
ピュアP2Pだと不正端末を管理できない

P2Pに中央インデックスサーバを追加したハイブリットP2P
インデックスサーバを各端末に持たせるスーパーノード型P2P

グループ毎に小さなネットワークを構築できるようにするならば
スーパーノードを選択できるP2Pで、
スーパーノードから中央インデックスサーバに情報提供するのがよいか

http://ja.wikipedia.org/wiki/Peer_to_Peer

共有する必要がある情報
随時
・モデル
・モーション
・NGリスト
常時
・スーパーノードIP (スーパーノード to スーパーノード)
・ノードIP (スーパーノード to ノード)
・ユニークID
・モデル位置
・モデルベクトル
・使用中モーション
・(保有する他ユーザ情報)

1ノードを個人
1スーパーノードを集団とすると
スーパーノード to スーパーノードは組織間交流となる
ノードが他所のスーパーノードに出向くとして、
・ノードがスーパーノードを渡り歩くようにするか
・所属するスーパーノードを経由して情報をもらうか
レスポンスは前者がよい
セキュリティは後者がよい

全体を管理することは不可能
個人が自己管理するには心許ない
よってスーパーノード単位でならば可能?

データ転送量と接続の連続性が課題となるか


http://gyazo.com/cdc940119245107bcc2ff0c23fbf6c26


皮算用的だが、実際に運用できた場合の課題として
モデルデータの不正共有が想定される

配布方法を変えてみたり、パスワードを凝ってみたり、Readmeを英語で書いたりと
涙ぐましい努力が続けられているが不正配布が減らない現状をみるに、
完全解決を求めずよりましな状態を目指したほうがよさそうだ。

不正使用・配布する人が何を求めているのか、
突き詰めれば人との繋がりだろう。

繋がりを求めていないのならば、その行いが公開されることは無く
被害認識できないので問題ないといえる。

・明示的にデータ共有する人・グループを選択すること
・NGユーザーを共有すること

お互いに不可視とすることでましな状態にならないだろうか

そういう意味では不正配布を必死に非難することは
掲示板の荒らしを非難して喜ばせているだけなのかもしれない
もちろんユーザー間の意識共有にも有効ではあるが。


課題

キーイベント
起動直後1回目のpressが無反応になる課題

マウスイベント
press、releaseの瞬間しかイベントが取れないので
Drag状態の判定が怪しい
releaseの取得漏れがある

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな


積んでるタスク

1.3Dプログラミング基礎
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変

2012年6月30日土曜日

マウス操作

http://moepic.com/plg/key_r.php

キー操作
・前進後退 [済]
・左右旋回 [済]
・左右平行 [済]
・歩く走る [済]
・座る [済]
・ジャンプ [済]
・自動移動 [済]
・視点前後 [済]
・カメラ上下(視点無視) [済]
・カメラ旋回(視点無視) [済]
・スクリーンキャプチャ [済]

マウス操作
・視点前後 [済]
・カメラ上下(視点無視) [済]
・カメラ旋回(視点無視) [済]

モーション
・前進(歩く) ぺんぎん氏
・前進(走る) susuki氏
・後退(歩く)
・後退(走る)
・左右旋回
・左右平行(歩く) [済]
・左右平行(走る)
・座る [済]
・ジャンプ(待機) [済]
・ジャンプ(歩く)
・ジャンプ(走る)
・待機 susuki氏


http://www.nicovideo.jp/watch/sm14977206
https://twitter.com/penguin_island/status/216110873310281728

1ミクセルが40cmで1セル5.0fだから、時速3.24kmだと40500f/hで、1/30secあたり0.375f

http://www10.plala.or.jp/masisi/pmd.html

キーイベント
起動直後1回目のpressが無反応になる課題

マウスイベント
press、releaseの瞬間しかイベントが取れないので
Drag状態の判定が怪しい
releaseの取得漏れがある

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな


積んでるタスク

1.3Dプログラミング基礎
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変換

2012年6月22日金曜日

キー操作2

http://moepic.com/plg/key_r.php

キー操作
・前進後退 [済]
・左右旋回 [済]
・左右平行 [済]
・歩く走る [済]
・座る [済]
・ジャンプ [済]
・自動移動 [済]
・視点前後 [済]
・カメラ上下(視点無視) [済]
・カメラ旋回(視点無視) [済]
・スクリーンキャプチャ

マウス操作
・視点前後
・カメラ上下(視点無視)
・カメラ旋回(視点無視)

モーション
・前進(歩く) ぺんぎん氏
・前進(走る) susuki氏
・後退(歩く)
・後退(走る)
・左右旋回
・左右平行
・座る [済]
・ジャンプ(待機) [済]
・ジャンプ(歩く)
・ジャンプ(走る)
・待機 susuki氏


http://www.nicovideo.jp/watch/sm14977206
https://twitter.com/penguin_island/status/216110873310281728

1ミクセルが40cmで1セル5.0fだから、時速3.24kmだと40500f/hで、1/30secあたり0.375f

http://www10.plala.or.jp/masisi/pmd.html

入力イベント
現状、foamイベントで実装していますが
DirectInputのほうが楽なのかな?
同時押しが取りやすくていいですね
起動直後1回目のpressが無反応になる課題

カメラ上下でキャラクターの向いている方向と垂直を軸に回転させているのだけど
微妙に回転軸がずれる。垂直軸を求めるときにずれているのかな

積んでるタスク

1.3Dプログラミング基礎
マウス操作
キー操作
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
・IKモーション→標準モーションに変換

2012年6月17日日曜日

キー操作

一段落したところでキー入力による操作を実装しようと思います

そもそもMikuMikuDanceを知ったきっかけがMMORPGのSNSだったのですが
うっかり足を踏み入れたせいですっかり御無沙汰になってしまいました。

そういうわけで初めてプレイしたMMORPG「ResonanceAge」の後継である
「MasterOfEpic]の操作キーを使わせてもらおうかと思います。

http://moepic.com/plg/key_f.php

・前進後退
・左右旋回
・左右平行
・歩く走る
・座る
・ジャンプ
・自動移動
・視点前後
・カメラ上下(視点無視)
・カメラ旋回(視点無視)
・スクリーンキャプチャ

キーにあわせたモーションを作るか探すかしないといけませんね

http://www.nicovideo.jp/watch/sm14977206


積んでるタスク

1.3Dプログラミング基礎
マウス操作
キー操作
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの

2012年6月16日土曜日

エッジ2

なんやかんやでHLSLでのエッジ描画はできたのですが、
1.顔の内側にもエッジが乗る
2.法線深度マップの解像度を上げるとGPU使用率がきつい
※RenderTargetに出力してshaderResourceを渡すようにしないと色が出せない

エフェクトエッジ前提のモデルならまだしも
MMD系のモデルをそのまま用いる場合は不向きなようです

MMEへの足掛かりが掴めたので良しとしましょう

ついでなので反転ポリエッジを追加することにしたのですが、
反転ポリの頂点位置は元ポリ座標に法線方向に加算して求めていて
頂点座標の計算をHLSLでやっているので
エッジ処理もそっちに持っていかないといけません。

同じモデルを2回描画する感じでできるかな

反転した頂点インデックスをあらかじめ用意しておいて
フラグを乗せて通常描画、エッジ描画としてDraw
フラグが立っていたらHLSL側で頂点座標ずらしと法線方向を反転



積んでるタスク

1.3Dプログラミング基礎
マウス操作
キー操作
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの

2012年6月10日日曜日

エッジ

MMDの反転ポリによるエッジ
頂点は増えるわ予想外の不具合を生むわで
敬遠しがちなのですが、MMDXのエフェクトを用いたエッジ
GPUを用いたエッジ描画に挑戦してみようかと

処理フローはシャドウマップ同様に
Main.fxでモデルのエッジをEdgeMapに書き出し
Main.fxでモデルを描画
Edge.fxでEdgeMapを描画
っぽい

Edge.fxにはinputとしてエッジ幅、画面サイズ、画面の頂点座標&テクスチャ座標、EdgeMap
EdgeMapには法線と深度が書き出されており
それを元にEdge.fxで描画


エッジ箇所の検出計算が理解できない
EdgeMapからの読み込み座標が誤っているのか?
モデル部の切り出しはうまくいっているように見える
モデル部の内側が同じ値で埋まっている模様


http://codeoncanvas.blogspot.jp/2010/02/xnafps20.html


積んでるタスク

1.3Dプログラミング基礎
MMDXのエッジを見る
マウス操作
キー操作
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの

2012年6月9日土曜日

並列化と高速化

前回に続き

・並列化は現状以上に効果を発揮できる箇所なし
・モーフモーションの更新フラグの持ち方を変え処理時間を半分程度に縮小

ulaさんのルカ、ユフ
508さんのリン
tdaさんのミク

に、きしめんを踊らせた状態で30fpsをやや下回ります。

物理演算が並列化できないのがかなりネックになっています。
MMDXで並列化しているらしいのでそちらを見てみましょうか。

MMDXの並列化
1.ボーン変形
2.非同期に物理演算開始
3.モーフ処理
・・・

なるほどモーフ処理に掛かる時間と重ねているんですね
PMXの場合、ボーンモーフがあるのでその辺り分離しないといけません

同様の方法をとった場合、
モデル数が少ない場合は効果が大きいのですが
モデル数が多くなると、
モーフ処理は並列化されているのでそれほど増加しないのに
物理演算は比例して増加するので効果は限定されます。
もちろんやらないよりやったほうがいいのです。




積んでるタスク

1.3Dプログラミング基礎
MMDXのエッジを見る
マウス操作
キー操作
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの

2012年6月6日水曜日

並列化の検討

PMXモデルの描画手順

1.ボーン・スキン設定値取得
2.1.の値を用いてボーン変形(物理前)・頂点移動等
3.物理演算
4.1.3.の値を用いてボーン変形(物理後)
5.FPS調整
6.地面影描画
7.影描画
8.モデル描画

CPU側で重いのが2.と3.

この二つの並列にできればいいのですが
2.で物理演算を行うための初期姿勢を求めているので
2.が終わらないと3.を実行できない


Bulletはマルチスレッド対応されているらしいのですがやりかたがわからない

C++ではビルドしなおしてランタイムライブラリの設定でできるらしい
http://blog.livedoor.jp/dhime/archives/51784551.html

使える環境だとしてもなるほどわからんですが
http://bulletjpn.web.fc2.com/15_Parallelism.html


Bulletが重いのはあきらめて、
ボーン変形をモデル毎に並列化する?

前回スレッドを作って試したときはスレッドを作ることに時間をとられて
返って遅くなってしまいましたが、モデル数が多ければ効果的でしょうか。
.net4.0だとSystem.Threading.Tasks.Parallelとか使えて楽そうですね。
尤も、便利だけど遅いだと困りますがとりあえずやってみましょう

System.Threading.Thread は 遅くなった
System.Threading.Tasks.Parallel は 効果あり
処理時間は最も重いモデル+α

Bulletが1f=33msec中の半分を喰っているので
モデル4体で限界になります。

積んでるタスク

1.3Dプログラミング基礎
高速化 並列化の検討 もっといい方法はないか
MMDXのエッジを見る
マウス操作
キー操作
物理演算
MMDと比べて重力の影響が大きいのはバージョンの違いなのか実装不具合なのか
ver2.8を入れてみる→SlimDXのバージョンが上がってた どうしよう


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの

2012年6月5日火曜日

SlimDXのSampleFramework

SlimDXのSampleFrameworkを使ってViewerを作って
というか勉強していたのですが、
Formに描画するのでちょっと扱い辛い

PictureBoxのHandleに描画するよう変更
FPSとFrameNoの表示をラベルコントロールに変更



積んでるタスク

1.3Dプログラミング基礎
高速化 並列化の検討 もっといい方法はないか
MMDXのエッジを見る
マウス操作
キー操作
物理演算
MMDと比べて重力の影響が大きいのはバージョンの違いなのか実装不具合なのか
ver2.8を入れてみる



2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの

2012年6月3日日曜日

ボーン処理順の経過

ボーン処理順不具合の件

このような親子関係を持つボーンがあったとして
IKボーン→IK子ボーン→IK子ボーンを付与親に持つボーン

処理順がこうなっていた場合
IK子ボーン→IK子ボーンを付与親に持つボーン→IKボーン

PMX仕様ではIKボーンの変化量がIK子ボーンを付与親に持つボーンに伝わることがないので動きません。
PMDE上でも動きません。

しかし、MMD、MMMではなにかしらの回避がされているため動きます。
そのため仕様外のモデルが作られてしまいます。

1.なんとなく動くものを作れる
2.不備を認識できない

簡単に利用できることが重視されるので対応としては1.でよいのでしょう。


で、なにかしらの回避とはなんなのか

最初はボーン変形の処理順を再配置しているのではと思ったのですが
やってみると影響が未知数でボツ

なので、
モーションデータからローカル変形を生成する処理を2周させることにしました。

2周ループ

 ボーン数分ループ
 {
   1.モーション
   2。IK
 }


こうなるので解決するわけです
IK子ボーン→IK子ボーンを付与親に持つボーン→IKボーン→IK子ボーン→IK子ボーンを付与親に持つボーン→IKボーン

負荷が増えるので最善ではないですが...

IK子ボーンを親・付与親にしているボーンの処理順が
IKボーンの処理順より早い場合のみ2周するようにすることで多少ましに...



積んでるタスク

1.3Dプログラミング基礎
高速化
物理演算
MMDと比べて重力の影響が大きいのはバージョンの違いなのか実装不具合なのか
ver2.8を入れてみる
並列化の検討 もっといい方法はないか
MMDXのエッジを見る
物理干渉マトリクス

2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの

2012年6月2日土曜日

ボーン処理順チェック用

ちょくちょくボーン処理順による不具合が発生してはまってしまうので
ボーン処理順チェック用のツールを作りました。

とはいえ、処理順が誤っているかどうかはモデル作者にしかわからないので
ボーン間にどのような関連があるかを見やすくした程度です。

http://bowlroll.net/up/dl5480

同様にボーン処理順の正規化は難しいので
何回ループすれば同様の数値になるかをチェックして
各処理でその回数分ループさせるようにしようかと思います。


積んでるタスク

1.3Dプログラミング基礎
高速化
物理演算
MMDと比べて重力の影響が大きいのはバージョンの違いなのか実装不具合なのか
ver2.8を入れてみる
並列化の検討 もっといい方法はないか
MMDXのエッジを見る
ボーン処理順の正規化検討→ループ回数取得
物理干渉マトリクス

2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの

2012年5月27日日曜日

BulletSharpの衝突設定3

引き続き物理演算周り

調査中に「物理+ボーン位置合わせ」の剛体が
機能していないことを発見したので修正に掛かる

「物理+ボーン位置合わせ」とは
物理演算による移動回転をボーン座標上に固定する。

普通に物理演算した状態をボーン座標に平行移動した状態です

グローバル変形を求める際に子ボーンに連鎖するので
親ボーンから順に計算する必要があります。

物理変形の計算はGPUでいいかなと思っていたのですが
CPUにごっそりお引越ししました。

スキニングテクスチャで渡している値も必要ないものは削除しないといけませんね

で、この修正を加えた結果
どこかに消えていたリボンとスカーフが戻ってきました。
まだ非数値なので固定状態のままですが。


それにしても
このモデルに限ってこんな状態になるので
正常動作するモデルと数値比較してみたほうがいいかもしれませんね


原因判明

508リンを上手く読み込めない原因
「150左エリ」の親の「149左エリ連D」の付与親の「188左エリ連」で
処理順が149→150→188だから188の値が149に付与されないせいで
150の初期姿勢が不正になって剛体初期値が不正になると

グローバル変形を2周すれば回避できるけど
ボーン処理順の正規化するロジックが欲しいですね

ともあれ、このおかげでいろいろ不備が見つかったのでよかったです



積んでるタスク

1.3Dプログラミング基礎
高速化
物理演算
MMDと比べて重力の影響が大きいのはバージョンの違いなのか実装不具合なのか
ver2.8を入れてみる
並列化の検討 もっといい方法はないか
MMDXのエッジを見る
ボーン処理順の正規化検討

2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの

2012年5月26日土曜日

BulletSharpの衝突設定2

前日書いた件で
Bullet,BulletSharpをリビルドして試してみたものの改善せず

MMMがBulletSharpを使っていたのに気が付き
バージョンを確認してみたところ、特に手を加えている様子はない
表示も正常に行われている

つまり、こちらの剛体設定に何かしらの漏れがあるために
物理演算結果に非数値が返ってくる と

現在設定している内容は

剛体のサイズ
剛体の形状
剛体の重さ
初期姿勢
慣性
移動回転減衰
摩擦力
反発力
非活性化不能設定 ボーン追従時
剛体の動的静的 ボーン追従時
移動回転休止閾値=0,0
衝突グループ番号
非衝突グループリスト
物理空間への剛体追加
剛体活性化(強制)
移動回転速力=0ベクトル

物理空間にジョイント追加


PMXファイルにある情報は設定できている
お約束として普通設定するものが抜けている?

サンプルソースを見て回って手掛かりを見つけよう
また長期化しそうな予感

物理・ボーン位置合わせの考え直し

2012年5月25日金曜日

BulletSharpの衝突設定1

以前、BulletSharpで物理演算を実装したときに、
衝突設定のやり方がわからずに放置していたのを忘れていた。

508リンちゃんのリボン飛びのおかげで思い出せた...

何でやり方がわからないかというと、

物理世界に剛体を追加するメソッドがありまして

public void AddRigidBody(RigidBody body, CollisionFilterGroups group, CollisionFilterGroups mask);

このメソッドの第2,3引数に剛体のグループと非衝突グループの設定を入れるわけですが、
この引数、列挙体なんですよ

[Flags]
public enum CollisionFilterGroups
{
AllFilter = -1,
None = 0,
DefaultFilter = 1,
StaticFilter = 2,
KinematicFilter = 4,
DebrisFilter = 8,
SensorTrigger = 16,
CharacterFilter = 32,
}

PMD,PMXファイルが持っている設定値は0~FFまでの値で
16個のグループに対応するように2進数16桁を10進数にして保持しています。

例えば、
グループ1、非衝突12345とすると

グループ=0000000000000001
非衝突 =1111111111100000

この上下が共に1の場合に衝突が発生する
※と認識しているのですが試せていないので断言できません。

メソッドに戻って、

このようにintを渡す必要があるのに列挙体で0に強制変換されてしまい
どうすればいいんだよって状況に陥ってしまったわけです。

ちなみに呼び出されたメソッド側では
列挙体を(short int)に戻していました。
いったいどういう使い方を想定しているのか...

というわけで今週末はBulletSharpを調べます。

2012年5月20日日曜日

物理演算を別スレッド化

OnRender内でnew Threadしてみたところ
new Thread自体に掛かる時間のため
かえって処理時間が掛かってしまいました。

load時にnew Threadしてwhileで回しておいて
フラグで処理を実行する
この場合はうまくいきましたが、空ループのCPUが無駄になります。

遅延なく呼び出せる方法があるといいのですが...

あと、508リンちゃんのリボンと後ろ髪がとこかに消える
CPUスキニングだとブラックアウトするし
いったい何が悪いのか


積んでるタスク

1.3Dプログラミング基礎
高速化
物理演算
MMDと比べて重力の影響が大きいのはバージョンの違いなのか実装不具合なのか
ver2.8を入れてみる
並列化の検討 もっといい方法はないか
MMDXのエッジを見る
508リンちゃんのリボンどこいったの スカーフの剛体、Jointを削除したら表示された 物理の影響か


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの

2012年5月19日土曜日

SDEFをHLSLに移植

HLSLのデバッグ環境がないので
目を皿にしてバグ取りをしていました。
改善余地はあるもののとりあえず実装完了

物理後ボーンを考慮に入れていないのでどうしようかなと。

スキニング処理をGPUに移したのでCPU負荷はだいぶ改善されました。
GPU:CPU=4:5くらいです。
CPU側を整理して半々に持ち込めればいいかな。

PMXViewerでまったく手付かずなのがエッジ
エッジ表示が嫌いなのでやる気にならないんですよね
反転ポリだから重くなるし
MMDXでは反転ポリじゃない方法を使ってるそうだから
今度見てみようか

その辺りが終わったら基礎調査終了にして
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの
を作ってみたい

もっとも今のコードからSlimDXのサンプル部を排除する苦行が前提ですが...


積んでるタスク

1.3Dプログラミング基礎
高速化
物理演算
MMDと比べて重力の影響が大きいのはバージョンの違いなのか実装不具合なのか
ver2.8を入れてみる
並列化の検討 .net4が必要か 物理前後の処理があるのでタイミングをどうするか
MMDXのエッジを見る


2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

3.3Dプログラミング応用
・ゲームっぽく移動できるもの
・表情をプリクラっぽく出力できるもの
・モデルの首挿げ替えするもの

2012年5月13日日曜日

SDEFをHLSLに持っていく

HLSLに渡すもののピックアップやコードの整理だけで終わってしまった。
BDEF4のことをすっかり忘れてたよ;
weightTypeの分岐までは書けたので続きは来週に持ち越し

積んでるタスク
1.3Dプログラミング
高速化
SDEFをHLSLに移植
物理演算
MMDと比べて重力の影響が大きいのはバージョンの違いなのか実装不具合なのか
2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出
MMDBotSeigaの個人とお題を分けようかな
ごちゃごちゃして見難いし
俺得モデルフェス用のスタンドアロンクローラーマイリスとクリップ

2012年5月12日土曜日

SDEFをHLSLに持っていく準備

HLSLのデバッグ環境ってどうやって作ればいいのか
実行してトライアンドエラーはつらい

#region SDEF
//影響ボーン取得
b0 = this.transVertexList[i].BoneNum1;
b1 = this.transVertexList[i].BoneNum2;

//ボーンマトリックスをブレンド 0.0769%
w1 = this.transVertexList[i].BoneWeight1;
w2 = this.transVertexList[i].BoneWeight2;

if (this.transBoneList[b0].RigidBodyType == 1)
{
skinTransformsb0 = skinTransforms2[b0];
}
else if (this.transBoneList[b0].RigidBodyType == 2)
{
skinTransformsb0 = skinTransforms2[b0];
}
else
{
skinTransformsb0 = skinTransforms1[b0];
}

if (this.transBoneList[b1].RigidBodyType == 1)
{
skinTransformsb1 = skinTransforms2[b1];
}
else if (this.transBoneList[b1].RigidBodyType == 2)
{
skinTransformsb1 = skinTransforms2[b1];
}
else
{
skinTransformsb1 = skinTransforms1[b1];
}

{
//SDEF-C値(x,y,z)
SDEF_C = this.transVertexList[i].SDEF_C;
//SDEF-R0値(x,y,z)
SDEF_R0 = this.transVertexList[i].SDEF_R0;
//SDEF-R1値(x,y,z) ※修正値を要計算
SDEF_R1 = this.transVertexList[i].SDEF_R1;
//R1に対する回転中心の移動割合
SDEF_Weight = this.transVertexList[i].SDEF_Weight;

/*
* ローカル×親×逆BindPose=skinTransform
* skinTransform×BindPose×逆親=ローカル
*
* 1.「b1ボーンの初期Matrix[BindPose]」に「b1ボーンのグローバル変形Matrix[skinTransformsb1]」を掛けて、
*   「b1ボーンの変形後Matrix[globalTransform2]」を求める
* 2a.b1ボーンの親ボーンが物理ボーンの場合、
*   「b1ボーンの変形後Matrix[globalTransform2]」に「b1ボーンの親ボーンの物理変形後Matrixの逆行列」を掛けて、
*   「biボーンのローカル変形Matrix[localTransform2]」を求める
* 2b.b1ボーンの親ボーンが通常ボーンの場合、
*   「b1ボーンの変形後Matrix[globalTransform2]」に「b1ボーンの親ボーンの通常変形後Matrixの逆行列」を掛けて、
*   「b1ボーンのローカル変形Matrix[localTransform2]」を求める
*   localTransform2は初期姿勢を含めた0からの変形量
*   
* ここまでで必要なもの
*  1.this.transBoneList[b1].BindPose
*    InverseBindPoseをすでに渡しているのでどうしたものか
*  2.skinTransformsb1
*    HLSLで算出
*  3.ParentRigidBodyType,ParentRigidBodyIndex
*    親が物理か判定できればいい
*  4.Matrix.Invert(this.transRigidBodyList[this.transBoneList[b1].ParentRigidBodyIndex].RigidBodyTransform)
*  5.Matrix.Invert(this.transBoneList[this.transBoneList[b1].ParentBoneIndex].GlobalTransform)
*    逆行列計算をどちらでやるか matrix.cpp
*/

Matrix globalTransform2 = Matrix.Multiply(this.transBoneList[b1].BindPose, skinTransformsb1);
Matrix localTransform2;
if (this.transBoneList[b1].ParentRigidBodyType > 0 && this.transBoneList[b1].ParentRigidBodyIndex >= 0)
{
localTransform2 = Matrix.Multiply(globalTransform2, Matrix.Invert(this.transRigidBodyList[this.transBoneList[b1].ParentRigidBodyIndex].RigidBodyTransform));
}
else
{
localTransform2 = Matrix.Multiply(globalTransform2, Matrix.Invert(this.transBoneList[this.transBoneList[b1].ParentBoneIndex].GlobalTransform));
}

/*
* 3.「b1ボーンのローカル変形Matrix[localTransform2]」をDecomposeでscale,rotation,translationに分解し
*   「ローカル回転Quaternion[localRotation2]」「ローカル移動Vector3[localTranslation2]」を求める
* 4.「初期回転Quaternionの逆行列?[InverseBindRotation]」に「ローカル回転Quaternion[localRotation2]」を掛けて
*   「ローカル回転変形Quaternion[q2]」を求める
*   「ローカル移動変形Vector3[t2]」を求める
*   
* ここまでで必要なもの
*  6.this.transBoneList[b1].InverseBindTransform
*    Matrix.Decomposeの方法
*
* Decomposeを使用しない
*
* 3.「b1ボーンのローカル変形Matrix[localTransform2]」に「初期変形の逆行列[InverseBindTransform]」を掛けて
*   「ローカル変形Quaternion[m2]」を求める
* 4.「ローカル変形Quaternion[m2]」より「回転成分Vector4[qq]」を取得
* 5.「ローカル変形Quaternion[m2]」より「回転成分Vector4[t2]」を取得
*   
* ここまでで必要なもの
*  6.this.transBoneList[b1].InverseBindTransform
*/

Quaternion q2;
Vector3 t2;

//{
// Vector3 localScale2;
// Quaternion localRotation2;
// Vector3 localTranslation2;
// localTransform2.Decompose(out localScale2, out localRotation2, out localTranslation2);

// q2 = Quaternion.Multiply(this.transBoneList[b1].InverseBindRotation, localRotation2); //※ボーン2から1の回転要素をきれいに抜きたい
// t2 = localTranslation2 - this.transBoneList[b1].BindTranslation; //b2の平行移動
//}

Vector4 qq = Vector4.Zero;
{
Matrix m2 = Matrix.Multiply(localTransform2, this.transBoneList[b1].InverseBindTransform);
//{
// Vector3 localScale;
// Quaternion localRotation;
// Vector3 localTranslation;
// m2.Decompose(out localScale, out localRotation, out localTranslation);

// q2 = localRotation;
// t2 = localTranslation;
//}
{
t2.X = m2.M41;
t2.Y = m2.M42;
t2.Z = m2.M43;

Vector4 q = Vector4.Zero;
q[0] = m2.M11 - m2.M22 - m2.M33 + 1;
q[1] = -m2.M11 + m2.M22 - m2.M33 + 1;
q[2] = -m2.M11 - m2.M22 + m2.M33 + 1;
q[3] = m2.M11 + m2.M22 + m2.M33 + 1;
// 最大成分を検索
int maxIndex = 0;
for (int j = 1; j < 4; j++) { if (q[j] > q[maxIndex])
maxIndex = j;
}
if (q[maxIndex] < 0.0f)
{
// 引数の行列に間違いあり!
}
// 最大要素の値を算出
float v = (float)Math.Sqrt(q[maxIndex]) * 0.5f;

qq[maxIndex] = v;
float mult = 0.25f / v;

switch (maxIndex)
{
case 0: // x
qq[1] = (m2.M12 + m2.M21) * mult;
qq[2] = (m2.M31 + m2.M13) * mult;
qq[3] = (m2.M23 - m2.M32) * mult;
break;
case 1: // y
qq[0] = (m2.M12 + m2.M21) * mult;
qq[2] = (m2.M23 + m2.M32) * mult;
qq[3] = (m2.M31 - m2.M13) * mult;
break;
case 2: // z
qq[0] = (m2.M31 + m2.M13) * mult;
qq[1] = (m2.M23 + m2.M32) * mult;
qq[3] = (m2.M12 - m2.M21) * mult;
break;
case 3: // w
qq[0] = (m2.M23 - m2.M32) * mult;
qq[1] = (m2.M31 - m2.M13) * mult;
qq[2] = (m2.M12 - m2.M21) * mult;
break;
}

float sita = (float)Math.Acos(qq[3]) * 2;
Vector3 axis = new Vector3(qq[0], qq[1], qq[2]);
q2 = Quaternion.RotationAxis(axis, sita);

}
}


/*
* 6.t2にウェイトを掛けてt2wを取得
* 7.「回転成分Vector4[qq]」より回転角度を取得しウェイトを掛けて「回転角度float[sita]」を取得
* 8.「回転成分Vector4[qq]」と「回転角度float[sita]」より移動回転Matrixのベース[skinTransformsb1_2]を生成
*/

Vector3 t2w = t2 * w2;
Matrix skinTransformsb1_2 = Matrix.Identity;

//{
// Quaternion q2w = Quaternion.RotationAxis(q2.Axis, q2.Angle * w2);
// skinTransformsb1_2 = Matrix.RotationQuaternion(q2w);
//}
{
double sita = Math.Acos(qq[3]) * 2 * w2;
Vector3 axis = new Vector3(qq[0], qq[1], qq[2]);
//axis.Normalize();
//axis[0] = axis[0] * (float)Math.Sin(sita / 2);
//axis[1] = axis[1] * (float)Math.Sin(sita / 2);
//axis[2] = axis[2] * (float)Math.Sin(sita / 2);
//float w = (float)Math.Cos(sita / 2);
double d = axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2];

double[] st = new double[16];
st[0] = st[5] = st[10] = st[15] = 1.0;
if (d != 0.0)
{
double u = Math.Sqrt(d);
double l = axis[0] / u, m = axis[1] / u, n = axis[2] / u;
double l2 = l * l, m2 = m * m, n2 = n * n;
double lm = l * m, mn = m * n, nl = n * l;
double s = Math.Sin(sita);
double c = Math.Cos(sita);
double c1 = 1.0 - c;

st[0] = (1.0 - l2) * c + l2;
st[1] = lm * c1 + n * s;
st[2] = nl * c1 - m * s;
st[3] = 0.0;

st[4] = lm * c1 - n * s;
st[5] = (1.0 - m2) * c + m2;
st[6] = mn * c1 + l * s;
st[7] = 0.0;

st[8] = nl * c1 + m * s;
st[9] = mn * c1 - l * s;
st[10] = (1.0 - n2) * c + n2;
st[11] = 0.0;

st[12] = st[13] = st[14] = 0.0;
st[15] = 1.0;
}
skinTransformsb1_2[0, 0] = (float)st[0];
skinTransformsb1_2[0, 1] = (float)st[1];
skinTransformsb1_2[0, 2] = (float)st[2];
skinTransformsb1_2[0, 3] = (float)st[3];
skinTransformsb1_2[1, 0] = (float)st[4];
skinTransformsb1_2[1, 1] = (float)st[5];
skinTransformsb1_2[1, 2] = (float)st[6];
skinTransformsb1_2[1, 3] = (float)st[7];
skinTransformsb1_2[2, 0] = (float)st[8];
skinTransformsb1_2[2, 1] = (float)st[9];
skinTransformsb1_2[2, 2] = (float)st[10];
skinTransformsb1_2[2, 3] = (float)st[11];
skinTransformsb1_2[3, 0] = (float)st[12];
skinTransformsb1_2[3, 1] = (float)st[13];
skinTransformsb1_2[3, 2] = (float)st[14];
skinTransformsb1_2[3, 3] = (float)st[15];
}

/*
* 9.SDEF_R1をウェイト100%と想定
*   BoneHeadPosを中心としてSDEF_R1を100%回転位置に持っていくために中心座標pos2を求める
*   pos2 = SDEF_R1 - this.transBoneList[b1].BoneHeadPos;
* 10.pos2を「ローカル回転変形Quaternion[q2]」で回転し、座標posR1を求める
* 11.SDEF_R1の移動量を取得
*   diffR1 = posR1 - pos2
* 12.SDEFウェイトを掛けて基準回転中心SDEF_Cの移動量を求める
*   diffR1_w = diffR1 * SDEF_Weight
* 13.「移動回転Matrixのベース[skinTransformsb1_2]」にSDEF_C、diffR1_w、t2wを加算し回転中心を設定
* 14.頂点の回転用座標を求める
*   skinPos = this.transVertexList[i].SkinPosition - SDEF_C
* 15.skinPosを「移動回転Matrixの[skinTransformsb1_2]」で回転し、座標outPos、法線outNorを求める
* 16.親移動回転skinTransformsb0を掛けて完了
*/

//子ボーン
Vector4 outPos;
Vector3 outNor;
{
//(1)回転+元位置への戻し+移動+(0)回転+移動
{
//他ウェイト頂点の線形移動量
Vector3 diffR1_w = Vector3.Zero;
{
//R1'の移動量
Vector3 diffR1;
{
//R1移動後座標:R1'
//Vector4 posR1;
//{
// Vector3 pos2 = SDEF_R1 - this.transBoneList[b1].BoneHeadPos;
// Vector3.Transform(ref pos2, ref q2, out posR1);
// posR1.X = posR1.X + this.transBoneList[b1].BoneHeadPos.X;
// posR1.Y = posR1.Y + this.transBoneList[b1].BoneHeadPos.Y;
// posR1.Z = posR1.Z + this.transBoneList[b1].BoneHeadPos.Z;
//}
//diffR1.X = posR1.X - SDEF_R1.X;
//diffR1.Y = posR1.Y - SDEF_R1.Y;
//diffR1.Z = posR1.Z - SDEF_R1.Z;

Vector3 pos2 = SDEF_R1 - this.transBoneList[b1].BoneHeadPos;
Vector4 posR1;
Vector3.Transform(ref pos2, ref q2, out posR1);
diffR1.X = posR1.X - pos2.X;
diffR1.Y = posR1.Y - pos2.Y;
diffR1.Z = posR1.Z - pos2.Z;
}
//
diffR1_w.X = diffR1.X * SDEF_Weight;
diffR1_w.Y = diffR1.Y * SDEF_Weight;
diffR1_w.Z = diffR1.Z * SDEF_Weight;
}
skinTransformsb1_2.M41 = SDEF_C.X + diffR1_w.X + t2w.X;
skinTransformsb1_2.M42 = SDEF_C.Y + diffR1_w.Y + t2w.Y;
skinTransformsb1_2.M43 = SDEF_C.Z + diffR1_w.Z + t2w.Z;
}
//頂点を回転用座標へ移動
Vector3 skinPos = this.transVertexList[i].SkinPosition - SDEF_C;
Vector3.Transform(ref skinPos, ref skinTransformsb1_2, out outPos);
Vector3.TransformNormal(ref this.transVertexList[i].Normal, ref skinTransformsb1_2, out outNor);
}
//親ボーン
{
Vector3 inPosition;
inPosition.X = outPos.X;
inPosition.Y = outPos.Y;
inPosition.Z = outPos.Z;
Vector3 inNormal;
inNormal.X = outNor.X;
inNormal.Y = outNor.Y;
inNormal.Z = outNor.Z;
Vector3.Transform(ref inPosition, ref skinTransformsb0, out outPosition);
Vector3.TransformNormal(ref inNormal, ref skinTransformsb0, out outNormal);
}
}

#endregion

2012年5月9日水曜日

俺得モデルフェス2

MMDBotSeigaのDBから俺得モデルフェス2の情報を抽出

コメントのURLをばらしてみたけれど使い道があるだろうか
http://bowlroll.net/up/dl5059

2012年5月6日日曜日

徒然なるままに

徒然なるままに、blogなど始めてみる。

日曜プログラマーなので週1ペースで
備忘録代わりに進捗と予定など書いていこうかな

積んでるタスク
1.3Dプログラミング
高速化
SDEFをHLSLに移植
Matrix.Decompose、Quaternion.RotationAxisの数式が課題
物理演算
MMDと比べて重力の影響が大きいのはバージョンの違いなのか実装不具合なのか
2.ツイッターbot
MMDBotAgentのタイムラインからトレンド抽出

2012年4月30日月曜日

以前の日記 2012年04月30日

SDEFの実装にえらい時間が掛かったので
参考にしたページのリンクを( ..)φメモメモ

Mikoto作者のゆーり氏
http://www.ipa.go.jp/SPC/report/02fy-pro/report/1220/paper.pdf

実験的観測
http://mattaku.sa-ra-sa.com/techbbs/su1_guestbook.cgi?action=showlast&cat=&txtnumber=log&next_page=30&t_type=

mqdlさんの概念解説
http://d.hatena.ne.jp/mqdl/20080525

dual quaternion skinning
http://isg.cs.tcd.ie/projects/DualQuaternions/

Spherical Blend Skinning
http://www.tmps.org/index.php?%A5%AF%A5%A9%A1%BC%A5%BF%A5%CB%A5%AA%A5%F3%A5%B9%A5%AD%A5%CB%A5%F3%A5%B0

以下、感想

最初に概念解説を見て
Spherical Blend Skinningの派生なのかなと思って
とりあえずSBSを実装してみようとしたのですが、

まったく理解できなかった上
そこに登場しなかったR0,R1を重要要素ではないと勘違いしてしまい
しばらくの間袋小路入り

実験的観測を見つけることができたのは幸いでした
図解のおかげでR0は0%ウェイト、R1は100%ウェイト座標と理解し、
計算式を模索

ここまででローカル変化量で綺麗に曲がるのを確認

さらにグローバル、物理演算の影響を考慮
この辺りよく理解していなかったのでよい機会でした

先人はこんなのよくホイホイ作れるなと感心しますね