2016年1月23日土曜日

UnityのTerrainで作った世界にNavMeshを設定してうろつく


まずは、Terrainを使って土地を作ってみます。
これが完成図。

GameObject3D ObjectからTerrainを設置します。

Inspectorの歯車のマークから色々と設定を変更できます。

とりあえず今回マップは狭くていいので、下のほうのResolutionからサイズを変更します。

サイズの設定が終わったら、早速土地の形状を作成していきます。

歯車マーク並びの左端から三つめまでが形状を変化させるツールです。
左から、引き上げor引き下げ、高さ指定で引き上げor引き下げ、起伏を均すという三つのツールです。

どーん。

これだけだと石膏みたいなので、それっぽいテクスチャとかを用意したいところですが極めて面倒です。

そこで、標準で用意されているAssetがあるのでそれを使います。

AssetsImport PackageからEnvironmentを追加します。
※古いバージョンのUnityではTerrain Assetだった模様。

少し時間がかかりますが、インポートが終わったら筆マークを選択し、Edit Texturesからテクスチャを選択して貼っていきます。

何種類かのテクスチャを貼っていくと、絵心ゼロでもとりあえずそれっぽくなります。

次に筆マークの右側の木のマークから、木を生やします。

最後にもう一つ右側の花のようなマークから、草を生やします。

せっかく島っぽくしたので、海も作ってみましょう。

先ほどインポートしたStandard Assetsフォルダの中のEnvironmentフォルダにWaterフォルダがいくつかあるので、その中のPrefabsフォルダから適当に追加します。

追加された板のようなものが水面になるので、サイズと位置を適当に調節します。

ここまでやると、意外とそれっぽくなります。


次に、せっかくなのでAssetストアからUnityちゃんをインポートして歩かせてみます。

経路探索のアルゴリズムとかを一から実装するのはダルすぎるので、NavMeshの設定をします。

まず、TerrainをStaticにします。(デフォルトでなってました)

Inspectorの横当たりにNavigationというタブがあるので開きます。
無ければメニューのWindowからNavigationを選択すると開きます。

Navigationタブを開くと一番下にBakeというボタンがあるので押します。

歩ける部分が青く表示されます。

次にUnityちゃんのほうに、Nav Mesh Agentを追加します。

NavMeshAgentSetDestination()に位置を渡すと移動できるので、左クリックした場所に移動するようにスクリプトを追加します。

UnityちゃんのデフォルトのAnimator Controllerでは、速度によって歩くアニメーションとアイドルが切り替わるようになっていたのですが、面倒なのでbool値のパラメータwalkを追加しました。

RaycastHit hit;
Ray ray;

NavMeshAgent agent;
Animator animator;

void Start () {
 agent = GetComponent<NavMeshAgent>();
 animator = GetComponent<Animator>();
}

void Update () {
 if (Input.GetMouseButton(0)) {
  ray = Camera.main.ScreenPointToRay (Input.mousePosition);
  if (Physics.Raycast (ray, out hit, 1000)) {
   agent.SetDestination (hit.point);
   animator.SetBool ("walk", true);
  }
 }
 if (Vector3.Distance(hit.point, transform.position) < 1.0f) {
  animator.SetBool ("walk", false);
 }
}

ちゃんと障害物を迂回して歩いてくれました。

Read More...

2016年1月10日日曜日

Blender v2.76でアニメーションを作成しUnityへインポートする



前回、Unityへインポート可能なオブジェクトとRigを作ったので、今回はアニメーションを作成してみます。

まず、Blenderで作業します。
Rigを選択したらViewをDope Sheet、ModeをAction Editorに切り替え、Newをクリックします。

適当に名前をつけたら、横にあるFをクリックします。

これで準備は出来たので、3D ViewのPose Modeで走るアニメーションを作っていきます。

関節の角度から作成していくFKモードは少しめんどくさそうですし、自然な動きにならなそうなので、手足などの末端の位置に腕などが追従してくれるIKモードを利用します。

まず足首あたりにくっついているfoot.ik.Lを選択し、Rig Main PropertiesのFK / IKのところを1.0にします。
反対の足も同じように設定します。

Current Frameを1にして1フレーム目から作成していきます。
右側の赤い丸はAutomatic keyframeのオンオフで、オンにすると動かしたものは自動的に記録してくれるのでオンします。


まずは右横からの視点で、両足と腹部にあるtorsoの位置を調節しながら何フレームか作っていきます。
接地する部分はつま先の角度をいい感じに調節します。

ポーズはCtrl+Cでコピーし、Ctrl+Shift+Vで反転して貼り付けることが出来ます。
歩く、走るといった左右の繰り返しのようなアニメーションを作成する場合、一連のサイクルの半分を作成したら、後は前半部分を反転して貼り付けていくと楽です。

そういうアドオンもあるみたいです。

一連の動きが出来たら、次に正面からの視点に切り替えて、膝、足の位置や角度を調節します。
膝の角度は膝の先に浮かんでいるボールの方向を向くようです。

手についても同じように、手首の上あたりにあるhand.ik.Lを選択し、Rig Main PropertiesのFK / IKのところを1.0にします。

反対の手も同じように設定し、足の動きに合わせてポーズを作成していきます。
肘の角度は膝と同じように後ろに浮いているボールで調節します。

出来上がったらfbxでエクスポートします。
Animationを選択してエクスポートすれば動きました。

Unity側にインポートする際は、モデルをインポートしたときと同じく、Unityのインポート設定の部分で、RigのDEFボーンを駆逐する作業が必要です。

Rigの設定が終わったら、Animationのタブから、アニメーション名、開始終了フレームの設定や、Loop有無の設定などを行います。

モデルに反映してみたところ、ぎこちないですが動きました。



Read More...

2016年1月4日月曜日

Blender v2.76で作成したモデルをMecanim用に設定してUnityへインポートする


Blenderのバージョン違いなどにより、出回っているマニュアルっぽいのが役に立たなかったりするので、ハマったところを中心にメモ的に。


まずは適当にモデルデータを作成します。


Rigifyアドオンを有効にした上で、Shift + AからArmatureHuman(Meta-Rig)を選択し、Armatureを追加します。

オブジェクトモードでオブジェクトの位置、サイズをRigに大まかに合わせます。

Locationが0, 0, 0になるように、オブジェクトの原点をShift + Ctrl + Alt + Cで中心に置いた3Dカーソルに合わせます。
Scaleが1, 1, 1になるようにCtrl + AでScaleをリセットします。

ボーンを選択してEditモードに入り、Amature OptionsからX-Axis Mirrorをオンにしたうえでチマチマと位置合わせします。

骨がすべてうまいこと肉に収まったら、Rigify ButtonsGenerateからRigを生成します。


Objectモードに戻ってObjectを選択したあとにRigを追加で選択し、Ctrl + PWith Automatic Weightsを選択します。
この時点でモデルが消えたり、頭だけ残して消えたりするようであれば、User PreferencesFileタブにあるAuto Run Python Scriptsにチェックが入っていないと思われるので、チェックを入れた上で実行します。


これでモデルとRigが連動して変形するようになります。

WGTから始まるボーンが生成されますが、これは不要なようなのですべて削除します。

で、完成したと思ってfbxファイルにエクスポートしてUnityに取り込むと、かなりカオスな感じになります。

そのままだとUnityのMecanimで利用するには適切ではないボーンに紐づいているようで、Mecanim用に修正する必要があるようです。

公式っぽいところを見ると、「肩をDEF-shoulder.RDEF-shoulder.Lにスキニングして、親がORG-ribsであることを確認します。」と出てくるのですが、ORG-ribsなんてのは見つかりません。

どうやら、Blenderのバージョンが新しいとボーンの命名規則が変わっているようで、上記の手順は通用しないようです。

基本的にはDEFから始まるボーンではなく、ORGから始まるボーンを利用するということのようです。
確かに見てみるとDEFから始まるボーンは関節が人間の倍ぐらいあります。ぐにゃぐにゃするわけですね。

で、いくつかやり方はありそうですが、この動画を参考にやってみたところうまくいったので残しておきます。

流れとしてはDEFボーンをすべてORGボーンの子にしてしまう感じです。


まず、Rigを選択して、一番右下と右から3番目のレイヤーを表示します。

EditモードでDEF-hipsを選択し、Shiftを押しながらもう一度選択するとORG-hipsが選択されます。
重なっているので両レイヤーが有効になっていると区別出来なそうです。

それぞれのボーンを選択したら、Ctrl+PKeep Offsetを選択します。
これで後から選択したボーンが親になります。

以下5組のボーンに対して同じ作業で親子関係を正します。

DEF-hips ORG-hips
DEF-spine ORG-spine
DEF-chest ORG-chest
DEF-neck ORG-neck
DEF-head ORG-head


腕、脚、指にもORGボーン一本につきDEFのボーンが二本あります。

DEFボーン二つを選択した後にORGボーンを選択し、同じくKeep Offsetで親子にします。
複数選択した場合は、すべてが最後に選択したボーンの子になるようです。

以下腕4組、脚4組、指10組と結構あります。

DEF-upper_arm.01.R DEF-upper_arm.02.R ORG-upper_arm.R
DEF-forearm.01.R DEF-forearm.02.R ORG-forearm.R

DEF-upper_arm.01.L DEF-upper_arm.02.L ORG-upper_arm.L
DEF-forearm.01.L DEF-forearm.02.L ORG-forearm.L

DEF-thigh.01.R DEF-thigh.02.R ORG-thigh.R
DEF-shin.01.R DEF-shin.02.R ORG-shin.R

DEF-thigh.01.L DEF-thigh.02.L ORG-thigh.L
DEF-shin.01.L DEF-shin.02.L ORG-shin.L

DEF-f_pinky.01.R.01 DEF-f_pinky.01.R.02 ORG-f_pinky.01.R
DEF-f_ring.01.R.01 DEF-f_ring.01.R.02 ORG-f_ring.01.R
DEF-f_middle.01.R.01 DEF-f_middle.01.R.02 ORG-f_middle.01.R
DEF-f_index.01.R.01 DEF-f_index.01.R.02 ORG-f_index.01.R
DEF-thumb.01.R.01 DEF-thumb.01.R.02 ORG-thumb.01.R

DEF-f_pinky.01.L.01 DEF-f_pinky.01.L.02 ORG-f_pinky.01.L
DEF-f_ring.01.L.01 DEF-f_ring.01.L.02 ORG-f_ring.01.L
DEF-f_middle.01.L.01 DEF-f_middle.01.L.02 ORG-f_middle.01.L
DEF-f_index.01.L.01 DEF-f_index.01.L.02 ORG-f_index.01.L
DEF-thumb.01.L.01 DEF-thumb.01.L.02 ORG-thumb.01.L


これでUnityのMecanim用のボーンの設定は完了です。
FBXでエクスポートして動作を確認してみます。

エクスポートする際は、オプションでSelected Objectsをチェックし、Forward-Z ForwardからZ Forwardに変更します。
BlenderとUnityで座標系が異なるので、ここで合わせておくそうです。

ArmatMeshをオンにしてエクスポートします。

吐き出したfbxファイルをUnityに読み込ませ、RigタブのAnimation TypeHumanoidに設定し、Configureをクリックします。

オールグリーンになりますが、あと一歩です。

BodyにあるToesの二箇所が、DEF-toe.LDEF-toe.RでDEFになっているのでORGに変更します。

HeadにあるHeadが、DEF-headになっているのでORG-headに変更します。

Left HandRight HandそれぞれにあるDistalが、すべてDEFになっているのでORGに変更します。
ちなみに、DistalのDEFになっているボーンはすべて02になって重複していたので、03を選択します。

これでDEFの駆逐が完全に完了し、設定終了です。

最後にMecanim Locomotion Starter Kitを使って動かしてみます。

元のモデルがアレなんで微妙ですが、多関節のクリーチャーみたいなのからは脱却出来ました。



Read More...

2015年12月31日木曜日

Swapbotを利用してSpells of Genesisのレアカードを販売してみる


Spells of Genesisのカードを結構集めたのですが、このリスキーかつ流動性の低い資産が、ポートフォリオの結構な比率を占めていることに気づき、若干危機感を感じてきました。

まぁBTCが上げてきてるので、結果的に関連サービスへの投資がBTCのショートポジションに見えてきてしまい、少しBTCに戻しておきたいという意味合いもあります。

CounterpartyのDEXでいくらか捌こうかとも思ったのですが、DEXでの出来高が少ないのと、直接BTCで販売出来ないという問題があり、Swapbotについて調べてみました。
(単にSoGが盛り上がってないだけという説もありますが。)

ということで、今回はSpells of Genesisのカード購入でよく利用するSwapbotで、レアカードの自動販売機を設置してみます。

SwapbotにアクセスしてSwapbot Administrationを選択します。

利用にはTokenlyアカウントが必要なので、Login or Sign Up Nowからログインページを開きます。

Registerから登録ページを開きます。
画面右上にもあります。

Name、Username、Email address、Passwordを入力します。
例にSatoshi Nakamotoが出てくるあたり、Bitcoin業界でのSatoshiのネームバリューの大きさを感じます。

Tokenlyアカウントの登録が完了すると、Swapbotがユーザー情報へのアクセスを求めてくるので許可します。

ダッシュボードが表示されるので、Create a new Swapbotを選択します。

Create a New Swapbotの画面が表示されるので、まずはLook and Feelの部分でBot Name、Bot URL Slug、Bot Descriptionを決めます。
URL SlugはURLの最後の文字列です。

Custom Background Imageなどは、今回はすっ飛ばします。

次にSwaps Selling Tokensの部分で販売方法や価格を決めます。
Swap TypeをSwaps By Rate、Swaps By Fixed Amounts、Swaps By USD Amount paid in BTC or Tokensの3つあります。

Swaps By Rateだと1.2トークン購入など半端な金額が設定出来てしまうので、今回はSwaps By Fixed Amountsを使います。

Swaps Purchasing Tokensは購入用、Advanced Swap Rulesは値引きなどの設定用なので今回は無視します。

なお、一か所で複数のトークンの販売をしようとした場合、受取りの通貨が同じものだと、おすすめしないとワーニングが出ます。

同一トークンの販売で複数通貨の受け入れか、複数トークン販売でそれぞれ受け入れ通貨が別ならOKなようです。

最後にIncome Forwardingの部分で、一定量たまると自動で送金するよう設定出来るので、一応設定しておきます。
GOX怖い。

Other SettingsはConfirmationsに関するものと、ブラックリスト、ホワイトリストに関するものなので、これも無視してSave Botで設定完了です。

Please send a monthly paymentと出てきました。
monthly paymentってなんすか?

なんとなく勝手に、売買が成立した時に手数料徴収するシステムかと思っていましたが、月額利用料を支払ってレンタルするイメージのようです。

でもいくら払えばいいのかどこにも書いてないんすけど。。

で、問い合わせてみたところ一つのbotを借りるのに約7ドル/月とのこと。

ついでに詳細なマニュアルのありかを教えてくれました。
https://docs.google.com/document/d/19jvcg5VPa9BoVo8Y2_2kbmX9QsBEOh6PgyZeeMuxe8k



まぁわざわざ教えてもらっといてアレですが、とりあえずPublic Bot Addressにアクセスするといつもの画面が表示されたので、アクティブにしないまま満足してそっと閉じましたとさ。


Read More...

2015年12月13日日曜日

カスタムROMとGoogleパスワード変更に潜む孔明の罠


Chromaに乗り換えたのでメモ。
ついでにXposedも入れてみた。

Chroma 12-10-2015
http://forum.xda-developers.com/nexus-6/development/rom-chroma-01-11-2015-t3000003

hellsCore b12-M
http://hc-kernel.blogspot.jp/2015/12/n6-b12-m.html

SuperSU 2.62
http://forum.xda-developers.com/showpost.php?p=64161125

Xposed
http://repo.xposed.info/module/de.robv.android.xposed.installer


という記事を書くはずだった。


が、何をやってもwi-fiが繋がらない。
wi-fiは一旦無視してログインしようとしたところ、なぜか認証時にブロックされる。

そして不正なログイン見つけたよ的なメールが届いて、強制的にパスワードを変更させられる。

諦めてROMをカタクリに変更してみたところ、wi-fiは接続成功。
そして相変わらずgoogleの認証が通らない。

Googleに問い合わせてみたところ、「君のアカウントは生きてるよ。良かったね。」みたいな自動返信が返ってくるだけ。

途方に暮れる。

ログイン失敗時に「この端末の所有者のアカウントを利用してログインしてください」と出るので、端末側かもしれないと思い完全に初期化。

さよならすべてのデータ達。
あっ。。バックアップを母艦に移してない。

。。。


「この端末の所有者のアカウントを利用してログインしてください」
「この端末の所有者のアカウントを利用してログインしてください」
「この端末の所有者のアカウントを利用してログインしてください」

あああああああああああああああああああああああああああああああ!!!!!!!!!!!(ブリブリブリブリュリュリュリュリュリュ!!!!!!ブツチチブブブチチチチブリリイリブブブブゥゥゥゥッッッ!!!!!!! )


で、色々調べたところパスワード変更後72時間は端末にログイン出来ない仕様とのこと。

これ何?常識?常識なの?

カスROMインストール⇒ログイン⇒ブロック⇒パスワード強制変更⇒72時間ブロック
いや、なんとも巧妙な罠ですわ。

とりあえず古いバックアップから復元したところ起動は出来た。
が、やはりモバイルからはGoogle系サービスが使えない。

ということで3日間のGoogle断ち生活(モバイルのみ)が始まる。



一応まともに動いたほう(はず)のカタクリの構成もメモしとく。



俺、この3日間の喪が明けたら、カタクリ入れるんだ。。

Read More...

2015年10月16日金曜日

EtereumのGUI Walletを起動してみた



EthereumのGUI WalletをWindowsで起動してみたのでメモ。


以下ページの最下部にダウンロードリンクがあります。

https://github.com/ethereum/mist/releases/tag/0.3.1-beta.1


Ethereum-Wallet-win64-0-3-1.zipをダウンロードして任意のフォルダに解凍。

Ethereum-Wallet.exeといういかにもな実行ファイルがあるので、これだ!と実行。

すると、1からブロックを同期し始めました。。


もともとコマンドラインでgethを使って同期済だったのですが、--datadirオプションでデータディレクトリの場所を変更していたせいか、自動でそっちは読んでくれませんでした。

設定ファイルなどオプションの指定方法を探したのですが見つからず。


先にコマンドラインからgethを起動した状態で再度walletを起動すると、既存のものを自動で検出してくれたものの、立ち上がった画面上では同期出来ていない状態。

色々試した結果、WALLET_FOLDER/resources/nodes/geth配下にあるgeth--datadirオプションを指定して起動し、そのうえでwalletを起動すると、同期済みのものを読みにいってくれました。


アカウントが検出されないときに何度か触ったせいでアカウントが無駄に複数作成されていましたが。。


また、その後もともとのgethを起動してみたり、再度walletに同梱されていたgethを起動してみたりしているうちに、なぜかまた1から再同期し始めました。

coinbaseはあっているので大丈夫なんだと思いますが、なんだか挙動がよく分かりません。


Betaだからなのか、自分がよくわかってないだけなのか。。。

取り合えず使えたのでよしとします。


残高ゼロですし。


Read More...

2015年8月18日火曜日

Counterpartyのトランザクションを解読してみる(Send)


今回もCounterpartyの勉強のために、Counterpartyのトランザクションを読んでみます。

題材は、前回と同じSpells of Genesis関連のトランザクションの中から選択した、トークンの送金を行うSendというトランザクションタイプです。

エンコード方法も前回と同じくmultisigを使ったものを選択しました。

https://www.blockscan.com/txInfo/11635040

  • データの準備
まずはvoutの一つ目のscriptPubKeyから以下を抜き出します。

OP_1
033f2f85f4c4c200d2a6ae3c300b4a1976e86eba833cdc6b96aa653426850723d9
0296a3f26419b9e6cbc794c67c874ec3d0dca008da66427fdbc9fbd45bf24b0249
02076aee3ebdd93955b70ee616de7867aa451a990ad53e0eaad0893626f231721d
OP_3
OP_CHECKMULTISIG

前回と同じくデコードしていきます。

前半2つのダミー公開鍵を、それぞれ前後1byteずつ削って結合させます。
3f2f85f4c4c200d2a6ae3c300b4a1976e86eba833cdc6b96aa65342685072396a3f26419b9e6cbc794c67c874ec3d0dca008da66427fdbc9fbd45bf24b02

これは暗号化されているので、複合化するためにvinの最初のtxidを探してきます。
810a4dd8e0756a715c6248a78c2d29a8c0985841243eb436318a234145847c29

見つけてきたtxidをパスワードとして、ARC4でデコードします。
1c434e5452505254590000000000000000039ff05d000000000bebc200000000000000000000000000000000000000000000000000000000000000000000

  • 不要なデータ?
はじめのbyteは無視します。
1c

  • CNTRPRTY
次の8byteは「CNTRPRTY」という文字列を16進コード文字列に変換したもので、Counterpartyのトランザクションには必ずある決まり文句です。
434e545250525459

  • トランザクションタイプ
次の4byteがトランザクションタイプです。
00000000

0はSENDを指します。

  • Asset_ID
次の8byteはAsset_IDです。
00000000039ff05d

10進数に直すと60813405で、前回と同じように変換します。

60813405 / 26 = 2338977 余り 3 D
2338977 / 26 = 89960 余り 17 R
89960 / 26 = 3460 余り 0 A
3460 / 26 = 133 余り 2 C
133 / 26 = 5 余り 3 D
5 / 26 = 0 余り 5 F

出来上がったDRACDFを反転したものがAsset名になります。

FDCARD

  • Quantity
次の8byteはQuantityです。
000000000bebc200

10進数に直すと200000000で単位がsatoshiなので、2FDCARDになります。


意外とシンプルな構造になっているようです。


Read More...