2015年6月20日土曜日

MikuMikuDanceのガラスが透けない時の対処方法

How to correct the transparent parts
CG動画作成ソフトのMikuMikuDance(以下MMD)は、ゲーム開発ツールのUnityなどと異なる点が多々あります。
特にガラスなどの透過を表現する時は設定が必要な場合があります。
透過の表示が異常な場合の対処方法をまとめてみました。


環境

・Windows8.1
・MMD 9.10


モデル名の表記について

MMDのモデル名の表記は「○○式□□」とします。
○○はモデルデータの作者名、□□はモデルデータのキャラクター名です。


アクセサリーの透過設定

Lat式初音ミクにA01hudebako式メガネをかけさせてみました。
初音ミクは拡張子がpmd(pmx)のモデルデータで、メガネは拡張子がxのアクセサリーです。レンズが透けません。

角度を変えるとレンズの向こうにメガネのツルや座標軸が見えています。

対処方法はメニューの
背景 - アクセサリ編集
を開きます。

「1番目より後の・・・」の設定を「0番目より後の・・・」に変更します。

これで正しく表示されました。

MMEが正しく表示されない場合もこの設定で表示されることがあります。

モデルの透過設定

マシシ式MEIKOを自動車(hata式ソアラ)に乗せました。
MEIKOも自動車も拡張子がpmdまたはpmxのモデルデータです。
自動車のガラスが透けないのでおかしなことになっています。

対処方法はメニューの
背景 - モデル描画順
を開きます。

MEIKOのモデル描画順が自動車より上になるように設定してOKをクリックします。

これで正しく表示されました。

透過パーツを持つモデルは描画順を出来るだけ下に設定すると正しく表示されます。


関連ブログ

コミPo!で初音ミクのMMDモデルを使う
プロ生ちゃんMMDモデルを踊らせよう
[MMD] プロ生ちゃんのスパッツに厚みを付ける
[Unity3D] Unityでプロ生ちゃんMMDモデルを扱う

以上、参考になれば幸いです。

2015年6月13日土曜日

[ASP.NET] ポストバック処理で実行するJavaScriptを選ぶ方法

How to control running JavaScript after PostBack
ASP.NETはポストバック処理からWebページのJavaScript関数(function)を直接実行する機能はないようです。
それでもJavaScriptの関数を実行するタイミングをポストバックで制御したかったのでどうにかしてみました。


環境

・Windows8.1
・Visual Studio Community 2013
・C#


どうするか?

次の処理を自分で作りました。
  1. ASP.NETのポストバック処理はJavaScriptを実行したタイミングで画面上のラベル(<span>タグ)を特定の内容に変更する
  2. JavaSriptはラベルの表示が特定の内容になったら実行するように監視し続ける
ASP/NET Ajaxでラベルの内容を変化させた場合の監視漏れがないように、JavaScriptは再帰呼び出しによる無限ループで監視します。
ラベルはユーザーに見せる必要が無いのでスタイルシートで非表示に設定します。


ソース

JsFromCSharp.aspx


JsFromCSharp.aspx.cs



画面を開いただけでは何も起きません。
ボタンをクリックするとポストバックされた後、JavaScriptが実行されます。

とても強引な気がしますが、JavaScriptでしか実行できないライブラリーを使うなど、やむを得ないときには効果あると思います。



関連ブログ

[ASP.NET] 動的に追加したイベントが動作しない
[ASP.NET] 動的に追加したラベルやテキストボックスが消える現象の対策
[C#] タスクトレイにバルーンチップを表示するアプリ
[Unity3D] Visual Studio Community 2013を日本語化してUnityアプリを作る
Unity3DのソースをVisual Studio Expressで編集する

以上、参考になれば幸いです。

2015年6月6日土曜日

[ASP.NET] 動的に追加したイベントが動作しない

How to keep additional events after PostBack
ASP.NETでユーザーの操作によって画面にボタンを追加するアプリを作ったときに悩んだ内容をまとめました。
ボタンをクリックしたら新しいボタンを画面に追加するアプリを作ったのですが、新しいボタンのイベントが実行されません。


環境

・Windows8.1
・Visual Studio Community 2013
・C#


イベントが動作しない例

1. Button1をクリックすると新しいボタンを追加する
2. 新しいボタンをクリックするとラベルの文字を変化させる
というWebアプリを作ろうとして失敗した例です。

DynamicControls.aspx


DynamicControls.aspx.cs


DynamicControls.aspx.designer.cs


実行するとこうなります。
Button1をクリックすると新しいボタンが追加されるまではいいのですが
新しいボタンをクリックしても期待通りに動作しません。


修正後

[HOWTO] Visual C# .NET を使用して ASP.NET で動的にコントロールを作成する方法
http://support.microsoft.com/kb/317794/ja
によると
OnInit イベント ハンドラまたは Page_Load イベント ハンドラで、作成したコントロールをコントロール コレクションに追加する必要があります。
とのことです。

上のソースで期待通りに操作しなかった原因は、動的に追加するボタンをOnInitイベントやPage_Loadイベントで追加しなかったためです。

新しいボタンを追加する処理をPage_Loadイベントで発生させるように修正します。
ただし、ASP.NETはイベントごとにポストバックが発生し、OnInitイベントやPage_Loadイベントが処理されます。
Button1をクリックしたときだけPage_Loadで新しいボタンを追加するように工夫します。

ボタンのUseSubmitBehaviorプロパティをFalseに設定すると、ポストバックした際Page_LoadイベントのRequest["__EVENTTARGET"]にボスとバックさせたボタンのIDが設定されます。

というわけで
・ボタンの追加をPage_Loadイベントで処理
・ボタンのUseSubmitBehaviorをFalseに設定
に修正したのが次のソースです。


これで期待通りに動作しました。


まとめ

動的に追加したイベントはポストバック後のPage_Loadより後に発生します。
動的にコントロールを追加する場合はポストバックの前と後に画面に配置するように工夫すればすればいいと思います。

※ボタンを配置して生成されるHTMLタグはUseSubmitBehaviorプロパティが
Trueの場合は<input type="submit">
Falseの場合は<input type="button"> とonclickイベントのJavaScript
に変わります。プロパティ名通り振る舞いが変わるのでリファクタリングするときは要注意です。



関連ブログ

[ASP.NET] ポストバック処理で実行するJavaScriptを選ぶ方法
[ASP.NET] 動的に追加したラベルやテキストボックスが消える現象の対策
[C#] タスクトレイにバルーンチップを表示するアプリ
[Unity3D] Visual Studio Community 2013を日本語化してUnityアプリを作る
Unity3DのソースをVisual Studio Expressで編集する

以上、参考になれば幸いです。

2015年5月30日土曜日

[ASP.NET] 動的に追加したラベルやテキストボックスが消える現象の対策

How to keep the Panel controls in PostBack
ASP.NETでアプリ開発中に悩んだことがあったのでまとめてみました。

環境

・Windows8.1
・Visual Studio Community 2013
・C#


動的にラベルやテキストボックスを追加する

ASP.NETのPanelコントロールはラベルやテキストボックスを動的に追加することが出来ます。
本来はHTMLのデザインは静的に定義しておいた方がメンテナンスしやすいのですが、動的に追加したいことがあると思います。

次のソースはボタンをクリックするとPanelに現在時刻のラベルを追加するサンプルですが期待通りの動作ではありません。

index.aspx.cs


index.aspx


index.asp.designer.cs


実際に操作すると何度クリックしてもPanelには一つのラベルしか追加されません。
WindowsFormと違い、ASP.NETはボタンをクリックするとポストバックが処理され、Panelが初期化されてしうためです。
ソースは省略しますがUpdatePanelを使ったASP.NET Ajaxで作り替えてもWebアプリでも同様に一つのラベルしか追加されません。
ASP.NET Ajaxは画面遷移しませんがポストバックと同様のイベントが処理されるためです。


解決策

PanelにWebコントロールを追加する処理は、Page_LoadイベントでWebコントロールをすべて追加するようにしました。
クリックした時の時刻を文字列のリストに格納してリストの内容をPanelにすべて表示します。リストはSession変数に保存します。

修正したindex.aspx.cs



List<string>はシリアライズ可能なのでViewState変数に保存することも出来ます。

ViewState変数を使うように修正したindex.aspx.cs


MVCモデルでいうビューとコントローラーの分離が出来ないのが難点です。


関連ブログ

[ASP.NET] ポストバック処理で実行するJavaScriptを選ぶ方法
[ASP.NET] 動的に追加したイベントが動作しない
[C#] タスクトレイにバルーンチップを表示するアプリ
[Unity3D] Visual Studio Community 2013を日本語化してUnityアプリを作る
Unity3DのソースをVisual Studio Expressで編集する

以上、参考になれば幸いです。

2015年5月23日土曜日

[Unity3D] クエリちゃんの二重あご説という誤解を解く

Querychan is not fat at all
2015年5月、クエリちゃんがこんなツイートをしました。
クエリちゃんはポケット・クエリーズ社のマスコットキャラクターです。ゲーム開発ツールのUnity3Dのアセットストアでクエリちゃんのアセットが無料で公開されています。
ファンクラブもあります。
http://www.query-chan.com/
なぜクエリちゃんの二重あご説が出回ってしまったのか検証しました。


環境

・Windows 8.1
・Unity 5.0.1


3次元CGが表示される仕組み

Unity3DだけでなくMikuMikuDance(MMD)で使われる3次元CGは頂点の座標とその順番のデータの集合です。画面に表示するときは各頂点を順番に結び合わせて線や面を表現します。
面は質感を表現するため単なる塗りつぶしではなく画像を表示することが多いです。面に画像を表示する機能をテクスチャと言います。
下の画像はUnity3Dのマスコットキャラクター・ユニティちゃんです。ユニティちゃんもまたUnity3D用のモデルデータなどが公開されています。
青い線が各頂点を結ぶ線です。
次の画像は怒った顔のユニティちゃんです。
目・眉・口の頂点を移動し、それに付随する面を伸縮することで表情を表現しています。
表情などの表現のために頂点を移動することをモーフと言います。


クエリちゃんの表情はモーフではなくテクスチャ

クエリちゃんも無数の頂点とテクスチャの組み合わせで出来ています。
ですが、ユニティちゃんとの大きな違いは表情をモーフではなくテクスチャの画像で表現している点です。

クエリちゃんは表情毎にテクスチャ画像が用意されています。
口を結んでいるときと開けているときとではあごの形が変わるわけですが、これもモーフではなく顔のパーツが2種類用意されています。
クエリちゃんは表情に合わせてテクスチャの画像を差し替えたり顔のパーツを表示・非表示する仕様です。
2種類の顔のパーツを同時に表示するとわずかにずれて重なって表示されるため、二重あご説が拡散されたようです。
クエリちゃんは二重あごではありません。

ユニティちゃんも二人重ねれば二重あごになります。(重ねることはないと思いますが)


ユニティちゃん方式(モーフで表情をつける)のメリット

モーフは頂点の移動量を混ぜる(ブレンドする)ことができます。
例えば口を結んでいるモーフとあんぐり開けてるモーフを半分ずつブレンドすれば口を半開きにできます。


クエリちゃん方式(テクスチャで表情をつける)のメリット

テクスチャはあらかじめ用意した画像を面に表示する機能なので、モーフのようにブレンドすることが出来ません。
ですが、2次元の画像編集ソフトを使えば比較的簡単にオリジナルのテクスチャ画像を作ることができます。
下の画像はクエリちゃんの表情のテクスチャを自分で作ったものです。
新しいモーフを追加するとなると3次元のCG編集ソフトを使いこなす必要があるのでそれなりに難しいです。
テクスチャなら元の画像を改変するだけなのでモーフの追加ほど難しくありません。


クエリちゃんの手のパーツは3種類

クエリちゃんは手首や指の関節が曲がらない代わりにグー・パー・半開きの3種類のパーツがあります。
使いたい手の形だけを表示して使う仕様です。


クエリちゃんモデルのFBX

クエリちゃんのアセットはFBXファイルが付属します。FBXは3次元CGで広く使われているフォーマットです。
FBXの読み込みに対応しているCLIP STUDIO COORDINATEを使ってみたところ、クエリちゃんのFBXファイルを読み込むことが出来ました。
テクスチャの画像ファイルは自分で指定する必要がありました。
2つの顔が重なったまま表示されます。
手も3種類全て表示されています。



クエリちゃんについて詳しいプロ生の動画があります


勉強会は動画で見るより会場に行った方が情報量が圧倒的に多いです。


関連ブログ

[Unity3D] サイドバイサイドで立体視できるゲームを作るには [クエリちゃん][ユニティちゃん]
[Unity3D] Unity5のアプリをAndroid Studioにインポートする方法
[Unity3D] Unity4からUnity5へのバージョンアップでの変化
[Unity3D] ゲーム画面をキャプチャしてMovie Studioで動画に編集する
[Unity3D] Visual Studio Community 2013を日本語化してUnityアプリを作る
CLIP STUDIO COORDINATE でプロ生ちゃんを使ってみる
[Android] OpenGLで頂点の多いポリゴンを扱うには



以上、参考になれば幸いです。

2015年5月16日土曜日

ツイッターのツイート履歴CSVを文字化けしないようにExcelに取り込む方法

How to import tweets CSV files into Excel
2013年頃からTwitterは自分が投稿したツイートをCSVファイルでダウンロード出来るようになりました。
このCSVファイルを無加工でExcelで開くと文字化けして使い物になりません。
文字化けしないようにExcelで開けるようにするまでの手順をまとめてみました。


環境

・Windows 8.1
・Excel 2010


全ツイート履歴を要求するしCSVファイルをダウンロードする

全ツイート履歴はPCのブラウザーでTwitterにログインして設定画面から要求できます。
AndroidのTwitter公式アプリは全ツイート履歴の要求画面が見当たりませんでした。
このボタンをクリックすると、ダウンロードURLが書かれたメールが届き、zipファイルでダウンロードできます。
zipファイルをかいとうすると「tweets.csv」という目的のCSVファイルがあるはずです。


Excelで開く前に文字エンコードをShift_JISに変換する

tweets.csvをExcelで開くと文字化けするのはCSVファイルの文字コードがUTF-8だからです。
Shift_JISのCSVファイルならExcel出文字化けせずに開けます。
ツイート履歴のCSVファイルの文字コードをShift_JISに変換して保存すれば、UTF-8に依存した文字は失われますが改行箇所はそのままExcelに取り込めます。

MtkはEmEditorを使っているのですが、EmEditorならcsvファイルを開いて「全てエンコードを指定して保存」で「シフトJIS」を選択すればShift_JISに変換できます。
フリーの文字コード変換ツールならコマンドライン専用ですがnkfというものがあるようです。


Shift_JISに変換しない場合は細工が必要

手間はかかりますがCSVファイルを細工すればUTF-8のままExcelで開くことが出来ます。
詳しくは続けて説明しますが、大まかに次の操作が必要でした。
  • ファイル名の拡張子をtxtに変更する
  • 行の途中の改行を削除する
  • Excelでテキストファイルの区切り文字と引用符を指定して開く


ファイル名の拡張子をtxtに変更する

ExcelへのShift_JIS以外のCSVファイルの取込は文字化けの原因になるのですが、テキストファイルの取込ならUTF-8でも文字化けしません。
Excelへテキストファイルとして取り込むためツイート履歴のCSVファイルの拡張子をtxtに変更します。


行の途中の改行を削除する

Twitterに改行を含む文章を投稿するとCSVファイルのツイート履歴も改行されています。
下の図だと、50行目と52行目はそれぞれ前の行の途中で改行しています。
文章中の改行を残したままのテキストファイルはこの後のに取り込みで失敗することがあったので、投稿文の改行を削除します。
改行の削除には正規表現で置換できるテキストエディターが必要です。
EmEditorでの方法を説明します。
EmEditorでtweets.csvを開きます。
Ctrlキーを押しながらHキーを押すか、メニューの 検索 - 置換を開きます。
次のように操作します。入力する内容を間違えるとファイルの内容が壊れます。

  • 検索する文字
    \n([^"])
  • 置換後の文字列
    $1
  • 正規表現を使用するをチェック
この状態で[全て置換]ボタンをクリック


Excelでテキストファイルの区切り文字と引用符を指定して開く

Excelのメニュー
ファイル - 開く
でテキストファイルを開きいます。
「カンマやタブなどの区切り文字によって・・・」を選択して次へ。
区切り文字はカンマを選択して次へ
列のデータ形式は文字列を選択します。
この画面のデータプレビューに全部で10列くらいありると思いますが列を一つずつクリックしてそれぞれの列のデータ形式を文字列に設定して完了です。

エラーや文字化けがなければ成功です。


使い道は

Excelに取り込めたら検索なりフィルターなりで過去の投稿を好きなように見ることが出来ます。
Webアプリの勉強がてらにツイートを投稿したり削除するツールを作りたかったのですが検索APIに制限があったので、Excelで削除したいツイートのステータスIDを探して画面にコピーペーストするツールのために使ってます。
なお、他人のツイート履歴はダウンロードできません。


関連ブログ

[セキュリティ] Twitterの「このリンクは安全ではない」「このリクエストを保留しています」の対策2015年版
ツイッターAPIの検索で複数の画像URLが取得できない対策方法
Blogger.com(blogspot)のブログにツイッターカード(リンク先のプレビュー)を設定する
[Android] アプリからツイートするとハッシュタグが消える(URLエンコード漏れ)
[GIMP] GIFアニメーションの作り方

以上、参考になれば幸いです。

2015年5月9日土曜日

ツイッターAPIの検索で複数の画像URLが取得できない対策方法

How to get multiple pictures URL from Twitter API
ツイッターはアプリ開発者向けにAPIを公開しています。
APIを使ってツイート分の取得や投稿、プロフィールの設定などが出来るようになってます。
ほとんどのAPIがリクエストはHTTPによるGET、SET、POST、DELETEで行い、レスポンスはJSONフォーマットのテキストデータで返す仕様です。
実際に利用するには
https://apps.twitter.com/
からCreate New Appでアプリを登録してConsumer KeyやConsumer Secretを発行してもらう必要があります。

Webアプリの勉強がてらにツイッターAPIを使って悩んだことがあったのでその内容をまとめてみました。
特定のプラットフォームに限定されない話なのでソースコードはありません。


環境

・Windows8.1
・Visual Studio Community 2013
・CoreTweetライブラリーなど


検索APIでは複数の画像のURLが取得できない

検索APIはツイッターを検索するAPIです。
公式ドキュメントはこちら
https://dev.twitter.com/rest/reference/get/search/tweets

非サブスクリプションの開発者でも使えますが過去1週間以内の投稿しか検索できないなどの制限があります。
特に複数の画像を投稿されたツイートを検索しても、一つの画像のURLしか取得できない制限があります。
たとえば、次のツイートは二つの画像が投稿されています。

このツイートを検索APIで取得したJSONデータの画像に関する部分は次の通りです。(一部省略)
最初の1件の画像URLしか取得していません。


全ての画像URLを取得するにはSearch以外のAPIを使う

検索APIだけは1件の画像しか取得できませんが、他のAPIを使えば全ての画像URLを取得できます。
statuses/show/:idというAPIは全ての画像URLが取得できました。
公式ドキュメントはこちら
https://dev.twitter.com/rest/reference/get/statuses/show/%3Aid
statuses/show/:idはステータスIDを指定してJSONデータを取得するAPIです。
検索APIで取得したステータスIDをstatuses/show/:idでJSONデータを取得すると次のようになります。


無事に2枚の画像URLを取得することが出来ました。


検索APIだけ特別らしい

statuses/show/:id のほか statuses/user_timeline でも全ての画像URLが取得できました。
検索APIだけが特別なJSONを返すようです。
画像URL以外もおかしい値があるかもしれません。


関連ブログ

[セキュリティ] Twitterの「このリンクは安全ではない」「このリクエストを保留しています」の対策2015年版
[Unity3D] Visual Studio Community 2013を日本語化してUnityアプリを作る
[C#] タスクトレイにバルーンチップを表示するアプリ

以上、参考になれば幸いです。