【Maya】pythonで指定されたフェースの頂点数を取得する

ポリゴンの情報を取得するpolyInfoってメソッドがありまして。
適当なフェースを選択してこいつを実行すると以下のような結果が得られます。

import maya.cmds as cmds
cmds.polyInfo(fv=1)
# 結果: [u'FACE      7:      8     12     13      9 \n'] # 

はい。

どれが何なのかよくわかりません!
とりあえずリファレンスを見てみます。
polyInfo command

なるほどわからん(困惑)

公式がまるで参考にならないので適当にぐぐってみたら以下のようなページが見つかりました。
MEL How-To #55

string $ftv[] = `polyInfo -faceToVertex m26_section.f[278]`;
// Result: FACE 278: 295 12 14 296 //
To extract the values in order to use them, use the tokenize command on the string. In the example below the string is split by stripping its space (" "), colon (":"), and carriage-return/newline ("\n\r") characters. This results in six tokens - the first of which is the string "FACE", the second being the index of the face, and the remaining four the indices for the vertices.

ざっくり言うと、一番上の例で言うところの「7」がフェースのインデックス番号で、その後に続くやつらが頂点のインデックス番号のようです。
つまり、この結果から4つの頂点で構成されたフェースであることが分かるわけです。
が、この結果から頂点数を得ようとすると、スペースとかでsplitしてその配列のサイズから2引くと頂点数になるみたいな気持ち悪いコードになりかねません。

他にやりようがないのか調べてみると、polyListComponentConversionとfilterExpandの組み合わせによって頂点の配列が得られることがわかりました。
polyListComponentConversion command
filterExpand command

というわけでコードと結果はこんな具合に。

import maya.cmds as cmds
len(cmds.filterExpand(cmds.polyListComponentConversion(ff=1,tv=1),sm=31))
# 結果: 4 #

polyListComponentConversionの引数は今回フェースを起点としているためfromFaceを示すffを、そして頂点の結果を得たいのでtoVertexを示すtvをtrueとしてます。
また、filterExpandの引数はポリゴン頂点を示す31を指定してます。
これによって頂点情報の配列が得られるので、あとはlenを使えば目的達成です。

mayaのリファレンスいまいちでpythonツール実装つらみがある。
みんなどうしてるんや…調べ方がアレなのか…。

【Unity】ProjectViewっぽいWindowをつくる

若干盛った感じのタイトルですけど、見た目的にそれっぽい感じのWindowをつくってみます。

f:id:tm8r:20160413202751p:plain
こんなかんじ。

基本的には割とありふれた記述で済むんですけど、Unityにもともと入ってるテクスチャ使ったり、それをいい感じにリサイズしたりする資料があんまり見当たらなかったので。

続きを読む

【Unity】uGUIのプレハブをインスタンス化する

昔ハマった内容をメモっておくシリーズ。

大した話じゃないんですけど、uGUIのオブジェクトをプレハブ化して、こいつをScriptでインスタンス化するとき、以下のようにしてハマりました。

var instance = Instantiate (buttonPrefab);
instance.transform.SetParent (gameObject.transform);
続きを読む

【Unity】テクスチャインポーターをつくる

インポーターはざっくり言うとアセットのインポート時にフックして、インポート設定や該当アセットに関する何らかの処理を行うことができるものです。
作成は簡単で、AssetPostprocessorを継承したクラスを作成し、処理を行いたい対象に適したメソッドを記述するだけです。
docs.unity3d.com

今回はテクスチャのインポートをフックしたいので、OnPreprocessTextureを実装します 。

続きを読む

【Unity】AnimatorControllerにScriptからStateMachineBehaviourをアタッチする

StateMachineBehaviourを継承したクラスをAnimatorControllerにアタッチすると、Animatorの状態遷移を受け取って処理を実行できるようになります。

詳細はこのあたりを。
qiita.com

GUI上でアタッチする場合はAnimatorウィンドウで任意のレイヤーにD&Dするだけですが、これをスクリプトでやる場合、以下のようになります。

using UnityEditor.Animations;
(略)
var controller = AnimatorController.CreateAnimatorControllerAtPath ("Assets/Resources/TestAnimatorController.controller");
controller.layers [0].stateMachine.AddStateMachineBehaviour<StateMachineExample> ();

StateMachineExampleがStateMachineBehaviourを継承したクラスです。
今回はlayersの0個目を指定しているので、特にいじってなければBase Layerを示します。
自身でレイヤーを追加して、そのレイヤーの状態遷移を受け取りたい場合はindexを変えてあげる感じ。

既存のAnimatorControllerに対して実行するのであれば3行目を以下のように変えてやればよいだけです。

var controller = AssetDatabase.LoadAssetAtPath<AnimatorController> ("Assets/Resources/TestAnimatorController.controller");

うむ。

サーバサイドエンジニアからジョブチェンジして最近Unityを触ってるんですが、このブログでは全然扱ってなかったのでぼちぼち書いていきたいところ。
気まぐれでQiitaにも投稿してたりします。
qiita.com

iOS9.3のSafariでiframeにリファラが送られない問題

タイトルの通りですけど、iOS9.3でiframeにリファラが送られないケースがあるみたいです。
どうやらクロスオリジンリクエストの際に起こるようですが、何度か試行してるとたまに送られるケースもあって謎。

全然報告が見当たらないのでみんな再現してないのかなー困るケースないのかなーと思ったりしてたんですけど、今日改めて調べてみたらバグ報告が上がってました。

Overview:
Safari seems to no longer send a Referer header when loading a page through an iframe in some situations. I'm still trying to isolate the exact cause, but it seems to happen reliably when an external reference, such as a javascript file or css file, is loaded in the document head. Also, the Accept header seems to switch to */* instead of text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

https://bugs.webkit.org/show_bug.cgi?id=155754

バージョンアップで早々に対応してくれるとよいですけど、まだBugzillaのStatusがNEWなのでどうなるやら…。

【2016/4/1追記】
FIXEDになってました
Bug 155754 – REGRESSION (r191180): Safari does not send Referer Header to iframe src in certain situations

構文エラーを起こすHTMLをjsoupで綺麗にする

はい。
半年以上ぶりです。

信頼できないユーザーの入力タグをどうすれば楽にきれいに出来るか考えてみたりしてました。
ある程度まともな動きをしてくれそうなものがあったのでメモを兼ねて。

以前にも書いたjsoupでやってみます。

jsoupでHTMLをパースする - するめとめがね

コードは以下のような感じ。

String str = "<div><a href=\"#1\">aaa<a href=\"#2\">bbb</div></div></div>";
Document doc = Jsoup.parseBodyFragment(str);
doc.outputSettings().prettyPrint(false);
System.out.println(doc.body().html());

prettyPrintってやつはデフォルトtrueなんですが、これがtrueだとhtmlメソッドを使ってStringにしたとき、インデントやら改行やら素敵な感じでやってくれちゃうんですが、今回全く求めてないので問答無用でfalseにします。

結果

<div>
 <a href="#1">aaa</a>
 <a href="#2">bbb</a>
</div>

※prettyPrintがfalseになってるので実際は整形されないんですが、わかりづらいのでtrueの状態を書いてます。

うむ。
割といい感じにきれいになったんじゃないでしょうか。

次に以下で試してみます。

<div><a href="#1">aaa<div><a href="#2">bbb</div>

結果

<div>
 <a href="#1">aaa</a>
 <div>
  <a href="#1"></a>
  <a href="#2">bbb</a>
 </div>
</div>

お、おう。
ちょっと、ちょっと変だな。

そんなかんじで意地悪しすぎるとちょっと想定外の挙動をしますが、ある程度の良識あるちょっと間違っちゃったてへぺろ程度のコードであれば割とよろしくやってくれそうです。べんりですね。

スポンサーリンク