Unityの立方体のuvをいじくる

Visual Studio Tools for Unity 1.9 公開されましたね.
UnityのC#Visual studio で書けるってすばらしい.
えっ? Express edition では使えない!? (゚д゚)!

orz

気を取り直して,今日の本題です. Unity の立方体の各面に,それぞれ別の絵を表示させたい時ってありすよね.
例えば,サイコロとか.
別のソフトで,テクスチャ込の立方体モデルを作ってそれを読み込ませるのが順当な手だとは思うんですが,それはめんどくさい o(`ω´*)oプンスカプンスカ!!
というわけで,C#でメッシュのuvをいじってなんとかしてみたいと思います.
(そっちのがめんどくさいだろというツッコミはスルー

UnityのCubeは六面体,当然ですが,面が6個あります. その面は4つの頂点を持っており,それぞれの面の頂点を別物ととらえると6x4=24個の頂点があります.
この24頂点のuv値を,表示させたい画像に合わせて変更してあげればいいわけです.

それぞれの頂点は,下図のような関係にあると思われます.
(まちがってたらごめんんさい 

f:id:rinor:20140808161155p:plain

この図を参考に,スクリプト上で,gameObjectから取得したメッシュのUVを書き換えてあげればOKです.
ソースコードは以下のような感じにして,下記のようなサイコロ画像を読み込ませればたぶん大丈夫です.

f:id:rinor:20140808164621p:plain

using UnityEngine;

public class UVChange : MonoBehaviour
{

    Vector2[] uv = new Vector2[24];

    void Awake()
    {
        // 1の面
        uv[2].x = 0.0f; uv[2].y = 0.0f;
        uv[3].x = 1.0f / 6.0f; uv[3].y = 0.0f;
        uv[0].x = 0.0f; uv[0].y = 1.0f;
        uv[1].x = 1.0f / 6.0f; uv[1].y = 1.0f;

        // 2の面
        uv[4].x = 1.0f / 6.0f; uv[4].y = 0.0f;
        uv[5].x = 2.0f / 6.0f; uv[5].y = 0.0f;
        uv[8].x = 1.0f / 6.0f; uv[8].y = 1.0f;
        uv[9].x = 2.0f / 6.0f; uv[9].y = 1.0f;

        // 3の面
        uv[23].x = 2.0f / 6.0f; uv[23].y = 0.0f;
        uv[21].x = 3.0f / 6.0f; uv[21].y = 0.0f;
        uv[20].x = 2.0f / 6.0f; uv[20].y = 1.0f;
        uv[22].x = 3.0f / 6.0f; uv[22].y = 1.0f;

        // 4の面
        uv[19].x = 3.0f / 6.0f; uv[19].y = 0.0f;
        uv[17].x = 4.0f / 6.0f; uv[17].y = 0.0f;
        uv[16].x = 3.0f / 6.0f; uv[16].y = 1.0f;
        uv[18].x = 4.0f / 6.0f; uv[18].y = 1.0f;

        // 5の面
        uv[15].x = 4.0f / 6.0f; uv[15].y = 0.0f;
        uv[13].x = 5.0f / 6.0f; uv[13].y = 0.0f;
        uv[12].x = 4.0f / 6.0f; uv[12].y = 1.0f;
        uv[14].x = 5.0f / 6.0f; uv[14].y = 1.0f;

        // 6の面
        uv[6].x  = 5.0f / 6.0f; uv[6].y  = 0.0f;
        uv[7].x  = 6.0f / 6.0f; uv[7].y  = 0.0f;
        uv[10].x = 5.0f / 6.0f; uv[10].y = 1.0f;
        uv[11].x = 6.0f / 6.0f; uv[11].y = 1.0f;
    }



    // Use this for initialization
    void Start()
    {
        MeshFilter mf = gameObject.GetComponent<MeshFilter>();
        mf.mesh.uv = uv;
    }

    // Update is called once per frame
    void Update()
    {

    }
}

The Killing Pawn 感想

私は漫画が大好きで,毎週少年誌を買っていて,今週も当然マガジンを購入したのですが,そこに載っていた読み切りがすごく衝撃的でした.
読み切りのタイトルは「The Killing Pawn」
ARMSの皆川先生作画,進撃の巨人の諌山先生原作の将棋バトル漫画だそうです.

以下,ネタバレを含む可能性があります.

( ゚д゚)ポカーン ←読み終わった時の顔
将棋バトルってそういう意味!?
らんま1/2の○○格闘術的な!?
将棋というか,将棋使いやん! (バレーボール使いみたいな感じで
完全にテニプリ路線.
そして泣くようぐいす的なオチ

ぶっちゃけ面白かったです.

面白かったですけど,わらったら負けな気がするのは,なぜでしょうか・・・.

(´ε`;)ウーン…

なんかこう,笑わせようとしてるのが見え見えの展開で笑ってしまうのが,すごく悔しいというか,なんというか・・・.

とにもかくにも面白いには違いないので,読んでない人は読んでみるといいと思います. ギャグ漫画系の読み切りの中では,ボーボボの読み切りの次に笑いました
アッヒャッヒャ!ヽ(゚∀゚)ノアッヒャッヒャ!

それはそうと,マガジンの新連載面白そう( ^ω^)ワクワク

あえてAnacondaに頼らないpythonインストール

windowspythonをインストールする時って,Anacondaが便利ですよね.
でも,Anacondaじゃ上手くいかない時もあるんです!
というか,あったんです・・・.

まぁ,めったにないとは思いますが,そんな時のためにpythonのインストール方法をメモメモ!
python, easy_install, pip, ipython までを入れたいと思います!

python 本体のインストール

python のホームページから最新版のインストーラをダウンロードします.
私の場合は,python2.7.8 でした.

インストール終了後,環境変数の設定を行います. ユーザ環境変数のパスに

C:\Python27;C:\Python27\Scripts

と入れてあげます.
別のディレクトリにpythonが入っている場合は,C:\Python27の部分をインストールディレクトリに読み替えてください.

pip のインストール

pipは,コマンドプロンプト上からpythonパッケージをインストールするツールのようです.
apt-getのpython版みたいなものでしょうか?
pipをインストールするには,easy_install というツールを使います. では,まずeasy_install をインストールしましょう. windows7の場合は,こちらのページから,ez_setup.py をダウンロードしてきて実行します.

python ez_setup.py

続いて,pipのインストールです.

easy_install pip

たったこれだけ.
この時,うまくインストールされない場合は,別バージョンのpipが残っていたりする場合があるので,エラーメッセージに表示されているディレクトリをポイしちゃいましょう.
たぶん,これで大丈夫です.たぶん.

ipython のインストール

補完機能が強力で対話的にコードが書けるipython を入れます.

pip install ipython[all] --upgrade

こうしておけば,ipythonを使うのに必要なあれやこれやを全てインストールしてくれる・・・と思います.

別ディレクトリのパッケージをimportするには?

python がすごく便利だと友人から進められて勉強しだしたものの,なかなか覚えられません...
しばらくは,このブログがメモ代わりになりそうです.

閑話休題

ディレクトリAの中に,ディレクトリB, C があるとします.
今,Bの中にいるとして,C内のcc.py にアクセスしたいとき,普通にアクセスしようとすると何か怒られてしまいます.

下記のコードのようにすればいいようです.

import sys, os
sys.path.append(os.pardir) # 親ディレクトリをpythonパスを追加
from C import cc

これで,うまく行く!と思いきや,ipython notebook で実行してみるとまた怒られちゃいました.
原因は複数のcellの内,どれかが未実行で最新になってなかったからなような,ちがうような・・・?
何度か実行してたらうまくいったので,たぶん上記の方法で大丈夫だと思うんですが,やはりpythonの勉強不足感が否めません・・・.

ipython notebook を html に吐き出してブログ記事に張り付ける

ipython 便利ですよね.
notebook を使うとさらに便利ですよね.
それをブログ記事に張り付けられたら,楽ちんですよね!

というわけで,調べてみました.

ipython nbconvert --to html GmmMethods.ipynb --template basic

たったこれだけ!
あとは,できたhtmlファイルの内容をコピーして,ブログの記事を書くところに張り付けてあげれば,下記のような感じで表示されます.
ただ,画像とかはやっぱり表示されないんで,そのあたりは何か手を考えないとです.
もっと言えば,コピペすらめんどくさいです.
もっといい方法ないんでしょうか???

 

GMM 学習・尤度計算・シリアライズ etc.

 

共通インポート

In [4]:
#coding:utf-8
from numpy import dtype, fromfile, diag
from sklearn.mixture import GMM
from sklearn.externals import joblib
import pylab as pl
import matplotlib as mpl
from pylab import *
import json, codecs
 

バイナリファイル読み込み

バイナリファイルを読み込んでNumpy.arrayに格納する関数です.
col次元のデータをrowフレーム分読み込みます.
arrayには,array[row][col] とう形で保存されます.

In [1]:
def ReadData(filename, dim = 24, dtype = "<d8"):
    f = open(filename, 'rb')
    data = fromfile(f, dtype)
    row = data.size / dim
    data.resize(row, dim)
    return data
 

GMMをJsonに吐き出す

In [24]:
def Gmm2Json(gmm, jsonFile):
    import json, codecs
    import datetime
    import locale
    
    d = datetime.datetime.today()
    print 'd == %s : %s\n' % (d, type(d))
    
    f = codecs.open(jsonFile, "w", "utf-8")
    json.dump(
        {
            "n_components": gmm.n_components, 
            "covariance_type": gmm.covariance_type, 
            "params": {
                "weight": gmm.weights_.tolist(), 
                "mean": gmm.means_.tolist(), 
                "covariance": model.covars_.tolist(),
            }
        }
        , f, indent = 2, sort_keys = False
    )
 

Test

In [25]:
if __name__ == "__main__":
    
    data = ReadData("../wav/p003.mcep", dim = 24, dtype = "<d8")
    print data.shape
    
    model = GMM(n_components = 16, 
                covariance_type = 'diag', 
                random_state = None, 
                thresh = 1e-2, 
                min_covar = 1e-3, 
                n_iter = 100, 
                n_init = 1, 
                params = 'wmc', 
                init_params = 'wmc')
    model.fit(data)
    
    Gmm2Json(model, "test.json")
    
    #joblib.dump(model, "model.gmm", compress = 0)
    imshow(diag(model.covars_[0]), cmap = 'spectral')
    show()
 
(3645, 24)
d == 2014-08-03 00:38:17.329000 : <type 'datetime.datetime'>


 
 
In []:
 

はじめまして

はじめまして. りのと言います.

音声信号処理や統計に興味があって,そのあたりで勉強したことを綴っていこうと思います.

まだまだ勉強を始めたばかりで,間違ったことを書くことも多いかもしれません. もし記事の内容に間違いがございましたら,ご指摘いただければ幸いです.