<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4481316956768607686</id><updated>2012-01-31T14:41:16.680+09:00</updated><category term='C#'/><category term='Python'/><category term='FBX'/><category term='ShortCut'/><category term='Rendering'/><category term='Reel'/><category term='Hair'/><category term='General'/><category term='Simulation'/><category term='Expression'/><category term='PyQt'/><category term='Envelope'/><category term='ICE'/><category term='Modeling'/><category term='Render Archive'/><category term='Jscript'/><category term='ICECompound'/><category term='Animation'/><category term='Shader'/><category term='Manegement'/><category term='Addon'/><category term='Deformation'/><title type='text'>A-s-C-e-n-S-i-o-N</title><subtitle type='html'>SOFTIMAGE|XSIの気になった機能の詮索、スクリプトの羅列、質問に答えりした記録&lt;br&gt;
とてもステキな映像を見つけた的なblog</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>51</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-1700137607463635617</id><published>2011-12-11T19:57:00.001+09:00</published><updated>2011-12-17T21:55:04.490+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Manegement'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>カスタムパラメータのパラメータソート</title><content type='html'>少し前Twitterで、話題になったカスタムパラメータのパラメータソートを作ってみました。&lt;br /&gt;&lt;br /&gt;実際には、Softimageでは、パラメータの順番を変えることは出来ないので、カスタムパラメータの全情報を取得し、マーキングした順番で新たにカスタムパラメータを作り直すというものです。&lt;br /&gt;&lt;br /&gt;SI2012+&lt;br /&gt;&lt;a href="https://docs.google.com/open?id=0B-n2poDt84-tNTBmYzRiNGUtMzA5Yi00NzcyLTkwZWQtOTdkODU4ZjYyZDQz"&gt;CustomParameterSort.pys&lt;/a&gt;&lt;br /&gt;（2011.12.17　パラメータにアニメーションが入っていてもエラーが出ないようになりました）&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-OOyQgi-7qdc/TuSQUBtq4WI/AAAAAAAAARQ/etN0W6c8YZA/s1600/CPS_explorer.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-OOyQgi-7qdc/TuSQUBtq4WI/AAAAAAAAARQ/etN0W6c8YZA/s200/CPS_explorer.jpg" width="163" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Scene Explorer&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;今現在、カスタムパラメータとヌルに、エクスプレッションやプロクシパラメータが設定してあります。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9qh40htBHhI/TuSRNUzqjTI/AAAAAAAAARY/125fkEbfcNM/s1600/CPS_expression.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="71" src="http://3.bp.blogspot.com/-9qh40htBHhI/TuSRNUzqjTI/AAAAAAAAARY/125fkEbfcNM/s200/CPS_expression.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Expression &amp;amp; Proxy&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: -webkit-auto;"&gt;内容は、このように、お互いがお互いをエクスプレッションしている状態です。&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-VOh2rKm1m3k/TuSSd6NVsBI/AAAAAAAAARg/H-RYwHR8RNI/s1600/CPS_1.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="103" src="http://3.bp.blogspot.com/-VOh2rKm1m3k/TuSSd6NVsBI/AAAAAAAAARg/H-RYwHR8RNI/s200/CPS_1.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;パラメータをソートしたい順に選択&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: -webkit-auto;"&gt;このスクリプトを実行する前に、カスタムパラメータを選択し、並べ替えたい順に、パラメータをマーキングしていきます。&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;そして、スクリプトを実行します。&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-lyhdVB3w2Gc/TuSTHmFFPRI/AAAAAAAAARo/93seVgr5wLE/s1600/CPS_2.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="100" src="http://4.bp.blogspot.com/-lyhdVB3w2Gc/TuSTHmFFPRI/AAAAAAAAARo/93seVgr5wLE/s200/CPS_2.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;並べ終わった結果&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: -webkit-auto;"&gt;結果、順番が変わったカスタムパラメータが新しく作られます。&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;エクスプレッションとプロキシの情報をキープします。&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;ただ、ひとつ弱点は、このカスタムパラメータから、別のカスタムパラメータやキャラクターキーセットにプロキシしているものに関しては、情報が取得出来ず、消えてしまう問題があります・・・。&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;コレに関しては、シーンの全パラメータ情報を見て、取得してやらないと方法が無いように見えるので、今回は外してあります。&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;undoが出来るようにしてあるので、安心して使えるかと思います。&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;今回勉強出来たなーと思うのは、XML情報の取得です。&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;このパラメータへ、どのオブジェクトが見ているかの情報は、XMLで取得するしかなく、要素を取り出すのに少々苦労しました。&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;Pythonのモジュールを使っても良かったんですが、VBSやJScriptでも同じように出来るやり方で作ってます。&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;興味のある方は、中身を覗いてみてくださいね。&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;ではでは。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-1700137607463635617?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/1700137607463635617/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=1700137607463635617' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1700137607463635617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1700137607463635617'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/12/blog-post.html' title='カスタムパラメータのパラメータソート'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-OOyQgi-7qdc/TuSQUBtq4WI/AAAAAAAAARQ/etN0W6c8YZA/s72-c/CPS_explorer.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-6222326503724800249</id><published>2011-11-29T22:04:00.001+09:00</published><updated>2011-11-30T00:29:39.000+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ICE'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>ICE : 配列とセットの違いを理解する</title><content type='html'>ICEを構築していると、いろいろな壁にぶち当たります。&lt;br /&gt;そんな、そびえ立つ大きな壁のひとつとして、配列とセットという概念があります。&lt;br /&gt;&lt;br /&gt;配列とセットの違いは、ICEを攻略する上で、非常に重要な概念となるので、覚えておく必要があります。&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-OBaMDLDj_nQ/TtTZcDJ9RBI/AAAAAAAAAQA/eH3i63vHCGI/s1600/Array_Grid.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-OBaMDLDj_nQ/TtTZcDJ9RBI/AAAAAAAAAQA/eH3i63vHCGI/s200/Array_Grid.jpg" width="165" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;PointCloud Grid 3x3&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Get -&amp;gt; Primitive -&amp;gt; Point Cloud -&amp;gt; Grid&lt;br /&gt;から、3x3のPoint Cloud Gridを作成して、以下のICE Treeを繋ぎます。&lt;br /&gt;&lt;br /&gt;上の&lt;b style="background-color: lime;"&gt;黄緑&lt;/b&gt;の流れは、2012から搭載された、&lt;b&gt;Build Array from Set&lt;/b&gt;ノードを使用しています。&lt;br /&gt;内部的には、&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;セットから配列&lt;/b&gt;&lt;/span&gt;へ変換するノードです。&lt;br /&gt;結果、&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;配列&lt;/span&gt;&lt;/b&gt;で表示されています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;対して、下の&lt;b style="background-color: yellow;"&gt;黄色&lt;/b&gt;の流れは、普通に&lt;b&gt;PointPosition&lt;/b&gt;を表示しています。&lt;br /&gt;こちらは、&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;セット&lt;/span&gt;&lt;/b&gt;です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;それぞれをカスタムICEアトリビュートのself.a、self.bと、二つにデータを格納しています。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-SN-hzpbRu3E/TtTbDPBUEtI/AAAAAAAAAQI/GkiEjUO8ZAU/s1600/Array_ShowValue.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-SN-hzpbRu3E/TtTbDPBUEtI/AAAAAAAAAQI/GkiEjUO8ZAU/s200/Array_ShowValue.jpg" width="176" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Show Valuesのポイント&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;データを確認したいときは、ノードの線を右クリックして、Show Valuesでのプロパティの設定を開いてOKボタンで確認します。&lt;br /&gt;ですが、今回のポイントは、このプロパティの一番下の文章です。&lt;br /&gt;&lt;br /&gt;Labelに#を入れると、IDで置換します。&lt;br /&gt;&lt;br /&gt;となっていますので&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;#:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;とLabelに入力したものが、上の図です。&lt;br /&gt;&lt;b style="background-color: lime;"&gt;黄緑&lt;/b&gt;の&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;配列&lt;/b&gt;&lt;/span&gt;の値は、こんな感じで表示。&lt;br /&gt;[ ] の中の数字が増えていっています。&lt;br /&gt;&lt;br /&gt;0[0]:-4, 0, -4&lt;br /&gt;0[1]:-4, 0, 0&lt;br /&gt;0[2]:-4, 0, 4&lt;br /&gt;&amp;nbsp; &amp;nbsp; .&lt;br /&gt;&amp;nbsp; &amp;nbsp; .&lt;br /&gt;&amp;nbsp; &amp;nbsp; .&lt;br /&gt;&lt;br /&gt;一方&lt;b style="background-color: yellow;"&gt;黄色&lt;/b&gt;の&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;セット&lt;/b&gt;&lt;/span&gt;の表示は、&lt;br /&gt;&lt;br /&gt;0: -4, 0, -4&lt;br /&gt;&lt;br /&gt;1:-4, 0, 0&lt;br /&gt;2:-4, 0, 4&lt;br /&gt;&amp;nbsp; &amp;nbsp; .&lt;br /&gt;&amp;nbsp; &amp;nbsp; .&lt;br /&gt;&amp;nbsp; &amp;nbsp; .&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;と、[ ]が無い状態ですが、一番左の数字が増えていっています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;この違いは、一体なんなのか。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これを理解するには、&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;ID&lt;/span&gt;&lt;/b&gt;という存在がキーポイントとなります。IDというのは、オブジェクトのポイントなどの頂点番号の事です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3ｘ3のPoint Cloud Gridは、9個のポイントから成り立っています。その頂点番号は&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;0, 1, 2, 3, 4, 5, 6, 7, 8&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-c4Jm5PvXSqs/TtTgYGVk0fI/AAAAAAAAAQY/LdPTHJepezs/s1600/Array_PointID.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="148" src="http://3.bp.blogspot.com/-c4Jm5PvXSqs/TtTgYGVk0fI/AAAAAAAAAQY/LdPTHJepezs/s200/Array_PointID.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;右上のポイントを選択&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;といったように、0から始まる番号がポイントひとつひとつに割り振られています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;試しに右上のポイントをタグ選択して、Selectを見てみます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6番が選択されています。丁度、&lt;b style="background-color: yellow;"&gt;黄色&lt;/b&gt;の&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;セット&lt;/b&gt;&lt;/span&gt;の表示では&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;6：4, 0, -4&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;となっており、6つ目の要素であること確認出来ます。&lt;/div&gt;&lt;div&gt;ポジションの値からも確認することが出来ますね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;つまり、&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;セット&lt;/b&gt;&lt;/span&gt;とは、&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;IDというオブジェクトの頂点番号とセットのデータ&lt;/b&gt;&lt;/span&gt;ということになります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;一方、配列のほうは、IDが0の場所に、9個のデータが一気に格納されています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ここが決定的に違うところなのです。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;詳しく見ていきましょう。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-61bpaMWdzEw/TtTpkFHQdZI/AAAAAAAAAQg/SBuAd2SBOeg/s1600/Array_Connect.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="117" src="http://4.bp.blogspot.com/-61bpaMWdzEw/TtTpkFHQdZI/AAAAAAAAAQg/SBuAd2SBOeg/s200/Array_Connect.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;PointPositionへ接続&lt;br /&gt;配列は挿せず、セットは挿せる&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;上のツリーから、Set Dataに Self.PointPositionを追加し、そこへ、&lt;b style="background-color: lime;"&gt;配列のa&lt;/b&gt;というデータと、&lt;b style="background-color: yellow;"&gt;セットのb&lt;/b&gt;というデータが挿せるかどうか、試してみます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;IDを持たない&lt;span class="Apple-style-span" style="background-color: lime;"&gt;&lt;b&gt;配列a&lt;/b&gt;&lt;/span&gt;の場合、PointPositionへ接続しようとしても、拒否されてしまいます。&lt;/div&gt;&lt;div&gt;PointPositionは、IDを必要とするICEアトリビュートのようです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;変わって、&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;&lt;b&gt;セットb&lt;/b&gt;&lt;/span&gt;の場合は、ID情報があるので、素直に接続することが出来ます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PBQt_VwZFCA/TtTsW-Pb4fI/AAAAAAAAAQo/WVHSttEjlgo/s1600/Array_SelectInArrayConnect.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="116" src="http://2.bp.blogspot.com/-PBQt_VwZFCA/TtTsW-Pb4fI/AAAAAAAAAQo/WVHSttEjlgo/s200/Array_SelectInArrayConnect.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;配列にIDを割り振りPointPositionへ接続&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;配列aのようなデータをPointPositionへ接続するには、IDを割り振るという作業が必要です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Get Point ID&lt;/b&gt; と &lt;b&gt;Select in Array&lt;/b&gt; ノードをこのように繋げば、PointPositionへ挿すことが出来ます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このコンボは、非常に良く使うので、覚えておいて損は無いでしょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;さらに、詳しく見ていきましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-bQaGLI-jk3o/TtTybm8BpfI/AAAAAAAAAQw/1w7XiCB7_9w/s1600/Array_Objects.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="113" src="http://1.bp.blogspot.com/-bQaGLI-jk3o/TtTybm8BpfI/AAAAAAAAAQw/1w7XiCB7_9w/s200/Array_Objects.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;違う大きさのCubeA、B&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;良くある問題で、このオブジェクトと同じ形状にしたいのになんで接続出来ないんだろう・・・？&lt;/div&gt;&lt;div&gt;ということが、たびたびあるかと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;違うオブジェクトからデータを持ってきたときに、接続出来ないことが良くあります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これも実は、IDの問題なのです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-KVQ8dnDe-Us/TtT08cfpNsI/AAAAAAAAAQ4/xdN16hNblns/s1600/Array_Disconnect.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="89" src="http://4.bp.blogspot.com/-KVQ8dnDe-Us/TtT08cfpNsI/AAAAAAAAAQ4/xdN16hNblns/s200/Array_Disconnect.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;別のPointPositionのデータが繋がらない&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;Bの形状を、Aと同じにしたい。と考えた場合、BにICE Treeを作り、誰でも最初はこういう風に挿そうと思うものです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今まで説明してきたセットのあり方を考えると接続出来るのでは？と不思議に思うのですが、実は、IDというものは、オブジェクトごとに固有に持っているもののようです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;この状態ですと、AのIDを持ったPointPositionのデータを、BのIDのPointPositionへ無理やり持ってきているようなものです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ですので、考え方として、AのPointPositionを、一度IDを持たない配列データにし、BのIDを割り振り直し、BのPointPositionへ挿すという風にします。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ZZa45Zbme6k/TtT3vtVfGeI/AAAAAAAAARA/AmH3PFS4p7M/s1600/Array_AnotherObjectPointPosition.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="60" src="http://2.bp.blogspot.com/-ZZa45Zbme6k/TtT3vtVfGeI/AAAAAAAAARA/AmH3PFS4p7M/s200/Array_AnotherObjectPointPosition.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Aのセットを配列にし、BのIDを割り振る&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;b&gt;Build Array from Set&lt;/b&gt; で、配列データへ変換した後、&lt;b&gt;Get Point ID&lt;/b&gt;&amp;nbsp;と&amp;nbsp;&lt;b&gt;Select in Array&lt;/b&gt;&amp;nbsp;ノードで、BオブジェクトのIDを割り振るといったことをすれば、挿せるようになります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このように、配列とセットを理解するだけで、かなり出来ないことが出来るようになるはずです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;実を言う僕も、触り始めて半年くらい良く分かりませんでした・・・。&lt;/div&gt;&lt;div&gt;他人が繋いでいるのをなんとなく見ていて、「ああ、なるほど！こういう風にやればさせるのか！」と思っていたのですが、なんで？というのが、拭いきれませんでした。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;完全に理解できたのは、Show Valuesで、Labelに#を入れて見た瞬間でした。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;なるほどなぁ。こう違うんだ。&lt;/div&gt;&lt;div&gt;とね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;読んでくれてありがとう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-6222326503724800249?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/6222326503724800249/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=6222326503724800249' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/6222326503724800249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/6222326503724800249'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/11/ice.html' title='ICE : 配列とセットの違いを理解する'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-OBaMDLDj_nQ/TtTZcDJ9RBI/AAAAAAAAAQA/eH3i63vHCGI/s72-c/Array_Grid.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-8898532092301146089</id><published>2011-11-22T15:54:00.001+09:00</published><updated>2011-11-22T16:10:05.481+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shader'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python : シェーダがマテリアルに繋がっているか調べる</title><content type='html'>シェーダがマテリアルと繋がっているのかいないのかを調べる関数です。&lt;br /&gt;&lt;br /&gt;7.5辺りから、Render Tree上でリフレッシュしても繋がっていないものが残るようになりました。&lt;br /&gt;Material.GetAllShadersを使用すると、繋がっていない、ごみシェーダを取得してしまいます。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;なので、本当に使われているのか？という判定に使えます。&lt;br /&gt;GetShaderParameterTargetsを使います。&lt;br /&gt;このメソッドは、シェーダのアウトプットに繋がっているパラメータコレクションを返してくれる便利なものです。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[from siutils import sisel # Selectionfrom siutils import log  # LogMessage# シェーダがマテリアルに繋がっているかを調べるdef IsConnect(oShd): # シェーダのアウトプットのパラメータコレクションを取得 oShdTgt = oShd.GetShaderParameterTargets("") # パラメータコレクションの数が0（すなわち繋がっていない）の場合は、False if not oShdTgt.Count: return False for oTgt in oShdTgt:  # パラメータの親、つまりシェーダかマテリアルかを調べる  if oTgt.Parent.Type == "material":   # マテリアルなら、繋がっている   return True  else:   # マテリアルじゃないなら、再度そのシェーダのアウトプットを再帰的に調べる   return False or IsConnect(oTgt.Parent)]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-8898532092301146089?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/8898532092301146089/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=8898532092301146089' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8898532092301146089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8898532092301146089'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/11/python.html' title='Python : シェーダがマテリアルに繋がっているか調べる'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-4369211851946790055</id><published>2011-11-18T19:30:00.001+09:00</published><updated>2011-11-18T20:26:28.467+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ICECompound'/><category scheme='http://www.blogger.com/atom/ns#' term='ICE'/><title type='text'>Chain Generator</title><content type='html'>Twitterにて、&lt;a href="http://twitter.com/#!/saved-search/%23ICE%E3%83%89%E3%83%AA%E3%83%AB"&gt;#ICEドリル&lt;/a&gt;が始まりました。&lt;br /&gt;ICEの質問の投稿があって、それをみんなで答えていたので、これはハッシュタグつけて、みんなでやったら面白いんじゃないかと思い、始めてみたのがきっかけです。&lt;br /&gt;&lt;br /&gt;このICEドリルの参加に制限はひとつだけです。&lt;br /&gt;&lt;br /&gt;行き詰ったり、こういうのどう繋げばいいのかふと思ったり、自分はこういう風に繋いでいるけどほかの人はどう繋ぐんだろう？とか、いろいろな動機があると思いますが、その質問に、#ICEドリルとハッシュタグを付けるだけで、参加出来るものです。&lt;br /&gt;&lt;br /&gt;ただ、誰か質問しているのにも関わらず、さらにその上から質問を投げるのは、禁止します。&lt;br /&gt;&lt;br /&gt;と前置きはいいとしまして、そのICEドリルから、Chain Generatorが産まれました。&lt;br /&gt;&lt;br /&gt;今回は、そのプラグインの紹介です。&lt;br /&gt;&lt;br /&gt;ICEで、鎖を簡単に作れます。&lt;br /&gt;動画はこちら。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/I6fbO10Tpdw/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/I6fbO10Tpdw&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/I6fbO10Tpdw&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;コンパウンドは、こちらです。&lt;br /&gt;&lt;a href="http://bit.ly/vJA7Wu"&gt;bit.ly/vJA7Wu&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;コンパウンドをICE Treeにドラッグアンドドロップで使用可能になります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hCISTaIYAls/TsY4Db7JVkI/AAAAAAAAAPo/a3-KkMWf5EE/s1600/ICE_ChainGenerator_Property.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-hCISTaIYAls/TsY4Db7JVkI/AAAAAAAAAPo/a3-KkMWf5EE/s400/ICE_ChainGenerator_Property.jpg" width="160" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Chain Generatorプロパティ&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;動画は、1.0のバージョンのものですが、現在は、1.1になっています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;では、機能の紹介です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Curve Name&lt;/b&gt;&lt;/div&gt;&lt;div&gt;一番上は、curveオブジェクトを入力します。&lt;/div&gt;&lt;div&gt;そこに、Pointが発生します。&lt;/div&gt;&lt;div&gt;Get Dataノードで、カーブオブジェクトの名前を挿すことも出来ます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Distance&lt;/b&gt;&lt;/div&gt;&lt;div&gt;この値は、PointとPointの距離です。&lt;/div&gt;&lt;div&gt;大きければ、離れるし、小さいと密着した鎖が作れます。&lt;/div&gt;&lt;div&gt;大体鎖オブジェクトの大きさを入れればOK。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Accuracy&lt;/b&gt;&lt;/div&gt;&lt;div&gt;これは、精度です。&lt;/div&gt;&lt;div&gt;ICEノードには、カーブ上の位置を等間隔にするものが無いので、仮想ポイントを内部で作成しています。&lt;/div&gt;&lt;div&gt;その仮想ポイントをみて、等間隔の距離を抽出するので、小さい値だとカーブ上から離れる場合があります。&lt;/div&gt;&lt;div&gt;大きければ良いですが、その分処理が重くなるので、丁度いい値を探さなくてはなりません。&lt;/div&gt;&lt;div&gt;おかしい挙動をしたら、大きくしてみましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Shape -&amp;nbsp;Shape&lt;/b&gt;&lt;/div&gt;&lt;div&gt;シェイプを指定します。&lt;/div&gt;&lt;div&gt;Instans Shapeを挿してお好みのオブジェクトを割り当てられます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Shape - Align Axis&lt;/b&gt;&lt;/div&gt;&lt;div&gt;カーブに沿って整列させるシェイプの向きです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Shape - Is Chain&lt;/b&gt;&lt;/div&gt;&lt;div&gt;オンにすると、交互に90度回転します。&lt;/div&gt;&lt;div&gt;鎖だとオンです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Up Vector - Up Vector&lt;/b&gt;&lt;/div&gt;&lt;div&gt;アップベクター機能のオンオフです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Up Vector - Up Vector Axis&lt;/b&gt;&lt;/div&gt;&lt;div&gt;アップベクターの向きを3軸から選びます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Roll - Roll Angle&lt;/b&gt;&lt;/div&gt;&lt;div&gt;ロールの角度を入力します。&lt;/div&gt;&lt;div&gt;カーブに沿ってぐるぐる回ります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Twist - Twist Angle&lt;/b&gt;&lt;/div&gt;&lt;div&gt;ねじれです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Twist - Profile&lt;/b&gt;&lt;/div&gt;&lt;div&gt;ねじれ具合をFcurveでコントロールします。&lt;/div&gt;&lt;div&gt;横軸は、カーブの始点、終点です。&lt;/div&gt;&lt;div&gt;縦軸は、回転の度合いです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;こういうのは、本当にICEに向いてるなと思いますが、作るのは本当に大変でした。&lt;/div&gt;&lt;div&gt;今、中身を見るのが正直嫌ですｗ&lt;/div&gt;&lt;div&gt;ホントは、中身の解説をしようかなーと思ったんですけど、余りに膨大すぎるので、やめました・・・。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;えへ。すいません( ´థ,_‥థ｀)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;さて、次は何を作ろうかなー。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UCim9wU_Qac/TsZAmPB1YcI/AAAAAAAAAPw/VSMfOIbq7ZM/s1600/ICE_ChainXSIMan.jpg" imageanchor="1"&gt;&lt;img border="0" height="640" src="http://4.bp.blogspot.com/-UCim9wU_Qac/TsZAmPB1YcI/AAAAAAAAAPw/VSMfOIbq7ZM/s640/ICE_ChainXSIMan.jpg" width="563" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-4369211851946790055?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/4369211851946790055/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=4369211851946790055' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/4369211851946790055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/4369211851946790055'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/11/chain-generator.html' title='Chain Generator'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-hCISTaIYAls/TsY4Db7JVkI/AAAAAAAAAPo/a3-KkMWf5EE/s72-c/ICE_ChainGenerator_Property.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-8744497833284730540</id><published>2011-10-27T17:39:00.000+09:00</published><updated>2011-10-27T17:40:06.041+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PyQt'/><category scheme='http://www.blogger.com/atom/ns#' term='Manegement'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>PyQt : 常に手前に、always on top</title><content type='html'>PyQtウィンドウを、DCCソフトなどで開いて、操作している最中に、DCCソフトをフォーカスしてしまうと、背面に隠れてしまいます。&lt;br /&gt;&lt;br /&gt;その場合、ウィンドウを「常に手前に」モードで起動して解消させます。&lt;br /&gt;サンプルは、こちら。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[import sysfrom PyQt4 import QtGui, QtCoreclass MainWindow(QtGui.QMainWindow):    def __init__(self):        super(MainWindow, self).__init__()        QtGui.QMainWindow.__init__(self, None, QtCore.Qt.WindowStaysOnTopHint)app = QtGui.QApplication(sys.argv)w = MainWindow()w.show()app.exec_()]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;WindowStaysOnTopHintのマニュアルにたどりつけませんでした・・・。&lt;br /&gt;隠れすぎです。&lt;br /&gt;Qt Designerにもそれらしきものは見当たらず。&lt;br /&gt;&lt;br /&gt;次に、モードをトグルする場合、モードが変わったらウィンドウを再表示させないといけないみたいです。&lt;br /&gt;トグルをチェックボックスで切り替えるサンプルはこちら。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[import sysfrom PyQt4 import QtGui, QtCoreclass checkBoxWindow(QtGui.QMainWindow):    def __init__(self):        super(checkBoxWindow, self).__init__()        self.setupUi()            def setupUi(self):        self.flags = QtCore.Qt.WindowFlags()        checkBox = QtGui.QCheckBox(u"常に手前に",self)        checkBox.move(20, 20)        checkBox.toggle()        checkBox.stateChanged.connect(self.alwaysOnTopState)        self.setWindowFlags(QtCore.Qt.WindowFlags() | QtCore.Qt.WindowStaysOnTopHint)        self.setGeometry(300, 300, 250, 150)            def alwaysOnTopState(self, state):        flags = QtCore.Qt.WindowFlags()        if state == QtCore.Qt.Checked:            self.setWindowTitle(u'オン')            flags |= QtCore.Qt.WindowStaysOnTopHint        else:            self.setWindowTitle(u'オフ')        self.setWindowFlags(flags)        self.show()app = QtGui.QApplication(sys.argv)w = checkBoxWindow()w.show()app.exec_()]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;alwaysOnTopStateメソッドの最後に、show()を実行して、再表示させてます。&lt;br /&gt;&lt;br /&gt;Softimageで実行する場合、PyQtForSoftimageというプラグインを作成されている方が居ますので、そちらを使えば、Softimageにインタフェース内でQtウィンドウを使用出来ます。&lt;br /&gt;これで、裏に隠れません。&lt;br /&gt;&lt;br /&gt;プラグインダウンロード&lt;br /&gt;&lt;a href="https://github.com/caron/PyQtForSoftimage"&gt;https://github.com/caron/PyQtForSoftimage&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Softimage Mailng List Archive - PyQt for Softimage Thread&lt;br /&gt;&lt;a href="http://groups.google.com/group/xsi_list/browse_frm/thread/862d4f8fb4325010"&gt;http://groups.google.com/group/xsi_list/browse_frm/thread/862d4f8fb4325010&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2012で試したんですが、アドオンをインストールした時点で、エラーで止まってしまうので、ちょっと書き換えました。&lt;br /&gt;コードの半分チョイ下辺りです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;qtevents.py&lt;/b&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[in_reg.RegisterEvent( "QtEvents_RenderAbort", 542179381) #C.siOnRenderAbortin_reg.RegisterEvent( "QtEvents_ConnectShader", 542179374) #C.siOnConnectShaderin_reg.RegisterEvent( "QtEvents_DisconnectShader", 542179375) #C.siOnDisconnectShaderin_reg.RegisterEvent( "QtEvents_CreateShader", 542179378) #C.siOnCreateShader]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;イベント系の定数が認識しないみたいです。&lt;br /&gt;とはいえ、この辺りは、余程の事が無いと使わないので、全てコメントアウトしても問題無いかな？&lt;br /&gt;&lt;br /&gt;使うには、基本の構文ではダメで、一緒にインストールされた、pyqt_example.pyを見れば、使い方が分かります。&lt;br /&gt;&lt;br /&gt;Steven Caronさん凄い！&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-8744497833284730540?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/8744497833284730540/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=8744497833284730540' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8744497833284730540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8744497833284730540'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/10/pyqt-always-on-top.html' title='PyQt : 常に手前に、always on top'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-4596706623997209568</id><published>2011-10-22T23:43:00.002+09:00</published><updated>2011-10-22T23:44:00.441+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PyQt'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>PyQtでラーメンタイマー</title><content type='html'>&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-AX5WALT8i3A/TqKOBCgHSZI/AAAAAAAAAOU/e2vzXrhV6LU/s1600/qtramen.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="173" src="http://1.bp.blogspot.com/-AX5WALT8i3A/TqKOBCgHSZI/AAAAAAAAAOU/e2vzXrhV6LU/s200/qtramen.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;ラーメンタイマー&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;PyQtでラーメンタイマーを作ってみました。&lt;br /&gt;&lt;br /&gt;ラーメンタイマーとは、お湯を入れてラーメンが出来るまでの3分を計るものです。&lt;br /&gt;動画がジャスト3分の物もそう言いますが、今回はきっちり3分計るものです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;参考にさせていただいたのは、こちらです。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.slideshare.net/RansuiIso/pyqtgui"&gt;PyQtではじめるGUIプログラミング&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;というか、ほぼおんぶに抱っこ。人の褌で相撲を取るってやつです。感謝いたします。どうもありがとう！&lt;br /&gt;&lt;br /&gt;このままやるだけだとちょっとつまらないので、PyQtにせっかく入っている初級者用と見せかけて実は上級者用らしい&lt;b&gt;Qt Designer&lt;/b&gt;を使ってやってみたいと思います(◉◞౪◟◉｀)ﾆｺｯ&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9gAPQ06wO-I/TqFteQXzC3I/AAAAAAAAANc/fmRUWCpXHak/s1600/qtdesiner.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="142" src="http://3.bp.blogspot.com/-9gAPQ06wO-I/TqFteQXzC3I/AAAAAAAAANc/fmRUWCpXHak/s200/qtdesiner.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Qt Desinerを起動&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;インストールされた、&lt;b&gt;PyQt&lt;/b&gt;から、&lt;b&gt;Designer&lt;/b&gt;を選びます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Gnw5WTOAWV0/TqFucdkAc6I/AAAAAAAAANk/uSicQAP0rpU/s1600/qtinit.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="180" src="http://1.bp.blogspot.com/-Gnw5WTOAWV0/TqFucdkAc6I/AAAAAAAAANk/uSicQAP0rpU/s200/qtinit.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;フォーム選択ダイアログ&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;立ち上がったら、フォーム選択ダイアログが出るので、&lt;b&gt;templates\forms&lt;/b&gt; の、&lt;b&gt;Main Window&lt;/b&gt; を選択して、作成ボタンを押します。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-4Hlkjlu0Dt4/TqFvWqtKdWI/AAAAAAAAANs/AWNvSn16HHc/s1600/qtdelete.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="156" src="http://1.bp.blogspot.com/-4Hlkjlu0Dt4/TqFvWqtKdWI/AAAAAAAAANs/AWNvSn16HHc/s200/qtdelete.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;メニューバーとステータスバーを削除&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;今回は使用しないので、メニューバーとステータスバーを削除しておきます。&lt;br /&gt;右クリックで、コンテキストメニューが出ますので、それぞれを削除です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UYFi2NrPOH4/TqFysiTeD1I/AAAAAAAAAN0/ptLEUNdl4t4/s1600/qtdropui.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="136" src="http://4.bp.blogspot.com/-UYFi2NrPOH4/TqFysiTeD1I/AAAAAAAAAN0/ptLEUNdl4t4/s200/qtdropui.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;UIの配置&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;次に、UI部分の配置をします。&lt;br /&gt;&lt;br /&gt;一番上に、&lt;b&gt;LCD Number&lt;/b&gt;を配置。&lt;br /&gt;&lt;br /&gt;二番目に、&lt;b&gt;Grid Layout&lt;/b&gt;を配置してから&lt;br /&gt;&lt;br /&gt;三番目に、&lt;b&gt;Push Button&lt;/b&gt;を、&lt;b&gt;Grid Layout&lt;/b&gt;の中に4つ放り込みます。&lt;br /&gt;放り込み方が難しいかもしれませんが、1つボタンを放り込んだあと、さらに新しいボタンをLayoutの右端に置くと、&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;青い縦ラインが出る&lt;/span&gt;&lt;/b&gt;ので、そのままドロップすると、横並びになります。&lt;br /&gt;下のほうに入れ込むと、&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;下部分に青い横ライン&lt;/span&gt;&lt;/b&gt;が出るので、その場所にドロップです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-b3UmO-nm4-o/TqF0fbtlgOI/AAAAAAAAAN8/9nniC12omZs/s1600/qtvertical.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="140" src="http://1.bp.blogspot.com/-b3UmO-nm4-o/TqF0fbtlgOI/AAAAAAAAAN8/9nniC12omZs/s200/qtvertical.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;縦に整列&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;全て配置し終わったら、UIを綺麗に整頓します。&lt;br /&gt;&lt;br /&gt;MainWindowをクリックして、選択をMainWindowにします。&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;ボタンなどのUIが無いところで、何も選択されていない状態で右クリックして、コンテキストメニューを開きます。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;ちょっとここポイントです！&lt;br /&gt;&lt;br /&gt;右クリック　→　レイアウト　→　垂直に並べる&lt;br /&gt;&lt;br /&gt;を選択します。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--W-FXuaC2W4/TqF13l4dAbI/AAAAAAAAAOE/xkaEEM2dTvc/s1600/qtuicomplete.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="163" src="http://2.bp.blogspot.com/--W-FXuaC2W4/TqF13l4dAbI/AAAAAAAAAOE/xkaEEM2dTvc/s200/qtuicomplete.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;整列しました&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;うまくいけば、右図のような配置になります。&lt;br /&gt;&lt;br /&gt;失敗しても根性です。&lt;br /&gt;&lt;br /&gt;ウィンドウの右下端をドラッグしても、レイアウトがキープされているのが分かります。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-bY5H06BLQIg/TqF44d53lFI/AAAAAAAAAOM/bQ0p0zaCAos/s1600/qtrename.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="108" src="http://3.bp.blogspot.com/-bY5H06BLQIg/TqF44d53lFI/AAAAAAAAAOM/bQ0p0zaCAos/s200/qtrename.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;ボタン名とオブジェクト名を変更&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;ボタン名とオブジェクト名を変更します。&lt;br /&gt;右側のオブジェクトインスペクタにあるpushButtonを選ぶと、対応して選択されるので、見ながら変更していってください。&lt;br /&gt;オブジェクト名は、後々スクリプト編集するときに使うので、覚えておいてください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UBd9La3569k/TqKwd1wbs-I/AAAAAAAAAOk/vwqgZw--4Ew/s1600/qtsignal.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="108" src="http://4.bp.blogspot.com/-UBd9La3569k/TqKwd1wbs-I/AAAAAAAAAOk/vwqgZw--4Ew/s200/qtsignal.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;シグナル/スロットの設定&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;次は、ボタンの挙動を作るために、シグナル/スロットを設定します。&lt;br /&gt;右図の手順で、STARTボタンにシグナル/スロットの設定をします。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-jujNR2CLWhc/TqKxNvpYAfI/AAAAAAAAAOs/O9IEY7Ault8/s1600/qtsignal2.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="97" src="http://2.bp.blogspot.com/-jujNR2CLWhc/TqKxNvpYAfI/AAAAAAAAAOs/O9IEY7Ault8/s200/qtsignal2.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;シグナル/スロットの設定その2&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;右下にある、シグナル/スロットエディタで、項目を増やしボタンとスロットを設定します。&lt;br /&gt;ダブルクリックで、プルダウンが出るので、選んでください。&lt;br /&gt;全てのボタンに対して行ってください。&lt;br /&gt;&lt;br /&gt;ここまでくれば、UIは完成。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ramen_timer.ui&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;で保存します。&lt;br /&gt;&lt;br /&gt;ここまでは、簡単に誰でも作れますね(☉౪ ⊙)ﾌﾟｷﾞｬｰ!!!!&lt;br /&gt;&lt;br /&gt;後は、タイマーの設定、ボタンを押したときの挙動をスクリプト編集で、実装していきます。&lt;br /&gt;（Qt Designerって、スロットのコード編集って出来ないですよね？知ってる方いらっしゃいましたら教えてください。）&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-l_f6wNSf_Dc/TqKPkIzlaaI/AAAAAAAAAOc/tsdVtTf00Og/s1600/qtpyuic4.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="92" src="http://3.bp.blogspot.com/-l_f6wNSf_Dc/TqKPkIzlaaI/AAAAAAAAAOc/tsdVtTf00Og/s200/qtpyuic4.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Shift+右クリックからコマンドウィンドウを起動&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;Qｔ Designer&lt;/b&gt;から作られたファイルは、uiファイルです。&lt;br /&gt;&lt;div&gt;これをpyファイルに変換します。&lt;br /&gt;&lt;div&gt;先ほど作成したuiファイルのフォルダで、Shift+右クリックからコマンドウィンドウを起動します。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;コマンドプロンプトで、次のコマンドを実行して、uiからpyに変換します。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;pyuic4 -i 0 -x ramen_timer.ui -o ramen_timer.py&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;オプションの &lt;b&gt;-i&lt;/b&gt; は、インデントのスペースの数を表しています。0にするとインデントがタブになるので、これが嫌な方は、無くてもOKです。&lt;br /&gt;SoftimageのScript Editorは、インデントがタブになってしまうので、そっちで編集する方はつけたほうがいいでしょう。&lt;br /&gt;&lt;br /&gt;出来上がったコードは、こんな感じ。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'ramen_timer.ui'## Created: Sat Oct 22 22:17:40 2011#      by: PyQt4 UI code generator 4.8.5## WARNING! All changes made in this file will be lost!from PyQt4 import QtCore, QtGuitry: _fromUtf8 = QtCore.QString.fromUtf8except AttributeError: _fromUtf8 = lambda s: sclass Ui_MainWindow(object): def setupUi(self, MainWindow):  MainWindow.setObjectName(_fromUtf8("MainWindow"))  MainWindow.resize(464, 414)  MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))  self.centralwidget = QtGui.QWidget(MainWindow)  self.centralwidget.setObjectName(_fromUtf8("centralwidget"))  self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)  self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))  self.lcdNumber = QtGui.QLCDNumber(self.centralwidget)  self.lcdNumber.setAutoFillBackground(False)  self.lcdNumber.setFrameShape(QtGui.QFrame.Box)  self.lcdNumber.setFrameShadow(QtGui.QFrame.Sunken)  self.lcdNumber.setSmallDecimalPoint(True)  self.lcdNumber.setDigitCount(5)  self.lcdNumber.setMode(QtGui.QLCDNumber.Dec)  self.lcdNumber.setSegmentStyle(QtGui.QLCDNumber.Filled)  self.lcdNumber.setProperty("value", 0.0)  self.lcdNumber.setProperty("intValue", 0)  self.lcdNumber.setObjectName(_fromUtf8("lcdNumber"))  self.verticalLayout.addWidget(self.lcdNumber)  self.gridLayout = QtGui.QGridLayout()  self.gridLayout.setObjectName(_fromUtf8("gridLayout"))  self.startButton = QtGui.QPushButton(self.centralwidget)  self.startButton.setText(QtGui.QApplication.translate("MainWindow", "START", None, QtGui.QApplication.UnicodeUTF8))  self.startButton.setObjectName(_fromUtf8("startButton"))  self.gridLayout.addWidget(self.startButton, 0, 0, 1, 1)  self.stopButton = QtGui.QPushButton(self.centralwidget)  self.stopButton.setText(QtGui.QApplication.translate("MainWindow", "STOP", None, QtGui.QApplication.UnicodeUTF8))  self.stopButton.setObjectName(_fromUtf8("stopButton"))  self.gridLayout.addWidget(self.stopButton, 0, 1, 1, 1)  self.resetButton = QtGui.QPushButton(self.centralwidget)  self.resetButton.setText(QtGui.QApplication.translate("MainWindow", "RESET", None, QtGui.QApplication.UnicodeUTF8))  self.resetButton.setObjectName(_fromUtf8("resetButton"))  self.gridLayout.addWidget(self.resetButton, 1, 0, 1, 1)  self.quitButton = QtGui.QPushButton(self.centralwidget)  self.quitButton.setText(QtGui.QApplication.translate("MainWindow", "QUIT", None, QtGui.QApplication.UnicodeUTF8))  self.quitButton.setObjectName(_fromUtf8("quitButton"))  self.gridLayout.addWidget(self.quitButton, 1, 1, 1, 1)  self.verticalLayout.addLayout(self.gridLayout)  MainWindow.setCentralWidget(self.centralwidget)  self.retranslateUi(MainWindow)  QtCore.QObject.connect(self.quitButton, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.close)  QtCore.QObject.connect(self.startButton, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.start_countdown)  QtCore.QObject.connect(self.stopButton, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.stop_countdown)  QtCore.QObject.connect(self.resetButton, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.reset_countdown)  QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow):  passif __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) MainWindow = QtGui.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;次に、__init__メソッドを追加します。&lt;br /&gt;Ui_MainWindowクラスに、countというアトリビュートを加えます。&lt;br /&gt;このcountの値を減らしてカウントダウンさせます。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[class Ui_MainWindow(object): def __init__(self):  self.count = 0 def setupUi(self, MainWindow):]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;そのあと、QTimerオブジェクトを入れ込みます。&lt;br /&gt;setupUiの一番上に追加します。&lt;br /&gt;後述しますが、時間が来たらLCDNumberの値を減らすメソッドを実行させるためです。&lt;br /&gt;今回は、180.00で表示させようと思うので、10msで0.0１カウント減らします。&lt;br /&gt;ですので、setIntervalに10を入れ、インターバルが経過したら、カウントを0.01減らすといった内容です。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[ def setupUi(self, MainWindow):  self.timer = QtCore.QTimer()  self.timer.setInterval(10)  self.timer.timeout.connect(self.do_countdown)  MainWindow.setObjectName(_fromUtf8("MainWindow"))]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;次に、LCDNumberの値を初期値180.00を表示されるメソッドを書き込みます。&lt;br /&gt;このメソッドは、後述します。&lt;br /&gt;書く場所は、setupUiメソッドの一番下です。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[ def setupUi(self, MainWindow):  ...  QtCore.QMetaObject.connectSlotsByName(MainWindow)    self.reset_countdown() def retranslateUi(self, MainWindow):]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;準備が出来たので、シグナル/スロットのメソッドを書き加えます。&lt;br /&gt;全部で5つあります。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[class Ui_MainWindow(object): ...  def update_display(self):  self.lcdNumber.display("%6.2f" % (self.count / 100.00))  self.lcdNumber.update() def do_countdown(self):  self.count -= 1  self.update_display()  if self.count &lt;= 0:   self.stop_countdown() def start_countdown(self):  if self.count &gt; 0:   self.timer.start() def stop_countdown(self):  self.timer.stop() def reset_countdown(self):  self.timer.stop()  self.count = 18000  self.update_display()]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;update_display&lt;br /&gt;LCDNumberにカウント表示させます。&lt;br /&gt;countの値に100を割って、その値をアップデートです。&lt;br /&gt;&lt;br /&gt;do_countdown&lt;br /&gt;countの値を1減らして、update_displayします。&lt;br /&gt;countの値が0以下なったら、stop_countdownを呼びます。&lt;br /&gt;&lt;br /&gt;start_countdown&lt;br /&gt;countが0より大きかったら、QTimerをスタートさせます。&lt;br /&gt;&lt;br /&gt;stop_countdown&lt;br /&gt;QTimerをストップします。&lt;br /&gt;これによって、カウントが減らなくなります。&lt;br /&gt;&lt;br /&gt;reset_countdown&lt;br /&gt;QTimerをストップすると共に、countの値を18000にします。&lt;br /&gt;あとで、100割るためです。&lt;br /&gt;その後、update_displayで、表示を元に戻します。&lt;br /&gt;&lt;br /&gt;ここまで来ればほぼ完璧です。pyファイルを単体でつつけば、ラーメンタイマーの完成！&lt;br /&gt;しかし、Softimageで動かすことを考えると、もう少し編集が必要です。&lt;br /&gt;まず、1行目の&lt;br /&gt;&lt;br /&gt;# -*- coding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;を削除します。&lt;br /&gt;その後、一番下のほうにある&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;&lt;br /&gt;を削除して、そこから下のインデントを揃えます。&lt;br /&gt;最後に一番下の&lt;br /&gt;&lt;br /&gt;sys.exit(app.exec_())&lt;br /&gt;&lt;br /&gt;を&lt;br /&gt;&lt;br /&gt;app.exec_()&lt;br /&gt;&lt;br /&gt;に変更です！&lt;br /&gt;&lt;br /&gt;これで、全ての機能が入りました！！！！&lt;br /&gt;編集したコードは、こんな感じです。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[from PyQt4 import QtCore, QtGuitry:        _fromUtf8 = QtCore.QString.fromUtf8except AttributeError:        _fromUtf8 = lambda s: sclass Ui_MainWindow(object):        def __init__(self):                self.count = 0        def setupUi(self, MainWindow):                self.timer = QtCore.QTimer()                self.timer.setInterval(10)                self.timer.timeout.connect(self.do_countdown)                MainWindow.setObjectName(_fromUtf8("MainWindow"))                MainWindow.resize(464, 414)                MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))                self.centralwidget = QtGui.QWidget(MainWindow)                self.centralwidget.setObjectName(_fromUtf8("centralwidget"))                self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)                self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))                self.lcdNumber = QtGui.QLCDNumber(self.centralwidget)                self.lcdNumber.setAutoFillBackground(False)                self.lcdNumber.setFrameShape(QtGui.QFrame.Box)                self.lcdNumber.setFrameShadow(QtGui.QFrame.Sunken)                self.lcdNumber.setSmallDecimalPoint(True)                self.lcdNumber.setDigitCount(5)                self.lcdNumber.setMode(QtGui.QLCDNumber.Dec)                self.lcdNumber.setSegmentStyle(QtGui.QLCDNumber.Filled)                self.lcdNumber.setProperty("value", 0.0)                self.lcdNumber.setProperty("intValue", 0)                self.lcdNumber.setObjectName(_fromUtf8("lcdNumber"))                self.verticalLayout.addWidget(self.lcdNumber)                self.gridLayout = QtGui.QGridLayout()                self.gridLayout.setObjectName(_fromUtf8("gridLayout"))                self.startButton = QtGui.QPushButton(self.centralwidget)                self.startButton.setText(QtGui.QApplication.translate("MainWindow", "START", None, QtGui.QApplication.UnicodeUTF8))                self.startButton.setObjectName(_fromUtf8("startButton"))                self.gridLayout.addWidget(self.startButton, 0, 0, 1, 1)                self.stopButton = QtGui.QPushButton(self.centralwidget)                self.stopButton.setText(QtGui.QApplication.translate("MainWindow", "STOP", None, QtGui.QApplication.UnicodeUTF8))                self.stopButton.setObjectName(_fromUtf8("stopButton"))                self.gridLayout.addWidget(self.stopButton, 0, 1, 1, 1)                self.resetButton = QtGui.QPushButton(self.centralwidget)                self.resetButton.setText(QtGui.QApplication.translate("MainWindow", "RESET", None, QtGui.QApplication.UnicodeUTF8))                self.resetButton.setObjectName(_fromUtf8("resetButton"))                self.gridLayout.addWidget(self.resetButton, 1, 0, 1, 1)                self.quitButton = QtGui.QPushButton(self.centralwidget)                self.quitButton.setText(QtGui.QApplication.translate("MainWindow", "QUIT", None, QtGui.QApplication.UnicodeUTF8))                self.quitButton.setObjectName(_fromUtf8("quitButton"))                self.gridLayout.addWidget(self.quitButton, 1, 1, 1, 1)                self.verticalLayout.addLayout(self.gridLayout)                MainWindow.setCentralWidget(self.centralwidget)                self.retranslateUi(MainWindow)                QtCore.QObject.connect(self.quitButton, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.close)                QtCore.QObject.connect(self.startButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.start_countdown)                QtCore.QObject.connect(self.stopButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.stop_countdown)                QtCore.QObject.connect(self.resetButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.reset_countdown)                QtCore.QMetaObject.connectSlotsByName(MainWindow)                self.reset_countdown()        def retranslateUi(self, MainWindow):                pass        def update_display(self):                self.lcdNumber.display("%6.2f" % (self.count / 100.00))                self.lcdNumber.update()        def do_countdown(self):                self.count -= 1                self.update_display()                if self.count &lt;= 0:                        self.stop_countdown()        def start_countdown(self):                if self.count &gt; 0:                        self.timer.start()        def stop_countdown(self):                self.timer.stop()        def reset_countdown(self):                self.timer.stop()                self.count = 18000                self.update_display()import sysapp = QtGui.QApplication(sys.argv)MainWindow = QtGui.QMainWindow()ui = Ui_MainWindow()ui.setupUi(MainWindow)MainWindow.show()app.exec_()]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;おめでとうございます！&lt;br /&gt;これで、PyQtラーメンタイマーチュートリアルは終了となります。&lt;br /&gt;長々とありがとうございました。&lt;br /&gt;&lt;br /&gt;このコードをScript Editorや、&lt;a href="http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/09/blog-post_22.html"&gt;Script Library&lt;/a&gt;から実行して、完璧にうまいラーメン作ってみてくださいね～（´☣౪☣)ﾊﾌｰ&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-4596706623997209568?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/4596706623997209568/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=4596706623997209568' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/4596706623997209568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/4596706623997209568'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/10/pyqt_22.html' title='PyQtでラーメンタイマー'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-AX5WALT8i3A/TqKOBCgHSZI/AAAAAAAAAOU/e2vzXrhV6LU/s72-c/qtramen.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-8666383441979421639</id><published>2011-10-19T17:30:00.001+09:00</published><updated>2011-10-21T23:01:39.489+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PyQt'/><category scheme='http://www.blogger.com/atom/ns#' term='Manegement'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>PyQtをインストール</title><content type='html'>mayaで、標準搭載されているQtをいいなーと突っ込んでいる指を口からキーボードに移してみました。&lt;br /&gt;&lt;br /&gt;SoftimageのPythonのインストールからちょっと書いてみます。&lt;br /&gt;Softimage本体に梱包されているPythonではなく、別にインストールしたPythonを使用することにします。&lt;br /&gt;PyQtを、Softimageにコピーしてもいいのですが、なんとなく気持ち悪いので、ちゃんとインストールされたものを見に行きます。&lt;br /&gt;&lt;br /&gt;Softimage2012にインストールしてあるPythonのバージョンは、&lt;span class="Apple-style-span" style="background-color: white;"&gt;2.6.4&lt;span class="Apple-style-span" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: x-small;"&gt;ですが&lt;/span&gt;&lt;/span&gt;今回使用したのは、2系の最新、2.7.2を使用しています。&lt;br /&gt;&lt;br /&gt;本家からPythonをDownloadします。&lt;br /&gt;&lt;a href="http://www.python.org/download/"&gt;http://www.python.org/download/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Softimage で Python ActiveX を実行するには、Mark Hammond の Python 用スクリプト拡張が必要です。&lt;a href="http://www.python.org/download/windows/"&gt;http://www.python.org/download/windows/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上記のスクリプト拡張は、2011/10/19現在、Build216が最新です。&lt;br /&gt;2.7用の64bit版を使いました。&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/pywin32/files/pywin32/Build216/"&gt;http://sourceforge.net/projects/pywin32/files/pywin32/Build216/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PyQtをDownloadします。&lt;br /&gt;&lt;a href="http://www.riverbankcomputing.co.uk/software/pyqt/download"&gt;http://www.riverbankcomputing.co.uk/software/pyqt/download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Downloadするのは、Source&amp;nbsp;Packagesではなく、ちょっと下にある&lt;b&gt;Binary Packages&lt;/b&gt;のほうです。&lt;br /&gt;今回は、こちらを使用しました。&lt;br /&gt;&lt;a href="http://www.riverbankcomputing.co.uk/static/Downloads/PyQt4/PyQt-Py2.7-x64-gpl-4.8.5-1.exe"&gt;PyQt-Py2.7-x64-gpl-4.8.5-1.exe&lt;/a&gt; Windows 64 bit installer&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Softimageのモジュールが2012から追加されたので、&lt;b&gt;siutils.py&lt;/b&gt;をPython2.7.2へ追加します。&lt;/div&gt;&lt;div&gt;以下は、サブスクリプションアドバンスドパックから引っこ抜いた例です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C:\Program Files\Autodesk\Softimage 2012.SAP\Application\bin\siutils.py&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このファイルを&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C:\Python27\Lib\site-packages&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;へコピーします。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;最後に、環境変数をセットします。&lt;/div&gt;&lt;div&gt;Windows7の場合&lt;/div&gt;&lt;div&gt;エクスプローラからコンピュータを右クリック　→　システムの詳細設定　→　環境変数&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Path&lt;/b&gt;&lt;/div&gt;&lt;div&gt;C:\Python27&lt;/div&gt;&lt;div&gt;C:\Python27\Lib\site-packages\PyQt4&lt;/div&gt;&lt;div&gt;&lt;b&gt;PYTHONPATH&lt;/b&gt;&lt;/div&gt;C:\Python27\Lib\site-packages&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;これらをそれぞれセットします。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ここまで出来たら、PyQtのセットアップは完了です。&lt;/div&gt;&lt;div&gt;サンプルを実行して動作するかどうかテストしてみてください。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;from siutils import logimport PyQt4import sysfrom PyQt4 import QtGuifrom PyQt4 import QtCoreclass HelloWindow(QtGui.QMainWindow): def __init__(self, win_parent = None):  # Init the base class  QtGui.QMainWindow.__init__(self, win_parent)  self.create_widgets() def create_widgets(self):  # Widgets  self.label = QtGui.QLabel("Say Hello:")  self.hello_edit = QtGui.QLineEdit()  self.hello_button = QtGui.QPushButton("Push Me!")  # Horizontal layout  h_box = QtGui.QHBoxLayout()  h_box.addWidget(self.label)  h_box.addWidget(self.hello_edit)  h_box.addWidget(self.hello_button)  # Create central widget, add layout, and set  central_widget = QtGui.QWidget()  central_widget.setLayout(h_box)  self.setCentralWidget(central_widget)  #connect signal  QtCore.QObject.connect(self.hello_button   , QtCore.SIGNAL("clicked()")   , self.on_hello_clicked) def on_hello_clicked(self):  QtGui.QMessageBox.information(self  , "Hello!"  , "Hello %s" % self.hello_edit.displayText()  , QtGui.QMessageBox.Ok)  log("%s" % self.hello_edit.displayText() )#---------------------------------------------------------------------------# Someone is launching this directly# Create the QApplicationapp = QtGui.QApplication(sys.argv)# The Main windowmain_window = HelloWindow()main_window.show()# Enter the main loopapp.exec_()]]&gt;&lt;/script&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;PyQtウィジェットが動作したら、テキストボックスに何か文字を入力してボタンを押すと、Script Editorに、文字が表示されます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;さて、いろいろいじってみようかな～。&lt;br /&gt;みなさんもいじってみてくださいね～。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-8666383441979421639?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/8666383441979421639/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=8666383441979421639' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8666383441979421639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8666383441979421639'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/10/pyqt.html' title='PyQtをインストール'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-8585095593928047700</id><published>2011-09-22T18:28:00.000+09:00</published><updated>2011-09-22T18:28:49.384+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Addon'/><category scheme='http://www.blogger.com/atom/ns#' term='Manegement'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>スクリプトライブラリ</title><content type='html'>仕事でよく使うだろースクリプト第3段です。&lt;br /&gt;&lt;br /&gt;と、今回は、趣向がちょっと違いまして、みなさんは、自前のスクリプトや、ダウンロードしたものなどは、どうやって使っていますか？&lt;br /&gt;&lt;br /&gt;普通に、フォルダ分けして、Explorerからドラッグ&amp;amp;ドロップでしょうか。&lt;br /&gt;はたまた、シェルフを作ってボタン化している人もいるでしょう。&lt;br /&gt;わざわざ、プラグインにメニュー登録して、メニューを追加している人もいるかも知れません。&lt;br /&gt;&lt;br /&gt;それを一挙に解決出来るかも。というプラグインです。&lt;br /&gt;&lt;br /&gt;コンセプトは&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;&lt;b&gt;「オレのスクリプトライブラリ」&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;です。&lt;br /&gt;初めてアドオン作りました。&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2_KqOfZ4kcw/Tnr5wtmHfVI/AAAAAAAAANE/QLohEPLqttY/s1600/ScriptLibraryPoi.jpg" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="128" src="http://2.bp.blogspot.com/-2_KqOfZ4kcw/Tnr5wtmHfVI/AAAAAAAAANE/QLohEPLqttY/s200/ScriptLibraryPoi.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;addonをドラッグ＆ドロップします&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;まずは、アドオンをダウンロードしてください。&lt;br /&gt;&lt;br /&gt;&lt;a href="https://docs.google.com/leaf?id=0B-n2poDt84-tOTZiMWY0MTAtN2YyOS00NDM5LWE4OWQtZjUxZjdkY2Q4N2U3&amp;amp;hl=ja"&gt;ScriptLibrary_1_1.xsiaddon&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;その後、ダウンロードしたファイルを、Softimageにドラッグ&amp;amp;ドロップします。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-CclA7eEfTo0/Tnr7XO4paBI/AAAAAAAAANM/9eHbr8axx7U/s1600/ScriptLibraryHowTo3.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-CclA7eEfTo0/Tnr7XO4paBI/AAAAAAAAANM/9eHbr8axx7U/s1600/ScriptLibraryHowTo3.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;初期の状態のScript Libraryメニュー&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;すると、メニュー上部に&lt;b&gt;「Script Library」&lt;/b&gt;メニューが追加されました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;About Script Library&lt;/b&gt;をクリックするとHelpが表示されます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-fGekFq1Mqzs/Tnr8ScNDacI/AAAAAAAAANQ/u23RhKMo8Ys/s1600/ScriptLibraryHowTo2.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="84" src="http://2.bp.blogspot.com/-fGekFq1Mqzs/Tnr8ScNDacI/AAAAAAAAANQ/u23RhKMo8Ys/s200/ScriptLibraryHowTo2.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Preferenceでルートパスを変更&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;このままでは、まったく使い物にならないので、Preferenceを変更します。&lt;br /&gt;&lt;br /&gt;Preferences -&amp;gt; Custom -&amp;gt; ScriptLibrary &lt;br /&gt;&lt;br /&gt;を選択して、&lt;b&gt;&lt;span style="background-color: yellow;"&gt;スクリプトが入っているルートフォルダ&lt;/span&gt;&lt;/b&gt;を設定します。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-0h5slw2smw0/Tnr88Ac-oQI/AAAAAAAAANU/8d5EKStGC7M/s1600/ScriptLibraryHowTo6.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="77" src="http://4.bp.blogspot.com/-0h5slw2smw0/Tnr88Ac-oQI/AAAAAAAAANU/8d5EKStGC7M/s200/ScriptLibraryHowTo6.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;フォルダ階層と同期します&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;するとExplorerのフォルダ階層とメニューが同期して、そこからスクリプトファイルを実行出来るようになっちゃいます。&lt;br /&gt;&lt;br /&gt;ちなみに、ヘルプなどのhtmlや、txtファイルも実行でき、Netviewで見ることが出来ます。&lt;br /&gt;&lt;br /&gt;今現在対応しているファイルは&lt;br /&gt;&lt;br /&gt;&lt;b&gt;vbs, js, py, pys, html, htm, txt&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;の7種類が実行出来ます。&lt;br /&gt;それ以外の拡張子は、メニューに登録されますが、実行出来ません。&lt;br /&gt;&lt;br /&gt;要望があったら、バージョンアップします。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;About Script Library&lt;/b&gt;も覗いてみてくださいね。&lt;br /&gt;&lt;br /&gt;ではでは、ご活用ください。&lt;br /&gt;&lt;br /&gt;(◉◞౪◟◉｀)ﾁｬｵ&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-8585095593928047700?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/8585095593928047700/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=8585095593928047700' title='5 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8585095593928047700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8585095593928047700'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/09/blog-post_22.html' title='スクリプトライブラリ'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-2_KqOfZ4kcw/Tnr5wtmHfVI/AAAAAAAAANE/QLohEPLqttY/s72-c/ScriptLibraryPoi.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-8492742677320479909</id><published>2011-09-20T13:27:00.000+09:00</published><updated>2011-09-20T13:27:35.929+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>誕生からどのくらい経ってるかアプリ</title><content type='html'>C#第2弾は、&lt;b&gt;誕生からどのくらい経ってるかアプリ&lt;/b&gt;です。&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-j7aCDPyR_LA/TngRc9ktuBI/AAAAAAAAALU/Nnkwjv4PDO8/s1600/birthTime.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-j7aCDPyR_LA/TngRc9ktuBI/AAAAAAAAALU/Nnkwjv4PDO8/s200/birthTime.jpg" width="190" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;誕生からどのくらい経ってるかアプリ&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;a href="https://docs.google.com/leaf?id=0B-n2poDt84-tOGRiNzg3NzItYTQ2Yy00YzJmLTgyZmItZTNhNGM2NWMwNWNh&amp;amp;hl=ja"&gt;ダウンロード&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;娘が出来たので、どのくらい経ったか調べてみようと思ったのがきっかけで作ってみました。&lt;br /&gt;&lt;br /&gt;自分がどのくらい経っているのか見るのも面白いですお！&lt;br /&gt;&lt;br /&gt;アプリを立ち上げると、&lt;b&gt;オプションタブ&lt;/b&gt;があるので、誕生日を入力してください。&lt;br /&gt;すると、&lt;b&gt;産まれてからの時間タブ&lt;/b&gt;の下のほうに、どのくらいの時間、日数、トータルが経っているのか表示されるようになります。&lt;br /&gt;&lt;br /&gt;オプションで、画像フォルダも選べます。&lt;br /&gt;jpgが入っているフォルダを選ぶと、スライドショーとしてお楽しみいただけます。&lt;br /&gt;今現在は、jpgしか判別出来ないので、それ以外はお断りということで・・・( ఠ‿ఠ )&lt;br /&gt;&lt;br /&gt;動作確認は、7とXPで行っております。.NETFrameworkがインストールされていないと動きません。&lt;br /&gt;.NETFrameworkは&lt;a href="http://msdn.microsoft.com/ja-jp/netframework/ff687189.aspx"&gt;こちらからダウンロード&lt;/a&gt;してくださいぬ。&lt;br /&gt;&lt;br /&gt;それと、このアプリを閉じたときに、data.txtという設定ファイルをbirthTime.exeがある同フォルダに自動保存するようになります。&lt;br /&gt;次回立ち上げたときに、設定を自動読み込みさせるファイルが出来るので、気に留めておいてください。&lt;br /&gt;&lt;br /&gt;今回の不満は、メモリ管理が出来ませんでしたー。結構大きな画像がたくさんあるフォルダでスライドショーをすると、結構メモリ食います。&lt;br /&gt;gcで、落ちはしないと思いますが、開放の仕方が良く分からんです・・・。&lt;br /&gt;こういうのは、C++が向いているんだな。と思いますた。&lt;br /&gt;&lt;br /&gt;ではでは。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-8492742677320479909?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/8492742677320479909/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=8492742677320479909' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8492742677320479909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8492742677320479909'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/09/blog-post_20.html' title='誕生からどのくらい経ってるかアプリ'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-j7aCDPyR_LA/TngRc9ktuBI/AAAAAAAAALU/Nnkwjv4PDO8/s72-c/birthTime.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-6125775452208683290</id><published>2011-09-19T14:33:00.000+09:00</published><updated>2011-09-19T14:39:55.882+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Manegement'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>サブディビジョングループを作成する</title><content type='html'>タイトルを逆引きにしますた。&lt;br /&gt;探しにくかったですね・・・。ごめんなさい。&lt;br /&gt;&lt;br /&gt;さて、今日のアップは、サブディビジョングループを登録するです。&lt;br /&gt;これも良く使うよなー。&lt;br /&gt;サブディビレベルに応じて、グループ分けは良くしますよね？&lt;br /&gt;あれ、しませんか。そうですか。&lt;br /&gt;&lt;br /&gt;オブジェクトを選択して、実行するタイプのスクリプトです。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[#---------------------------------------------------app=Application;log=app.LogMessage;sel=app.Selectionimport win32com.clientfrom win32com.client import constants as cfrom win32com.client import Dispatch as d#---------------------------------------------------def CreateSubDivGroup(oObj):	log("%s,%s"%(oObj.FullName,oObj.Type))	# ポリゴンじゃないならメソッドを抜ける	if(oObj.Type != c.siPolyMeshType): return	# オブジェクトのサビディビジョンレンダーレベルを取得	iLvl = oObj.Properties("Geometry Approximation").Parameters("gapproxmordrsl").Value	# オブジェクトのモデルを取得	oMdl = oObj.Model	# オブジェクトがすでにサブディビジョングループに登録されているか調べる	oGrp = oMdl.Groups("sbdv_%02d"%iLvl)	# 登録されていなかったら	if not oGrp:		# 属するモデルにグループを作成		oGrp = oMdl.AddGroup(None,"sbdv_%02d"%iLvl)		# ジオメトリアプロクシメーションプロパティを作成		oProp = oGrp.AddProperty("GeomApprox")		# グループのサブディビジョンレンダーレベルをオブジェクトの値にエクスプレッションでセットする		oProp.Parameters("gapproxmordrsl").AddExpression("%s"%iLvl)	# オブジェクトをグループにメンバ登録	oGrp.AddMember(oObj)# 選択したものが属するモデルに、サブディビジョングループを作成し登録map(CreateSubDivGroup, sel)]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;今回のポイントは、目的のタイプのオブジェクトじゃなかったら、メソッドを抜ける。です。&lt;br /&gt;&lt;br /&gt;if(oObj.Type != c.siPolyMeshType): return&lt;br /&gt;&lt;br /&gt;ポリメッシュタイプ以外だったら、returnによってメソッドを抜けることが出来ます。&lt;br /&gt;エラー処理のひとつです。&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-oONftBHGpRg/TnbRfjuBuGI/AAAAAAAAALM/WNpJubH8Oq0/s1600/sbdv.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="136" src="http://4.bp.blogspot.com/-oONftBHGpRg/TnbRfjuBuGI/AAAAAAAAALM/WNpJubH8Oq0/s200/sbdv.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;サブディビジョングループを登録&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;オブジェクトを選んで実行するとこんな感じに仕上がります。&lt;br /&gt;レベルは、いくつでも大丈夫です。100を超えると数字がそろわなくなるくらいですか（そんなの作ることは無いですが）&lt;br /&gt;&lt;br /&gt;あとは、グループに新しくサビディビプロパティを作るので、Discontinuityがデフォルトに戻ってしまうというのが、注意しなくてはならない所。&lt;br /&gt;ディスプレイスもそうですね。&lt;br /&gt;&lt;br /&gt;で。&lt;br /&gt;2011から気づいたバグなのですが、グループにプロパティをセットして、オブジェクトを登録したのち、グループを消すと、元のオブジェクトに付いていたプロパティが見えなくなってしまう問題があります。&lt;br /&gt;実は本体は存在するようです。その証拠に、一度保存して、読み込み直すと元通りになってます。&lt;br /&gt;そんなに問題ではないように思いますが、ハマる人はハマるバグです。&lt;br /&gt;今日試しましたが、2012でも同じ挙動なので、直ってませんでした。&lt;br /&gt;&lt;br /&gt;お気をつけ。&lt;br /&gt;&lt;br /&gt;ラヴXSI　(◞≼●≽◟◞౪◟◞≼●≽◟)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-6125775452208683290?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/6125775452208683290/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=6125775452208683290' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/6125775452208683290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/6125775452208683290'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/09/blog-post_19.html' title='サブディビジョングループを作成する'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-oONftBHGpRg/TnbRfjuBuGI/AAAAAAAAALM/WNpJubH8Oq0/s72-c/sbdv.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-3183268937617490049</id><published>2011-09-18T21:40:00.000+09:00</published><updated>2011-09-18T21:40:44.999+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Render Archive'/><category scheme='http://www.blogger.com/atom/ns#' term='Rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='ICE'/><title type='text'>Render Archiveメモ</title><content type='html'>ほとんど使われる事がないRender Archive自分用メモ。&lt;br /&gt;&lt;br /&gt;Render_Archive &lt;br /&gt;&lt;br /&gt;Export--------------------------- &lt;br /&gt;&lt;br /&gt;Export時にライトも適用されてしまう模様。 &lt;br /&gt;なので、ライトは消去してからExport。 &lt;br /&gt;ライトのみもArchive可能。 &lt;br /&gt;&lt;br /&gt;素材分けは、パスを使用するのではなく、FrameBufferを使用する。 &lt;br /&gt;&lt;br /&gt;Motion Vectorの設定は、パス設定を見に行くので、作成時に注意。 &lt;br /&gt;Pass Rendering -&amp;gt; on &lt;br /&gt;Scene Motion Blur Setting -&amp;gt; end of frame &lt;br /&gt;shutter -&amp;gt; 0 &lt;br /&gt;&lt;br /&gt;Rendering------------------------ &lt;br /&gt;&lt;br /&gt;Rendering Scene構築の際、Instanceを各Passごとに設定 &lt;br /&gt;ICETree内で、Cacheをbtyなどで一度取り、他のPassはPointPositionのみReadし、StandinをそれぞれSet Instance Geometryで、セットする。&lt;br /&gt;↑はズレル事がある。原因不明。&lt;br /&gt;&lt;br /&gt;FrameBufferで一発出しが無難。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-3183268937617490049?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/3183268937617490049/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=3183268937617490049' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/3183268937617490049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/3183268937617490049'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/09/render-archive.html' title='Render Archiveメモ'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-2209273071262240092</id><published>2011-09-18T17:42:00.001+09:00</published><updated>2011-09-19T14:40:13.659+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Envelope'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='Deformation'/><title type='text'>デフォーマのウェイト値割り当てを入れ替える</title><content type='html'>仕事中に良く使ったなーというスクリプトを続々アップしようと思いますた。&lt;br /&gt;取っておいてもしょうがないし。&lt;br /&gt;&lt;br /&gt;てなわけで、第一段は、デフォーマのウェイト値割り当てを入れ替えるスクリプトです。&lt;br /&gt;うんうん、良く使う。&lt;br /&gt;デフォルトで、搭載されていても、おかしくないと思うんですけどね。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[#---------------------------------------------------# デフォーマのウェイト値を入れ替えるスクリプト# Envelopeされているオブジェクトを選択しスクリプトを実行# その後、入れ替えるデフォーマを元、先の順にピックします。#---------------------------------------------------app=Application;log=app.LogMessage;sel=app.Selectionimport win32com.clientfrom win32com.client import constants as cfrom win32com.client.dynamic import Dispatch as d#---------------------------------------------------# チェンジ元のオブジェクトを取得oBtn,oMdf,oElmSrc = app.PickElement("","Pick Source","Pick Source")if not oElmSrc:raise# チェンジ先のオブジェクトを取得oBtn,oMdf,oElmTgt = app.PickElement("","Pick Target","Pick Target")if not oElmTgt:raiseif sel.Count==0:raisefor oObj in sel:    # 新しくデフォーマをEnvelopeへ登録    app.ApplyFlexEnv(oObj.FullName+";"+oElmTgt.FullName, "", 0)    # Envelopeを取得    oEnv = oObj.Envelopes(0)    # EnvelopeのWeight値を取得    # 内包表記を使用して、タプルをリストへ変換    lWgt = [list(t) for t in oEnv.Weights.Array]    # チェンジ元、先、それぞれのデフォーマは    # 何番目に登録されたオフジェクトかを調べる    for i,oDfm in enumerate(oEnv.Deformers):        if oElmSrc.FullName == oDfm.FullName:            iSrc = i            log(i)        elif oElmTgt.FullName == oDfm.FullName:            iTgt = i            log(i)    # デフォーマのウェイト値を入れ替える    lWgt[iSrc],lWgt[iTgt] = lWgt[iTgt],lWgt[iSrc]    # ウェイト値をセットする    oEnv.Weights.Array = lWgt]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;ここでのスクリプトのポイントは、ウェイト値の取得です。&lt;br /&gt;Pythonのタプルは編集が出来ないので、編集が出来るリストへ変換します。&lt;br /&gt;&lt;br /&gt;lWgt = [list(t) for t in oEnv.Weights.Array]&lt;br /&gt;&lt;br /&gt;2次元配列のタプルを、2次元配列のリストへ変換します。&lt;br /&gt;これで、編集可能ってわけです。&lt;br /&gt;&lt;br /&gt;多次元タプルを、全てリスト化するメソッドを今度書いてみようかな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-2209273071262240092?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/2209273071262240092/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=2209273071262240092' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/2209273071262240092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/2209273071262240092'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/09/blog-post_18.html' title='デフォーマのウェイト値割り当てを入れ替える'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-2278693289251762014</id><published>2011-09-18T12:40:00.001+09:00</published><updated>2011-09-18T17:43:32.807+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>ボタン叩き</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;最近、C#をはじめました。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;なんか、Windowsを使ってるくせに、Windowsの簡単なアプリひとつ作れないとは・・・。と、自分を責めていたものですｗ&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;なもんで、Visual C#をダウンロードして、本読んだりウェブみたりして、ちくちく勉強して、やっと出来たのがコレです・・・。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-YaVQjnEbXvY/TnVg_QhX_GI/AAAAAAAAALA/2LJ8hph39-k/s1600/buttonTataki.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-YaVQjnEbXvY/TnVg_QhX_GI/AAAAAAAAALA/2LJ8hph39-k/s200/buttonTataki.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;ボタン叩き&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;&lt;a href="https://docs.google.com/viewer?a=v&amp;amp;pid=explorer&amp;amp;chrome=true&amp;amp;srcid=0B-n2poDt84-tMDk2Yjg1ZjEtMDM2OC00MmU3LWE0MzctYzM5YzA0MmU0MmYz&amp;amp;hl=ja"&gt;ダウンロード&lt;/a&gt;（一番右の操作から）&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;制限時間内に、何回押せるか。ゲーム！&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;ちなみに、どんなに頑張っても10点しか行きません。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;んー、難しいです。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;過去にも、Flashで、こんなん作ったな。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;動作確認は、7、XPで、確認済み。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;生意気にも、.NETFrameworkが入ってないと動きません。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;Softimage入ってる人だったら、動くと思うんです。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;あと、最近パソコン買った人とか。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;あ～大変だった（笑）&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;プログラミングって、覚えるのが大変です。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;CGって、なんとなくやってたら出来るけど、プログラムってなんとなくやっても全然出来ないのがツライ。でも、ちょっとでも出来るようになると、面白いですねー。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;少しずつなれて、仕事でも活用出来たらって感じですかね。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;あとは、沢山ある言語の中で、どの言語を勉強したらいいかっていう、チョイスが大変難しいです。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;やっぱり覚えるんなら、C++はやっときたいなーってのと（コレが大変すぎる）、jQueryも覚えたいなーとか。Webブラウザーベースのほうが楽なんじゃないだろうかとか。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;んー多すぎて分かりません。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;ま、テキトーにやっていきます。&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;CGもそろそろやらないとなーｗ&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-2278693289251762014?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/2278693289251762014/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=2278693289251762014' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/2278693289251762014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/2278693289251762014'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/09/blog-post.html' title='ボタン叩き'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-YaVQjnEbXvY/TnVg_QhX_GI/AAAAAAAAALA/2LJ8hph39-k/s72-c/buttonTataki.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-2138443515719556311</id><published>2011-09-17T13:03:00.002+09:00</published><updated>2011-09-17T19:02:02.989+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>SyntaxHighlighter</title><content type='html'>ブログのデザインを変えました～。&lt;br /&gt;&lt;br /&gt;ちともっさりしたかも？&lt;br /&gt;また気分で変えます。&lt;br /&gt;&lt;br /&gt;で、我がブログにもSyntaxHighlighterを導入してみました。&lt;br /&gt;&lt;br /&gt;使い方が全然分からないのだけど、コード表示はいいかもですね。&lt;br /&gt;&lt;br /&gt;参考にさせていただいたところはこちらです。&lt;br /&gt;一番分かりやすかったなぁ。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://moririn-web.blogspot.com/2010/03/bloggersyntax-hilighter.html"&gt;http://moririn-web.blogspot.com/2010/03/bloggersyntax-hilighter.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-2138443515719556311?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/2138443515719556311/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=2138443515719556311' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/2138443515719556311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/2138443515719556311'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/09/syntaxhighlighter.html' title='SyntaxHighlighter'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-1688147293295544535</id><published>2011-08-24T01:02:00.005+09:00</published><updated>2011-09-17T20:22:21.523+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Envelope'/><title type='text'>ウェイトが１００でないポイントを選択する</title><content type='html'>調べたいオブジェクトを選択して、実行です。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[l=list()for i,w in enumerate(Application.Selection(0).Envelopes(0).Weights):	if round(sum(w),5)!=100:		l.append(i)Application.SelectGeometryComponents(Application.Selection(0).FullName+".pnt["+",".join(map(str,l))+"]")]]&gt;&lt;/script&gt;&lt;br /&gt;内包表記を使うと１行で出来たよ。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[Application.SelectGeometryComponents(Application.Selection(0).FullName+".pnt["+",".join([ str(i) for i,w in enumerate(Application.Selection(0).Envelopes(0).Weights) if round(sum(w),5)!=100])+"]")]]&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-1688147293295544535?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/1688147293295544535/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=1688147293295544535' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1688147293295544535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1688147293295544535'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2011/08/blog-post.html' title='ウェイトが１００でないポイントを選択する'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-1859126471816073820</id><published>2010-12-15T20:39:00.004+09:00</published><updated>2010-12-15T21:26:27.216+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shader'/><category scheme='http://www.blogger.com/atom/ns#' term='Rendering'/><title type='text'>Ambient Occlusionのアルファ抜き</title><content type='html'>アルファシリーズ第3弾は、テクスチャアルファで切り取ったオブジェクトにAmbient Occlusionを適用させるには。です。&lt;br /&gt;&lt;br /&gt;下の図は、左から、BA_raylengthを使用したもの。&lt;br /&gt;真ん中は、Card/Opacityで切り取ったものに対して、AO。&lt;br /&gt;一番右は、オブジェクトの形を切り取って、AO。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-9eu6tYGM5o/TQivbBbjy8I/AAAAAAAAAKE/hgcyjkRfthY/s1600/coAO1.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 197px;" src="http://2.bp.blogspot.com/_-9eu6tYGM5o/TQivbBbjy8I/AAAAAAAAAKE/hgcyjkRfthY/s400/coAO1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5550879419509492674" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;当然、一番右のくりぬいた結果が正解です。&lt;br /&gt;&lt;br /&gt;左の、BA_raylengthでは、Tracing Depthに限界が見えます。Far planeを調節して、下の方までAOを行き渡らせることが出来るみたいですが、結果があまり良くありません。&lt;br /&gt;&lt;br /&gt;真ん中は、一見良さそうに見えるのですが、Ambient Occlusionシェーダーは、テクスチャの透明を判断しません。オブジェクトの形を見て結果を出しています。&lt;br /&gt;ですので、これは正しくありません。&lt;br /&gt;&lt;br /&gt;そこで、Final Gatheringを使用したAmbient Occlusionを設定します。&lt;br /&gt;比較的新しく投入された、mib_fg_occlusionシェーダーを使用します。&lt;br /&gt;このシェーダーは、FGを使い正しくray判定を行い、AOを出力するシェーダーです。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-9eu6tYGM5o/TQixgrY7TGI/AAAAAAAAAKM/tijSnJO_qyI/s1600/coAO2.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_-9eu6tYGM5o/TQixgrY7TGI/AAAAAAAAAKM/tijSnJO_qyI/s400/coAO2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5550881715695340642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;わざわざAOを出すためにFGを使用するのはバカバカしいと思いがちですが、物凄い軽いです。&lt;br /&gt;Number of Raysの値は、300くらいでキャラクターアニメーションにも耐えられると思います。&lt;br /&gt;もし、fgmapを出したくないのであれば、ModeをExactにすればfgmapを出力せず、ガチで計算します。&lt;br /&gt;Number of Raysの値は、同じく300くらい。でも、このやり方は、重たいです。オススメしません。&lt;br /&gt;&lt;br /&gt;シェーダーのインプット、result_when_fg_is_offは、レンダ設定のFGのチェックがオフになっている場合、このインプットを使うということがマニュアルに書いてあります。&lt;br /&gt;一応、上記の画像では、Ambient Occlusionシェーダーが刺さっていますが、特に必要が無ければ、何も付けなくてもOKです。&lt;br /&gt;&lt;br /&gt;以前、調べたときは、Softimageの記事が全く無く、mayaの記事を発見してこうやって使うんだ…。でも、FGかぁ…。&lt;br /&gt;と思ってしまったのですが、骨さんのKさんに存在を教えてもらい見直したら、これでいいじゃんって事になりました。&lt;br /&gt;Kさんどうもありがとう！この場を借りて感謝です。&lt;br /&gt;&lt;br /&gt;というわけで、新しいシェーダーもなかなか使えるものがあるなぁ。と思いつつ、少しずつ解析してますが、全く何やってんだかさっぱりわからないものだらけで、マニュアルの書き方をもう少しデザイナよりにしてくれないかなぁ。と儚い願いを毎日していますw&lt;br /&gt;&lt;br /&gt;ではでは、アルファシリーズはこの辺で終了です。&lt;br /&gt;また何かあったら、書きますねー。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-1859126471816073820?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/1859126471816073820/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=1859126471816073820' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1859126471816073820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1859126471816073820'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2010/12/ambient-occlusion.html' title='Ambient Occlusionのアルファ抜き'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-9eu6tYGM5o/TQivbBbjy8I/AAAAAAAAAKE/hgcyjkRfthY/s72-c/coAO1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-4111651342290213400</id><published>2010-12-13T15:08:00.004+09:00</published><updated>2010-12-13T15:22:43.622+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shader'/><category scheme='http://www.blogger.com/atom/ns#' term='Rendering'/><title type='text'>アルファでアルファ抜き</title><content type='html'>前回、Spriteの恐ろしさを書きましたが、今回は、比較的新しく追加されたCard/Opacityシェーダーについて書いてみようと思います。&lt;br /&gt;&lt;br /&gt;Card/Opacity(mip)シェーダーの一部マニュアルを見てみましょう。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;透明度に関連する他のシェーダを使用するときは、最終レンダリングでは木が正しく見え、枝の間から家が見える状態であったとしても、ほとんどの場合Z深度（および他のフレームバッファ）は平面の深度を含むことになります。たいていの後工程の作業では、これは望ましくありません。&lt;br /&gt;&lt;br /&gt;この問題を解決するために、mental ray APIにはmi_trace_continueという機能が備わっています。この機能は最初のオブジェクトにヒットしたときの交差がなかったかのように、レイを継続します。カード/不透明度（mip_card_opacity）シェーダはこの機能を内部的に使用し、「標準」の透明度とmi_trace_continueの使用を切り替えて、与えられたしきい値で透明オブジェクトを作成します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;所見だけだとなんのこっちゃあまりよく分かりません。&lt;br /&gt;でも、真剣に読んでいくと、なんとなくすごいシェーダーなんじゃないかと思えてきます。&lt;br /&gt;&lt;br /&gt;要するに、レンダリング時に、透明でないといけないところが、オブジェクトの形でレンダリングされてりまう問題を、mi_trace_continueという機能で透けさせるってことがいいたいみたいです。&lt;br /&gt;&lt;br /&gt;なので、もしかしたら。と思い試してみたところ、テクスチャのアルファで、アルファ抜きが出来ました！&lt;br /&gt;&lt;br /&gt;2枚の板を出して、上の板に、おなじみのXSIロゴアルファ付きをPickerしてアルファを抜き出し、Card/Opacityのopacityノードに差すと抜けます。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-9eu6tYGM5o/TQW6IQ7gSbI/AAAAAAAAAJ0/fCbtRV_s-wo/s1600/card_opacity.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/TQW6IQ7gSbI/AAAAAAAAAJ0/fCbtRV_s-wo/s400/card_opacity.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5550046766950271410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;アルファ表示では、結果はこんなありさま！&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-9eu6tYGM5o/TQW6bMF_QXI/AAAAAAAAAJ8/9KzYoZpArs4/s1600/co_rend.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 238px;" src="http://3.bp.blogspot.com/_-9eu6tYGM5o/TQW6bMF_QXI/AAAAAAAAAJ8/9KzYoZpArs4/s400/co_rend.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5550047092069581170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Card/Opacity(mip)シェーダーすげっす。&lt;br /&gt;以前は、マスク出さないと出来なかったのに・・・。便利になったもんだ、Mental Ray。&lt;br /&gt;バージョンアップしているんだなぁ。とひさびさに実感しましたｗ&lt;br /&gt;&lt;br /&gt;とはいえ、あまり使うタイミングは無いかも知れませんが。&lt;br /&gt;&lt;br /&gt;では、次は、Ambient Occlusionのアルファ抜きを書きます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-4111651342290213400?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/4111651342290213400/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=4111651342290213400' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/4111651342290213400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/4111651342290213400'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2010/12/blog-post.html' title='アルファでアルファ抜き'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-9eu6tYGM5o/TQW6IQ7gSbI/AAAAAAAAAJ0/fCbtRV_s-wo/s72-c/card_opacity.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-1001593143728801302</id><published>2010-12-07T19:58:00.007+09:00</published><updated>2010-12-07T20:15:11.537+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shader'/><category scheme='http://www.blogger.com/atom/ns#' term='Rendering'/><title type='text'>最近のSoftimageの影の中の影。</title><content type='html'>最近のSoftimageで、だいぶ経ってしまったのですが、Spriteによる影の結果が変わっていることに気づきました。&lt;br /&gt;その境は、v6.5→v7に移行したときに変更があったみたいです。&lt;br /&gt;気づいた人はいるかも知れませんが、v7以降、Spriteを使用したときに、影の中に影がある状態を作ろうとするとおかしな挙動をします。&lt;br /&gt;&lt;br /&gt;6.5で、Spriteを使用し、中のGridに適用させたものです。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_-9eu6tYGM5o/TP4UWe8f2yI/AAAAAAAAAJU/_E78iMWZ2YM/s1600/sprite6_5_view.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/TP4UWe8f2yI/AAAAAAAAAJU/_E78iMWZ2YM/s400/sprite6_5_view.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5547894167463516962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;結果はこうなって欲しいですし、正しいと思われるものです。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_-9eu6tYGM5o/TP4UyrduS3I/AAAAAAAAAJc/f-hk8pk4bWc/s1600/sprite6_5.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/TP4UyrduS3I/AAAAAAAAAJc/f-hk8pk4bWc/s400/sprite6_5.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5547894651860437874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ところが、v7.01では、このようになってしまいます。&lt;br /&gt;2011SP1でもこのような結果になってしまうようです。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_-9eu6tYGM5o/TP4VFn3R3vI/AAAAAAAAAJk/lgqH7QPoun4/s1600/sprite2011.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_-9eu6tYGM5o/TP4VFn3R3vI/AAAAAAAAAJk/lgqH7QPoun4/s400/sprite2011.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5547894977311399666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;これは、由々しき問題！！&lt;br /&gt;正しかったものが、正しくない状態になっているという盲信はちょー危険です。&lt;br /&gt;&lt;br /&gt;ですので、以下のように、今後Spriteを使用するのを禁止し、新しく登場した、Card/Opacityノードと、Simple Shadowノードを使うほうが良いと思います。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_-9eu6tYGM5o/TP4Vlpx0f8I/AAAAAAAAAJs/WwE8NSovT3U/s1600/simpleShadow.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_-9eu6tYGM5o/TP4Vlpx0f8I/AAAAAAAAAJs/WwE8NSovT3U/s400/simpleShadow.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5547895527581188034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;これで、正しい結果を取り戻すことが出来ました！&lt;br /&gt;Card/Opacityノードをわざわざ何で使うのかというのは次回投稿しますが、かなり便利で、&lt;strong&gt;アルファでオブジェクトを抜く&lt;/strong&gt;ことが出来ます。&lt;br /&gt;さらに、今までBA_laylengthを使わないと出来なかった、アルファで抜いたAmbient Occlusionの表現も可能になります。&lt;br /&gt;&lt;br /&gt;というわけですので、ソフトも変わるので、私たちも変わらなければならないという教訓を忘れずに、Softimageと仲良くすごして生きましょう！&lt;br /&gt;&lt;br /&gt;では今回はこの辺で。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-1001593143728801302?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/1001593143728801302/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=1001593143728801302' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1001593143728801302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1001593143728801302'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2010/12/softimage.html' title='最近のSoftimageの影の中の影。'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-9eu6tYGM5o/TP4UWe8f2yI/AAAAAAAAAJU/_E78iMWZ2YM/s72-c/sprite6_5_view.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-7069392627606983085</id><published>2010-09-04T10:42:00.003+09:00</published><updated>2010-09-04T11:18:44.124+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shader'/><category scheme='http://www.blogger.com/atom/ns#' term='ICE'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>メモ的ナ何か。</title><content type='html'>ひさびさの更新です。会社始めて、いままで休んでたギャップっつーのが来て、ひと段落･･･。&lt;br /&gt;だんだん慣れてきました。&lt;br /&gt;&lt;br /&gt;今の会社では、SI2011SP1を使っておりますが、なかなかいいバージョンじゃないですか。&lt;br /&gt;ICEコンパウンドもかなり増えて、映像制作で少しずつ取り入れていけそうです。&lt;br /&gt;&lt;br /&gt;ただ、ちょっとしたバグがあり、そのメモをちょいと。&lt;br /&gt;&lt;br /&gt;Preferenceで、Help LanguageをJapaneseにしても、Englishに戻される･･･。&lt;br /&gt;Docのjpフォルダを、enフォルダにしてダマすしかないようです。&lt;br /&gt;ｳﾞｨｳﾞｧXSI！！&lt;br /&gt;&lt;br /&gt;Scriptで、やっとPythonが標準搭載されたのも束の間&lt;br /&gt;カスタムプロパティのLayout.Logicを使う場合&lt;br /&gt;&lt;br /&gt;oLayout.Language = "Python"&lt;br /&gt;&lt;br /&gt;としてもvbsとして扱われるようになり、エラー･･･。&lt;br /&gt;&lt;br /&gt;その時の対処法は&lt;br /&gt;&lt;br /&gt;oLayout.Language = "PythonScript"&lt;br /&gt;&lt;br /&gt;もしくは&lt;br /&gt;&lt;br /&gt;oLayout.Language = "xsi.SIPython"&lt;br /&gt;&lt;br /&gt;で、Pythonとして、やっと動作します。&lt;br /&gt;ｳﾞｨｳﾞｧXSI！！！&lt;br /&gt;&lt;br /&gt;つー2つのバグがありました。&lt;br /&gt;他はよく知らないんですけどね。&lt;br /&gt;まだあるかも知れませんね。&lt;br /&gt;&lt;br /&gt;あとは、Dual Quaternionが標準装備されて嬉しい今日この頃ですが&lt;br /&gt;DeformerをGroupで入力するところで、セットしたんだが、変な挙動をしちゃって&lt;br /&gt;使えねーじゃんこれ！！&lt;br /&gt;って思って諦めている人もいるかも知れませんが、Select Deformer from Envelopeを使ってDeformerを選択した後、Groupを作成してセットすれば、100%上手くいきます。&lt;br /&gt;Envelopeをセットしたときの、Deformerの登録の順番がキーポイントみたいですね。&lt;br /&gt;&lt;br /&gt;あとは、Deformation Methodのところをぶっ壊して、scalarを刺して0-1の間をぐりぐりするのも面白いですし、WeightMap貼って、ここだけ、DualQ！！にしてもいいし。&lt;br /&gt;いいですね。&lt;br /&gt;面白いですね。&lt;br /&gt;&lt;br /&gt;肝心のICE Kinematicsは、あまり検証してませんが、問題点をあげるとしたら、リギングの仕組みが作った人しか解らない。&lt;br /&gt;ってのが一番問題ですわね。&lt;br /&gt;アニメーションしてるときに、ここ切りたいんだけど、ってのは製作者に聞かないと解らず。&lt;br /&gt;ちと面倒くさいなぁ。&lt;br /&gt;なんか、MBみたいに、骨に直接アサインするタイプじゃなくて、フルボディIKのような、テンプレートリグを作って、それがICE Kineならいいんじゃねーかなー。って感じですね。&lt;br /&gt;それなら、使いたくない時はオフするとかで、シンプルになります。&lt;br /&gt;&lt;br /&gt;やー、やっぱMBは値段が高いだけある感じがしますね。&lt;br /&gt;伊達な感じがします。&lt;br /&gt;武士を感じます。&lt;br /&gt;&lt;br /&gt;ICEもはよHoudiniのように、超強力なコンパウンドをバンバン標準装備して欲しいですね。&lt;br /&gt;まだまだ足らないよねー。&lt;br /&gt;そして、Tipsも足らなくて、誰も手を出さないよねー。&lt;br /&gt;っていう問題は、あと2,3年は続くかなぁ。と思いますた。&lt;br /&gt;&lt;br /&gt;あっ。そうそう。Render TreeのUser Toolsをたまたまつついたら、こんなところにCreate SSS Lightmapだと！！！！！！！！！！！&lt;br /&gt;ってのが、ありました。&lt;br /&gt;フツーにNodeに入れといてくれ･･･。めちゃくちゃ探したよ･･･。スクリプトからしか出せないかと思ったよ･･･。&lt;br /&gt;と思ったら、マニュアルに普通に載ってた（笑）&lt;br /&gt;困った時は、マニュアルが一番ということを身にしみて感じました。&lt;br /&gt;&lt;br /&gt;という今日この頃です。みなさんも、良いXSIライフを！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-7069392627606983085?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/7069392627606983085/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=7069392627606983085' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/7069392627606983085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/7069392627606983085'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2010/09/blog-post.html' title='メモ的ナ何か。'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-7820791657717868122</id><published>2010-02-23T08:38:00.020+09:00</published><updated>2011-12-12T17:32:57.342+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>エクセルマスター</title><content type='html'>いつもスバラシイ記事満載のAquさんのブログに「VBScript vs Python」なる記事が載るとのことですので楽しみです。&lt;br /&gt;これからSoftimageでPythonを使ってエクセルにアクセスしてみたいと思います。 &lt;a href="http://d.hatena.ne.jp/Aqu/20100219/1266593788"&gt;http://d.hatena.ne.jp/Aqu/20100219/1266593788&lt;/a&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;実際には、エクセルを使用して、データを作成するのは、あまりオススメしません･･･。&lt;br /&gt;エクセルファイルより、テキストファイルの方がデータの扱いが軽いし楽ですからね。&lt;br /&gt;逆にテキストファイルを中間ファイルとして、そのテキストファイルから、データやエクセルファイルを作成したほうが、良い気がします。&lt;br /&gt;ですが、何かのときに役には立ちそうですね。&lt;br /&gt;&lt;br /&gt;まず、モジュールを別途それぞれインストールします。&lt;br /&gt;&lt;br /&gt;xlrd　読み込み &lt;a href="http://pypi.python.org/pypi/xlrd"&gt;http://pypi.python.org/pypi/xlrd&lt;/a&gt;&lt;br /&gt;xlwt　書き込み &lt;a href="http://pypi.python.org/pypi/xlwt"&gt;http://pypi.python.org/pypi/xlwt&lt;/a&gt;&lt;br /&gt;xlutils　ユーティリティ &lt;a href="http://pypi.python.org/pypi/xlutils"&gt;http://pypi.python.org/pypi/xlutils&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_-9eu6tYGM5o/S4MX-_V2KFI/AAAAAAAAAII/pFd6bggQfBU/s1600-h/xlrd_exp.jpg" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5441219145716082770" src="http://3.bp.blogspot.com/_-9eu6tYGM5o/S4MX-_V2KFI/AAAAAAAAAII/pFd6bggQfBU/s320/xlrd_exp.jpg" style="height: 179px; width: 175px;" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;C:\temp\text.xls&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;その後、エクセルファイルを作成して、アクセスしてみます。&lt;br /&gt;&lt;br /&gt;中身は、こんな感じ。 星座の表です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_-9eu6tYGM5o/S4MYNiPTsVI/AAAAAAAAAIQ/iTXsk-cP78I/s1600-h/xlrd_exel1.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img alt="" border="0" height="200" id="BLOGGER_PHOTO_ID_5441219395602067794" src="http://3.bp.blogspot.com/_-9eu6tYGM5o/S4MYNiPTsVI/AAAAAAAAAIQ/iTXsk-cP78I/s200/xlrd_exel1.jpg" width="167" /&gt;&lt;/a&gt;&lt;br /&gt;この中の、ふたご座の英語のセル、(C,3)のGeminiにアクセスしてみようと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;コレだけですねー。簡単簡単。&lt;br /&gt;&lt;br /&gt;最後の、c.valueは、xlrdのvalueですので、Valueと書くとエラーになりますよ。ご注意ください。&lt;br /&gt;&lt;br /&gt;さて、これでリーダーの方は、マネージメントが少し楽になったのではないかなーと思います。&lt;br /&gt;不測の事態を想定して、いろいろ覚えておくといいですね。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;ではでは。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-7820791657717868122?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/7820791657717868122/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=7820791657717868122' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/7820791657717868122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/7820791657717868122'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2010/02/blog-post_23.html' title='エクセルマスター'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-9eu6tYGM5o/S4MX-_V2KFI/AAAAAAAAAII/pFd6bggQfBU/s72-c/xlrd_exp.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-8322681382317598897</id><published>2010-01-28T14:00:00.012+09:00</published><updated>2011-09-17T13:46:05.776+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Modeling'/><category scheme='http://www.blogger.com/atom/ns#' term='Jscript'/><title type='text'>PolygonIslandを使って、PolygonNormalを揃えてみた。</title><content type='html'>法線についての質問が某掲示板にあったので、解決するすべを考えてみました。&lt;br /&gt;一つのオブジェクトの中に、法線の向きが反転してしまっている場合にそれを揃える問題です。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_-9eu6tYGM5o/S2EcYSKKMtI/AAAAAAAAAH4/YUnRtVTKy9w/s1600-h/polynormal.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5431653829102416594" src="http://3.bp.blogspot.com/_-9eu6tYGM5o/S2EcYSKKMtI/AAAAAAAAAH4/YUnRtVTKy9w/s320/polynormal.jpg" style="cursor: hand; height: 313px; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上の絵は、2つの Sphere を Merge して1つにして、真ん中の Polygon のみを反転させた状態です。&lt;br /&gt;Border Line が見えますね。&lt;br /&gt;真ん中だけ反転しているというものです。&lt;br /&gt;&lt;br /&gt;このように、簡単な形状なら、真ん中の Polygon を選んで、Invert Polygons を実行すれば修正出来たことになりますが、ぐちゃぐちゃの場合、労力と気力と根性が必要です。&lt;br /&gt;&lt;br /&gt;先ほど、Border Line が見えますとのことですので、ここで効力を発揮するのは、Polygon Island フィルターです。&lt;br /&gt;Polygon Islandは、まさにPolygonの島を選択するツールです。&lt;br /&gt;これをセットして、F10を押し、Raycastモードにしてから、適当なPolygonをつつきます。&lt;br /&gt;すると、下図のようになります。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_-9eu6tYGM5o/S2EedhZ_8VI/AAAAAAAAAIA/JVRPIJguOsQ/s1600-h/polyisland.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5431656118117986642" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/S2EedhZ_8VI/AAAAAAAAAIA/JVRPIJguOsQ/s320/polyisland.jpg" style="cursor: hand; height: 214px; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Border のところで、選択が止まりました。&lt;br /&gt;なので、これを Invert Polygons で反転してあげます。&lt;br /&gt;&lt;br /&gt;というのを数回繰り返せば、向きを揃えることができますね。&lt;br /&gt;&lt;br /&gt;数回繰り返すのもバカらしいという方は、スクリプトも作ってみました。&lt;br /&gt;たぶん大丈夫だと思うのだけれど・・・。&lt;br /&gt;今回は、Jscriptです。&lt;br /&gt;バグあったら、教えてください。&lt;br /&gt;あっ。ちなみに、オブジェクトの形状が複雑だと重いかも。&lt;br /&gt;手動の方が良かったりするんですよね。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: jscript" type="syntaxhighlighter"&gt;&lt;![CDATA[function GetIslands(in_obj) {  var arrIslands = new Array();  var plyPolygons = in_obj.ActivePrimitive.Geometry.Polygons;  var arrSeen = new Array(plyPolygons.Count);  for ( var i=0; i&lt;plyPolygons.Count; i++ ) {    if(arrSeen[i]){continue;}       var xsiCurrPolygons = new ActiveXObject("XSI.Collection");    xsiCurrPolygons.Add(plyPolygons(i));    var fltPolyIslandFilter = Filters("Polygon_Island");    var xsiCurrIslands = fltPolyIslandFilter.Subset(xsiCurrPolygons);       var plyCurrIslands = Dictionary.GetObject(xsiCurrIslands).SubComponent.ComponentCollection;       for ( var j=0; j&lt;plyCurrIslands.Count; j++ )      arrSeen[plyCurrIslands(j).Index] = 1;       arrIslands.push(plyCurrIslands);  }   for(var i=0;i&lt;arrIslands.length;i++)    AlignNormal(arrIslands[i]);   return arrIslands;}function AlignNormal(pIslandCol){  var oCurPoly = new ActiveXObject("XSI.Collection");  oCurPoly.Add(pIslandCol(0));  var xsiCurrIslands = Filters("Polygon_Island").Subset(oCurPoly);  ApplyTopoOp("InvertPolygon", xsiCurrIslands);}for(var i=0;i&lt;Selection.Count;i++)  GetIslands(Selection(0))]]&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-8322681382317598897?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/8322681382317598897/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=8322681382317598897' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8322681382317598897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8322681382317598897'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2010/01/polygonislandpolygonnormal.html' title='PolygonIslandを使って、PolygonNormalを揃えてみた。'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-9eu6tYGM5o/S2EcYSKKMtI/AAAAAAAAAH4/YUnRtVTKy9w/s72-c/polynormal.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-8282235303512951335</id><published>2009-12-24T23:54:00.000+09:00</published><updated>2009-12-25T00:52:21.266+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ICE'/><title type='text'>Real Time Ambient Occlusion via ICE II</title><content type='html'>メリークリスマスイブっ！&lt;br /&gt;&lt;br /&gt;すごいひさしぶりにICEをいじってみました。&lt;br /&gt;&lt;br /&gt;以前、WeightMapにしか適用でき無かったAOですが、VertexColorに再現出来る方法が分かったのでやってみました。&lt;br /&gt;&lt;br /&gt;こちらの方のサイトを参考にしました。&lt;br /&gt;&lt;a href="http://coralocean.sakura.ne.jp/2008/09/20080901020653757"&gt;http://coralocean.sakura.ne.jp/2008/09/20080901020653757&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;こちらがICE Tree。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-9eu6tYGM5o/SzNFaRGq3vI/AAAAAAAAAHA/b8nm5A0WqIM/s1600-h/AO.jpg"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 96px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5418751094227132146" border="0" alt="" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/SzNFaRGq3vI/AAAAAAAAAHA/b8nm5A0WqIM/s320/AO.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;では、つたない解説。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_-9eu6tYGM5o/SzODzOU0sPI/AAAAAAAAAHQ/IILKGBolsCs/s1600-h/AO1.jpg"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 302px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5418819692698841330" border="0" alt="" src="http://2.bp.blogspot.com/_-9eu6tYGM5o/SzODzOU0sPI/AAAAAAAAAHQ/IILKGBolsCs/s320/AO1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;まず、初めに、ポイントごとに必要なランダムベクトルを作るために配列を用意します。&lt;br /&gt;0～1までの、配列を作れるとわかりやすくていいかもです。&lt;br /&gt;5個の配列なら&lt;br /&gt;&lt;br /&gt;[ 0, 0.25, 0.5, 0.75, 1 ]&lt;br /&gt;&lt;br /&gt;って感じ。&lt;br /&gt;一番左端のIntegerノードがランダムベクトルの数になります。&lt;br /&gt;この数字を増やせば増やすほど高精細な結果になるけど、重くなるってところです。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_-9eu6tYGM5o/SzOE7RJmu_I/AAAAAAAAAHY/sIcDdlEDBN4/s1600-h/AO2.jpg"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 212px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5418820930407676914" border="0" alt="" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/SzOE7RJmu_I/AAAAAAAAAHY/sIcDdlEDBN4/s320/AO2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;次は、キレイにならんでいる配列にランダム感を与えます。&lt;br /&gt;&lt;br /&gt;ランダムノードは、一律に同じ値が入ってしまうので、使えません。&lt;br /&gt;なので、Modulo（剰余）を使ってちょっと細工をします。&lt;br /&gt;入ってきた配列に対して、適当な値を掛け算します。この値は、整数では駄目です。&lt;br /&gt;&lt;br /&gt;123.4818&lt;br /&gt;&lt;br /&gt;などのような値が好ましいようです。1でModuloするので少数が入ってりゃいいです。&lt;br /&gt;欲しいのは、半球のランダムベクトルなので、XとZだけ、レンジを-1～1にします。&lt;br /&gt;Yは、0～1までです。&lt;br /&gt;&lt;br /&gt;最後に、Point毎にNormalの方向にProject Vectorを使ってランダムベクトルを向けます。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_-9eu6tYGM5o/SzOGr6q50jI/AAAAAAAAAHg/3qW_TYe2igM/s1600-h/AO3.jpg"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 215px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5418822865698542130" border="0" alt="" src="http://2.bp.blogspot.com/_-9eu6tYGM5o/SzOGr6q50jI/AAAAAAAAAHg/3qW_TYe2igM/s320/AO3.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Scalar to 3D Vector をプレビューすると、こんなベクトルの花が咲きました。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_-9eu6tYGM5o/SzOI4XJWXeI/AAAAAAAAAHo/bw-rkOV8i8k/s1600-h/AO4.jpg"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 246px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5418825278524120546" border="0" alt="" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/SzOI4XJWXeI/AAAAAAAAAHo/bw-rkOV8i8k/s320/AO4.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;次は、このベクトルフラワーをPointごとに配置して、このベクトルが、自分自身に突き刺さるかを判定するのに、Raycastを使います。遮蔽率を求めるためです。&lt;br /&gt;PointPositionに、PointNormalをちょっと加えているのは、フラワーをサーフェイスから少し浮かすためです。&lt;br /&gt;でないと、まったいらな平面でも遮蔽してしまうことになってしまうからです。&lt;br /&gt;Dirtmapは実はそこが弱点だったりしますが・・・。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_-9eu6tYGM5o/SzOKtCTv9OI/AAAAAAAAAHw/8oacc5rRMig/s1600-h/AO5.jpg"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 214px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5418827282975290594" border="0" alt="" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/SzOKtCTv9OI/AAAAAAAAAHw/8oacc5rRMig/s320/AO5.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ベクトルがヒットしたか否かの配列の平均を取ることで、そのPointの遮蔽率を出します。&lt;br /&gt;Gradientノードに一度さして、PointColorに焼き込みます。&lt;br /&gt;その後、改めてVertexColorにさします。&lt;br /&gt;直接させないのが、なんで？って感じなんですけど・・・。&lt;br /&gt;教えて欲しいものです。&lt;br /&gt;&lt;br /&gt;以上でざーっとですが、ICE Treeの解説でした。&lt;br /&gt;&lt;br /&gt;もっといろいろやりたいんですが、いかんせんアルゴリズムが分かりません。&lt;br /&gt;数学Iしかやってないのが、ここに来て響いたなぁ（笑）&lt;br /&gt;&lt;br /&gt;ま、自業自得ですねー。もっと勉強します。&lt;br /&gt;&lt;br /&gt;そして、ワタクシ、来年より無職になります。&lt;br /&gt;半年くらい仕事しない予定。&lt;br /&gt;だけど、ブログはちまちまやっていこうかなと思ってます。&lt;br /&gt;&lt;br /&gt;では、早いですが良いお年をお過ごしください。&lt;br /&gt;&lt;br /&gt;来年も良い年でありますように。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-8282235303512951335?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/8282235303512951335/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=8282235303512951335' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8282235303512951335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8282235303512951335'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2009/12/real-time-ambient-occlusion-via-ice-ii.html' title='Real Time Ambient Occlusion via ICE II'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-9eu6tYGM5o/SzNFaRGq3vI/AAAAAAAAAHA/b8nm5A0WqIM/s72-c/AO.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-1539770588752793406</id><published>2009-09-19T14:49:00.008+09:00</published><updated>2011-09-17T13:21:28.125+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hair'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='Deformation'/><title type='text'>ヘアースタイリング　－　Hair2Curve</title><content type='html'>ヘアースタイリングツールを作ってみました。&lt;br /&gt;初めに断っておきますが、このツールは、&lt;strong&gt;&lt;span style="color: red; font-size: 180%;"&gt;スクリプテッドオペレータ&lt;/span&gt;&lt;/strong&gt;を使用しています。&lt;br /&gt;で、そのスクリプテッドオペレータが存在している状態で、保存すると&lt;span style="color: red; font-size: 180%;"&gt;&lt;strong&gt;二度とデータは復帰出来ません&lt;/strong&gt;&lt;/span&gt;。&lt;br /&gt;という超危険な仕様なので、使い方は気をつけてくださいｗ&lt;br /&gt;保存するときは、ヘアについてる、Hair2Curveをすべて消してからにしましょう。&lt;br /&gt;&lt;br /&gt;使い方は、下記画像さんしょ。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_-9eu6tYGM5o/SrR4KEXM42I/AAAAAAAAAGw/5XnFOCBzViw/s1600-h/H2C.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5383059568979665762" src="http://3.bp.blogspot.com/_-9eu6tYGM5o/SrR4KEXM42I/AAAAAAAAAGw/5XnFOCBzViw/s320/H2C.jpg" style="cursor: hand; height: 238px; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ヘアを選択して実行するやつ&lt;br /&gt;&lt;strong&gt;Hair2Curve.pys&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[#---------------------------------------------------app=Application;log=app.LogMessage;sel=app.Selectionimport win32com.client#---------------------------------------------------if sel.Count==0 or sel(0).type!="hair": raisesCode = """from win32com.client.dynamic import Dispatch as ddef Hair2Curve_Update(ctx,OutPrim,InPrim): oCrvCol = InPrim.Value.Geometry.Curves lHairPos = [[],[],[]] for oCrv in oCrvCol:  for fHairPer in [f/13.000*99.999+0.001 for f in range(14)]:   vPos = d(oCrv.EvaluatePositionFromPercentage(fHairPer)[0])   lHairPos[0].append(vPos(0))   lHairPos[1].append(vPos(1))   lHairPos[2].append(vPos(2)) OutPrim.Value.GetGeometry2(ctx.CurrentFrame).Points.PositionArray = lHairPos"""oCrvCol = win32com.client.Dispatch("XSI.Collection")for oHair in sel: oHair.AllowStretch.Value = True lPos=[[f for f in l] for l in oHair.ActivePrimitive.Geometry.Points.PositionArray] iStrNmb=len(lPos[0])/14 lPos.append(list([1])*len(lPos[0])) oCrv = oHair.Parent.AddNurbsCurveList() for i in range(iStrNmb):  oCrv.ActivePrimitive.Geometry.AddCurve(   [ lPos[0][i*14:i*14+14],    lPos[1][i*14:i*14+14],    lPos[2][i*14:i*14+14],    lPos[3][i*14:i*14+14] ],   range(14),   False,   1,   1  ) oFitCrvOp = app.ApplyGenOp("CrvFit", "", oCrv, 3, "siPersistentOperation", "siKeepGenOpInputs", "")(0) oFitCrvOp.points.Value = 3 log(oFitCrvOp.Parent3DObject) oFitCrv = oFitCrvOp.Parent3DObject oHair.Parent.AddChild(oFitCrv) oTransfo = oHair.Kinematics.Global.Transform oFitCrv.Kinematics.Global.Transform = oTransfo app.FreezeModeling(oFitCrv) app.DeleteObj(oCrv) #app.ToggleVisibility(oFitCrv) oCrvCol.Add(oFitCrv) app.Refresh() oOpr = oHair.ActivePrimitive.AddScriptedOp(sCode,oFitCrv.ActivePrimitive,"Hair2Curve","Python",1) sel.SetAsText(oCrvCol.GetAsText())]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;そんでもって、Hair2CurveOpを消すスクリプトは、これです。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;FreezeHair2Curve.pys&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type='syntaxhighlighter' class='brush: python'&gt;&lt;![CDATA[#---------------------------------------------------app=Application;log=app.LogMessage;sel=app.Selectionimport win32com.clientfrom win32com.client import constants as cfrom win32com.client.dynamic import Dispatch as d#---------------------------------------------------app.ActivateObjectSelTool()oHairPrimCol = app.FindObjects("","{D5C3CDBA-B361-4A11-9582-91DBA0ECBB49}")for oPrim in oHairPrimCol: oOp = oPrim.NestedObjects("Hair2Curve") if oOp:  log(oOp)  oCrv = d(oOp).InputPorts(0).target2.Parent3DObject  app.FreezeObj(oPrim.Parent3DObject)  app.DeleteObj(oCrv)]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;いやいや、おっかねぇスクリプトですね。&lt;br /&gt;会社でなんて使わせられません。&lt;br /&gt;&lt;br /&gt;そもそも、Hairにスクリプテッドオペレータが適用出来ないXSI様が悪いんですけどね。&lt;br /&gt;HairにICE適用出来ないのも悪いですね。&lt;br /&gt;&lt;br /&gt;そいや、Softimage2010を使い始めましたわ。&lt;br /&gt;2010になって、HairにICE適用出来るようになったのかしら。&lt;br /&gt;後でやってみよーっと。&lt;br /&gt;&lt;br /&gt;FaceRobotは、なかなか素晴らしいものがありますね。&lt;br /&gt;顎とか、口まわりとか、目まわりとか。&lt;br /&gt;顔は、モーションキャプチャの場合、Envelopeのほうが断然楽ですな。&lt;br /&gt;ただし、後付け修正したいので、Shapeで加えるとかですかね。&lt;br /&gt;もちろん、移動差分の骨のクリップを並べて、MixerのNormalizeをオフって加算でやるのもいいですね。&lt;br /&gt;どっちも得手不得手があるので、それぞれ選ぶべきですなー。&lt;br /&gt;&lt;br /&gt;データは軽く作れよっ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-1539770588752793406?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/1539770588752793406/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=1539770588752793406' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1539770588752793406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1539770588752793406'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2009/09/hair2curve.html' title='ヘアースタイリング　－　Hair2Curve'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-9eu6tYGM5o/SrR4KEXM42I/AAAAAAAAAGw/5XnFOCBzViw/s72-c/H2C.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-2033306719527700172</id><published>2009-07-26T13:53:00.006+09:00</published><updated>2011-09-17T13:28:13.021+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Sukio Sukio Sukio Python X</title><content type='html'>遂に10回目になりました。&lt;br /&gt;しかし、かなり時間を空けてしまいましたね・・・。&lt;br /&gt;サボタージュ期間が長かったかもです。&lt;br /&gt;でも、海の日にヴぁかんスに行ってきたのでちょっと回復。&lt;br /&gt;さぁ、行きましょうか。&lt;br /&gt;&lt;br /&gt;では、今回は、よく使うPythonの関数を紹介しましょう。&lt;br /&gt;いろいろ便利なものが揃っています。&lt;br /&gt;取りあえずは、こんなのあるなーくらいに思うくらいにしておいて、確かこんなのあったな。&lt;br /&gt;って時に使うのがベストですね。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;map(関数,シーケンス)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;これは、シーケンスのひとつずつのアイテムを関数にかまします。&lt;br /&gt;戻り値は、関数のreturn値を介してリストで戻します。&lt;br /&gt;&lt;br /&gt;mapを使ったもの&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[def fct(p):    return plRtn = map(fct,range(10000000))]]&gt;&lt;/script&gt;&lt;br /&gt;for文を使ったもの&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[lRtn = list()for i in range(10000000):    lRtn.append(i)]]&gt;&lt;/script&gt;&lt;br /&gt;内容はほぼ一緒です。(あんまり意味の無いサンプルのサンプルですが・・・）&lt;br /&gt;ただmapを使ったほうがちょびっとだけ早く動作するみたいですね。&lt;br /&gt;XSIでの使い方は、大量のオブジェクトがあったとして、そのひとつひとつに同じ関数をかましたいときに使います。&lt;br /&gt;例えば、null群があって、そのsizeを0.1にしてさらに形状をBoxにしたいときは&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[def SetDefaultNull(pObj):    pObj.size.Value = 0.1    pObj.primary_icon.Value = 4map(SetDefaultNull,Application.Selection)]]&gt;&lt;/script&gt;&lt;br /&gt;こんな風に使います。&lt;br /&gt;やりたいことをファンクションにしておいて、シーケンスをかます。&lt;br /&gt;とてもシンプルに書けます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #ff6600;"&gt;enumerate(シーケンス)&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;enumerateは、for文と共に使います。&lt;br /&gt;インデックスとアイテムを同時に発生させることが出来ます。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #ff6600;"&gt;for&lt;/span&gt;&lt;/strong&gt; i,o &lt;strong&gt;&lt;span style="color: #ff6600;"&gt;in&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="color: #ff6600;"&gt;enumerate&lt;/span&gt;&lt;/strong&gt;(list):&lt;br /&gt;&lt;br /&gt;iにインデックスが入って、oにリストの中身が入ります。&lt;br /&gt;for文だけでリストなどを回すとリストに入っているアイテムしか取得出来ず、それが何番目のオブジェクトなのかは分かりません。&lt;br /&gt;使いどころは例えば、envelopeのweightsとdeformersをシンクロしたいときに効果を発揮します。weightsは、デフォーマの順番に各ポイントが割り振られている2次元配列で戻って来ます。&lt;br /&gt;&lt;br /&gt;((0.0,50.0,100.0),(100.0,50.0,0.0))←こんな感じに。&lt;br /&gt;&lt;br /&gt;つまり、weightsの0番目に処理しているときに、deformersの0番目を取得したいときなどに使えますね。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[import win32com.clientapp=Application;log=app.LogMessage;sel=app.SelectionoDfm = sel(0).Envelopes(0).DeformerstWgt = sel(0).Envelopes(0).Weights.ArrayoBoneCol = win32com.client.Dispatch("XSI.Collection")for i,w in enumerate(tWgt):    if max(w):oBoneCol.add(oDfm(i))log(oBoneCol.GetAsText())]]&gt;&lt;/script&gt;&lt;br /&gt;このサンプルは、エンベロープのウェイトが0のオブジェクトを弾くXSICollectionを作成します。&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #ff6600;"&gt;max&lt;/span&gt;&lt;/strong&gt;()も使っていますが後述します。&lt;br /&gt;maxの値が0ってことは、weightがすべて割り振られてない0 weiht bone なので、スルーです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #ff6600;"&gt;sum(シーケンス)&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;リスト、タプルの足し算を返します。&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #ff6600;"&gt;sum&lt;/span&gt;&lt;/strong&gt;(&lt;strong&gt;&lt;span style="color: #ff6600;"&gt;range&lt;/span&gt;&lt;/strong&gt;(10))は、0から9を足しているので45を返します。&lt;br /&gt;ただし、数字しか受け付けません。文字列の場合は、joinを使いましょう。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[",".join(string_list)]]&gt;&lt;/script&gt;&lt;br /&gt;よく使うとか言っておきながらサンプルを思いつけませんでした(ｷﾞｬﾎﾞﾝﾇ)&lt;br /&gt;うーん。使わないかなw&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #ff6600;"&gt;max(シーケンス),min(シーケンス)&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;maxは、リストなどの最大値を取得。minは、同様に最小値取得です。&lt;br /&gt;FCurveの最大値とか取れそうですね（取ったこと無いけど・・・）&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[app=Application;log=app.LogMessage;sel=app.Selectionlog(max([k.Value for k in sel(0).posy.Source.Keys]))]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #ff6600;"&gt;open(ファイルパス,モード(読み取りとか書き込みとか))&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;結構良く使います。&lt;br /&gt;weight情報を吐き出したり、ログファイルを生成したいときとか、テキスト情報を読みに行ったりとか。&lt;br /&gt;読み込みたいときはコレです。stripは、末尾の改行を示す"\n"を取り除いてくれます。&lt;br /&gt;pathになんか入れてください。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[app=Application;log=app.LogMessagef=open(path,"r")while 1:    s = f.readline()    if not s:break    log(s.strip())f.close()]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;逆に書き込みたいときは&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[app=Application;log=app.LogMessage;sel=app.Selectionf=open(path,"w")f.write(sel.GetAsText())f.close()]]&gt;&lt;/script&gt;&lt;br /&gt;pathになんかパス。選択したもののリストを書き出します。&lt;br /&gt;と、Openには、いろいろあるんですが、使うのはこれくらいで十分じゃないでしょうかね。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;今回は、こんな感じです。&lt;br /&gt;だいぶ、Pythonの海泳げるようになって来たんじゃないでしょうか？&lt;br /&gt;そいや、初心者の講座って始めたんですが、全然初心者向けにならなくなってきた感じですよね。&lt;br /&gt;一度初心者の道を通り終わると、初心にかえるのが難しいことを意味しているんですが、ということは、ワタクシもまだまだひよっこなんだなぁと思い知らされます。&lt;br /&gt;&lt;br /&gt;絶えずもどかしい。ああもどかしい。もどかしい。&lt;br /&gt;&lt;br /&gt;でも、ライブラリとして、とって置けたのでなんとなくはいいかな。と。&lt;br /&gt;完全なる自己満足。&lt;br /&gt;&lt;br /&gt;ってなわけで、次回は、HairをCurveに変換するPythonでも公開しましょうかね。&lt;br /&gt;Curveに変換して、Scripted Operatorにつなぎます。&lt;br /&gt;すると、Curveで、Hairをスタイリング出来ます。&lt;br /&gt;&lt;br /&gt;Softimageは、Hairスタイリングツールは、開発者のためにあるようなものですから、ちょっとは楽にしてほしいところなんですけどねぇ・・・。&lt;br /&gt;とはいえ、この辺は難しいところですから、デザイナーがどう使うかにかかっているのですが。&lt;br /&gt;&lt;br /&gt;では、近々公開しますね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-2033306719527700172?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/2033306719527700172/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=2033306719527700172' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/2033306719527700172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/2033306719527700172'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2009/07/sukio-sukio-sukio-python-x.html' title='Sukio Sukio Sukio Python X'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-6445171474177936347</id><published>2009-04-06T16:54:00.004+09:00</published><updated>2011-09-17T13:33:03.732+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Sukio Sukio Sukio Python - IX</title><content type='html'>さて、9回目です。&lt;br /&gt;ちょっと難しい問題に取り組んでいきます。&lt;br /&gt;&lt;br /&gt;それでは、正規表現2回目。&lt;br /&gt;defを用いた置換を紹介します。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[app = Application;log = app.LogMessageimport redef repl(m):  dictRepl = {    "Model":"A",    "Model1":"B",    "Model2":"C",    "sphere":"maru"  }  try:    return dictRepl[m.group()]  except:    return m.group()for oObj in app.Selection:  s = "%s -&gt; %s"%( oObj.FullName,re.sub("\w+",repl,oObj.FullName) )  log(s)]]&gt;&lt;/script&gt;&lt;br /&gt;こんな感じの時に実行しています。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_-9eu6tYGM5o/Sdm2khUXiAI/AAAAAAAAAGI/jHVxnDsc9_4/s1600-h/replaceExpl.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5321485173250295810" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/Sdm2khUXiAI/AAAAAAAAAGI/jHVxnDsc9_4/s320/replaceExpl.jpg" style="cursor: pointer; height: 320px; width: 242px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;このコードは、辞書を使ったパターン置換です。&lt;br /&gt;&lt;br /&gt;dictRepl = {&lt;br /&gt;&amp;nbsp;"Model":"A",&lt;br /&gt;&amp;nbsp;"Model1":"B",&lt;br /&gt;&amp;nbsp;"Model2":"C",&lt;br /&gt;&amp;nbsp;"sphere":"maru"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;この辞書の部分で、&lt;br /&gt;&lt;br /&gt;Model 　→　A&lt;br /&gt;Model1　→　B&lt;br /&gt;Model2　→　C&lt;br /&gt;sphere　→　maru&lt;br /&gt;&lt;br /&gt;という置換の定義をする事にしています。&lt;br /&gt;法則というか決まりごとですね。&lt;br /&gt;&lt;br /&gt;そして、置換するメソッドとしてsubを使用しています。&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;re&lt;/span&gt;.&lt;span style="color: #ff6600; font-weight: bold;"&gt;sub&lt;/span&gt;("\w+",repl,oObj.&lt;span style="color: #009900; font-weight: bold;"&gt;FullName&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;第1引数は、拾うパターン。&lt;br /&gt;第2引数は、置換する文字列。またはファンクション。&lt;br /&gt;第3引数は、置換する対象です。&lt;br /&gt;&lt;br /&gt;第1引数の　\w+&lt;br /&gt;これは、[A-Za-z0-9_]と同じになります。&lt;br /&gt;A～Z、a～z、0～9と_にヒットします。&lt;br /&gt;つまり、XSIの場合"."ドットまで、ひとくくりです。&lt;br /&gt;&lt;br /&gt;第2引数は　repl&lt;br /&gt;通常は文字列ですが、defを使用出来ます。&lt;br /&gt;上記は、replファンクションが入ります。&lt;br /&gt;このファンクションには、引数として、マッチオブジェクトが入る事になっています。&lt;br /&gt;1でヒットしたマッチオブジェクトです。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;return&lt;/span&gt; dictRepl[m.&lt;span style="color: #ff6600; font-weight: bold;"&gt;group&lt;/span&gt;()]&lt;br /&gt;&lt;br /&gt;そして、上記replのmに引数が渡され、辞書の値を返します。&lt;br /&gt;&lt;br /&gt;例えばこのようにキーを入力すると、値を取ることが出来ます。&lt;br /&gt;dictRepl["Model"] -&amp;gt; "A"&lt;br /&gt;&lt;br /&gt;Model　なら　A　が返ってきます。&lt;br /&gt;&lt;br /&gt;それと、新たにtry except文を入れてみました。&lt;br /&gt;これは、エラーを吐いても例外に飛ぶことが出来る文です。&lt;br /&gt;try内で、エラーが発生したら、except（例外）に飛びます。&lt;br /&gt;マッチオブジェクトが、Model3というものにヒットした場合、無い辞書のキーを取ってしまうとエラーになります。&lt;br /&gt;&lt;br /&gt;dictRepl["Model3"]&lt;br /&gt;&lt;br /&gt;これは、エラーですので、回避して何も変換しないという&lt;br /&gt;&lt;br /&gt;m.&lt;span style="color: #ff6600; font-weight: bold;"&gt;group&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;を返すことにしています。&lt;br /&gt;&lt;br /&gt;今回は、あまり利用価値が無いものかもですが、一応メモ的な感じです。&lt;br /&gt;応用としては、ターゲットの指定のときに役に立つかなぁとも思ってます。&lt;br /&gt;コンストとか、Definition指定するの面倒ですものね。&lt;br /&gt;&lt;br /&gt;とはいえ、正規表現はこの位で終わりますね。&lt;br /&gt;そういえば、JScriptでも同じようなことが出来ますから、別にPythonでなくてもいいんですけどね。&lt;br /&gt;連想配列で検索です。&lt;br /&gt;VBは知りません。&lt;br /&gt;&lt;br /&gt;ではでは。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-6445171474177936347?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/6445171474177936347/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=6445171474177936347' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/6445171474177936347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/6445171474177936347'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2009/04/sukio-sukio-sukio-python-ix.html' title='Sukio Sukio Sukio Python - IX'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-9eu6tYGM5o/Sdm2khUXiAI/AAAAAAAAAGI/jHVxnDsc9_4/s72-c/replaceExpl.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-4059149272267924649</id><published>2009-02-16T18:19:00.006+09:00</published><updated>2011-09-17T13:33:47.895+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Sukio Sukio Sukio Python - VIII</title><content type='html'>第8回目は、正規表現に行きたいと思います。&lt;br /&gt;正規表現は、とても難しいですので、ワタクシも全て理解しているとは言いがたいです。&lt;br /&gt;ですが、少しでも学ぶことが出来れば、強力なツールになること間違いなしです。&lt;br /&gt;正規表現は、パターンマッチをするには、最強です。&lt;br /&gt;では、そのほんのちょっとしたさわりをご紹介します。&lt;br /&gt;&lt;br /&gt;例えば、duplicateなどした場合には、cube1など、お尻に数字が入ります。&lt;br /&gt;さらに100個くらい増やした後、幾つかのcubeをABCやguideなどと数字は生かしたままりネームしてしまったとします。&lt;br /&gt;最悪な事に、幾つかのオブジェクトはDeleteしてあります。&lt;br /&gt;その後、そのオブジェクト達の番号に対応するnullを用意しなくてはならない場合があるとします。&lt;br /&gt;さらに、nullをリグとするposeコンストをしたいです。&lt;br /&gt;cubeとABCとguideは、番号続きであるもののごちゃ混ぜ。&lt;br /&gt;さらにnullには、その番号に対応した数字を入れなくてはなりません。&lt;br /&gt;&lt;br /&gt;cube1&lt;br /&gt;guide3&lt;br /&gt;ABC24&lt;br /&gt;cube54&lt;br /&gt;guide98&lt;br /&gt;ABC145&lt;br /&gt;cube203&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;数字を取得するのなら、cubeやABCやguideを抜いたら良いですね。&lt;br /&gt;ですが、この場合の発想は逆で、数字だけを抜き取ります。&lt;br /&gt;こういったときには、正規表現を使うのが一番です。&lt;br /&gt;&lt;br /&gt;まず、正規表現を使うことが出来るreモジュールをインポートします。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;import&lt;/span&gt; re&lt;br /&gt;&lt;br /&gt;これで、reモジュールを使うことが出来ます。&lt;br /&gt;reには幾つかのメソッドが存在します。&lt;br /&gt;まずは、&lt;span style="color: #ff6600; font-weight: bold;"&gt;compile&lt;/span&gt;。&lt;br /&gt;パターンオブジェクトを作成します。&lt;br /&gt;&lt;br /&gt;reD = &lt;span style="color: #ff6600; font-weight: bold;"&gt;re&lt;/span&gt;.&lt;span style="color: #ff6600; font-weight: bold;"&gt;compile&lt;/span&gt;(r'\d+$')&lt;br /&gt;&lt;br /&gt;\d+&lt;br /&gt;&lt;br /&gt;ここで使われている特殊な文字『\d』は数字を意味します。&lt;br /&gt;digitのdですね。&lt;br /&gt;+を付けると、0や567など1以上の複数にマッチします。&lt;br /&gt;&lt;br /&gt;$&lt;br /&gt;&lt;br /&gt;これは、末尾を意味します。&lt;br /&gt;&lt;br /&gt;\d+$&lt;br /&gt;&lt;br /&gt;としておけば、末尾が数字のものという意味になります。&lt;br /&gt;次にパターンにひっかかるかどうかのマッチオブジェクトを作成します。&lt;br /&gt;ここで&lt;span style="color: #ff6600; font-weight: bold;"&gt;search&lt;/span&gt;を使います。&lt;br /&gt;&lt;br /&gt;m = reD.&lt;span style="color: #ff6600; font-weight: bold;"&gt;search&lt;/span&gt;('cube54')&lt;br /&gt;&lt;br /&gt;mにマッチオブジェクトが入りました。&lt;br /&gt;そして、実際にマッチングしている文字列を取り出すには&lt;br /&gt;&lt;br /&gt;m.&lt;span style="color: #ff6600; font-weight: bold;"&gt;group&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;とします。&lt;br /&gt;これで&lt;br /&gt;&lt;br /&gt;54&lt;br /&gt;&lt;br /&gt;が取得出来ます。&lt;br /&gt;選択して、それに対応するnullを作成しposeコンストするにはこんな感じにします。&lt;br /&gt;&lt;br /&gt;&lt;script type='syntaxhighlighter' class='brush: python'&gt;&lt;![CDATA[import reapp = Applicationlog = app.LogMessagereD = re.compile(r'\d+')for oObj in app.Selection: m = reD.search(oObj.Name)  if m:   oNull = app.ActiveSceneRoot.AddNull('null%s'%m.group())   oObj.Kinematics.AddConstraint('pose',oNull)]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;これにより、数字に対応したnullがposeコンスト付きで出来ることでしょう。&lt;br /&gt;&lt;br /&gt;もう少し複雑にしましょう。&lt;br /&gt;例えば、カメラモデル名にシーン番号カット番号イン点アウト点などを表記させておきます。&lt;br /&gt;&lt;br /&gt;s021c156_Camera_231_310&lt;br /&gt;&lt;br /&gt;このパターンは、かなりの数に上ります。&lt;br /&gt;通常の考え方で、カット番号を取得したい場合は&lt;br /&gt;カメラのモデルをoCamMdlとした場合&lt;br /&gt;&lt;br /&gt;oCamMdl.&lt;span style="color: #009900; font-weight: bold;"&gt;Name&lt;/span&gt;[5:8]&lt;br /&gt;&lt;br /&gt;とすれば『156』を取得出来ます。&lt;br /&gt;しかし、こうなればどうでしょう？&lt;br /&gt;&lt;br /&gt;s1c56_Camera_231_310&lt;br /&gt;&lt;br /&gt;『_Ca』が取得されてしまいます。&lt;br /&gt;これではあまりに情けないので、正規表現を使って取得してみることにしましょう。&lt;br /&gt;&lt;br /&gt;パターンオブジェクトを作成します。&lt;br /&gt;&lt;br /&gt;reCam = re.&lt;span style="color: #ff6600; font-weight: bold;"&gt;compile&lt;/span&gt;(r'(s)(\d+)(c)(\d+)(_Camera_)(\d+)(_)(\d+)')&lt;br /&gt;&lt;br /&gt;()を付けるとくくられて、グルーピングされます。これは、後述します。&lt;br /&gt;上記を日本語で書くとこんな感じでしょうか。&lt;br /&gt;&lt;br /&gt;(sにマッチ)(数字にマッチ,+で複数も可)(cにマッチ)(数字にマッチ,+で複数も可)(_Camera_にマッチ)(数字にマッチ,+で複数も&lt;br /&gt;&lt;br /&gt;可)(_にマッチ)(数字にマッチ,+で複数も可)&lt;br /&gt;&lt;br /&gt;次に、パターンオブジェクトに対して、実際に判定する文字列を入れマッチオブジェクトを作成してみます。&lt;br /&gt;&lt;br /&gt;reCam = re.&lt;span style="color: #ff6600; font-weight: bold;"&gt;compile&lt;/span&gt;(r'(s)(\d+)(c)(\d+)(_Camera_)(\d+)(_)(\d+)')&lt;br /&gt;m = reCam.&lt;span style="color: #ff6600; font-weight: bold;"&gt;search&lt;/span&gt;('s021c156_Camera_231_310')&lt;br /&gt;&lt;br /&gt;mにマッチオブジェクトが入りました。&lt;br /&gt;そして、実際にマッチングしている文字列を取り出すには&lt;br /&gt;&lt;br /&gt;m.&lt;span style="color: #ff6600; font-weight: bold;"&gt;group&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;とします。&lt;br /&gt;これで&lt;br /&gt;&lt;br /&gt;s021c156_Camera_231_310&lt;br /&gt;&lt;br /&gt;が取得出来ます。&lt;br /&gt;ここまではあまり意味無いですが今度は&lt;br /&gt;&lt;br /&gt;'Camera_root'&lt;br /&gt;&lt;br /&gt;を入れてみます。&lt;br /&gt;&lt;br /&gt;m = reCam.&lt;span style="color: #ff6600; font-weight: bold;"&gt;search&lt;/span&gt;('Camera_root')&lt;br /&gt;m.&lt;span style="color: #ff6600; font-weight: bold;"&gt;group&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;これはエラーになってしまいます。&lt;br /&gt;パターンにひっかから無かったからです。&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;search&lt;/span&gt;で、パターンにマッチ出来ないと、&lt;span style="color: #ff6600; font-weight: bold;"&gt;None&lt;/span&gt;オブジェクトが返ってくる仕組みになっています。&lt;br /&gt;ですので&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt; m:&lt;br /&gt;m.&lt;span style="color: #ff6600; font-weight: bold;"&gt;group&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;などとすれば、マッチしているかどうか判定出来ます。&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt;で、&lt;span style="color: #ff6600; font-weight: bold;"&gt;None&lt;/span&gt;は、&lt;span style="color: #ff6600; font-weight: bold;"&gt;False&lt;/span&gt;と判定されます。&lt;br /&gt;次に、マッチオブジェクトに対して、&lt;span style="color: #ff6600; font-weight: bold;"&gt;groups&lt;/span&gt;()としてみましょう。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;import&lt;/span&gt; re&lt;br /&gt;app = &lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;&lt;br /&gt;log = app.&lt;span style="color: #009900; font-weight: bold;"&gt;LogMessage&lt;/span&gt;&lt;br /&gt;reCam = re.&lt;span style="color: #ff6600; font-weight: bold;"&gt;compile&lt;/span&gt;(r'(s)(\d+)(c)(\d+)(_Camera_)(\d+)(_)(\d+)')&lt;br /&gt;m = reCam.&lt;span style="color: #ff6600; font-weight: bold;"&gt;search&lt;/span&gt;('s021c156_Camera_231_310')&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt; m:&lt;br /&gt; log(m.&lt;span style="color: #ff6600; font-weight: bold;"&gt;groups&lt;/span&gt;())&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;結果は、()でくくったグルーピングをタプルとして返します。&lt;br /&gt;&lt;br /&gt;('s', '021', 'c', '156', '_Camera_', '231', '_', '310')&lt;br /&gt;&lt;br /&gt;カット番号を取りたい場合は決まって4番目の値をとりたいので&lt;br /&gt;&lt;br /&gt;m.&lt;span style="color: #ff6600; font-weight: bold;"&gt;group&lt;/span&gt;(4)&lt;br /&gt;&lt;br /&gt;とすれば、目的のカット番号&lt;br /&gt;&lt;br /&gt;156&lt;br /&gt;&lt;br /&gt;が取得出来ますね。&lt;br /&gt;&lt;br /&gt;ここでもう少し便利にすることが出来ます。&lt;br /&gt;パターンに名前を付けることが出来たりもします。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;import&lt;/span&gt; re&lt;br /&gt;app = &lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;&lt;br /&gt;log = app.&lt;span style="color: #009900; font-weight: bold;"&gt;LogMessage&lt;/span&gt;&lt;br /&gt;reCam = re.&lt;span style="color: #ff6600; font-weight: bold;"&gt;compile&lt;/span&gt;(r'(s)(?P&amp;lt;scn&amp;gt;\d+)(c)(?P&amp;lt;cut&amp;gt;\d+)(_Camera_)(?P&amp;lt;in&amp;gt;\d+)(_)(?P&amp;lt;out&amp;gt;\d+)')&lt;br /&gt;m = reCam.&lt;span style="color: #ff6600; font-weight: bold;"&gt;search&lt;/span&gt;('s021c156_Camera_231_310')&lt;br /&gt;if m:&lt;br /&gt; log(m.&lt;span style="color: #ff6600; font-weight: bold;"&gt;group&lt;/span&gt;('scn'))&lt;br /&gt; log(m.&lt;span style="color: #ff6600; font-weight: bold;"&gt;group&lt;/span&gt;('cut'))&lt;br /&gt; log(m.&lt;span style="color: #ff6600; font-weight: bold;"&gt;group&lt;/span&gt;('in'))&lt;br /&gt; log(m.&lt;span style="color: #ff6600; font-weight: bold;"&gt;group&lt;/span&gt;('out'))&lt;span style="font-family: Georgia, serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;このように&lt;br /&gt;&lt;br /&gt;(?P&amp;lt;scn&amp;gt;\d+)&lt;br /&gt;&lt;br /&gt;とすればscnという名前から取得出来るようにタグを付けておいて、後で呼び出すときに指定できるようにすることも可能です。&lt;br /&gt;&lt;br /&gt;このように、正規表現は1冊の本として出ることが許されるほど複雑怪奇です。&lt;br /&gt;ですが、webには、沢山の例がありますので、少しずつ覚えて行けばOKです。&lt;br /&gt;使えなくても対した問題にはなりませんが、使えるようになれば、更なる進歩が望めます。&lt;br /&gt;&lt;br /&gt;次回ももう少し正規表現の世界にダイブしてみることにしましょう。&lt;br /&gt;では、しばらくの沈黙の後に。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-4059149272267924649?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/4059149272267924649/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=4059149272267924649' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/4059149272267924649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/4059149272267924649'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2009/02/sukio-sukio-sukio-python-viii.html' title='Sukio Sukio Sukio Python - VIII'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-5616820518512569213</id><published>2009-01-05T23:52:00.002+09:00</published><updated>2011-09-17T13:36:41.986+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Sukio Sukio Sukio Python - VII</title><content type='html'>今年もよろしくおねがいします。&lt;br /&gt;7回目になりました。はじめるときは、ココまで続けると思ってませんでした･･･。&lt;br /&gt;教えるとなるといろいろあるものですね。&lt;br /&gt;そうそう、Pythonのことをもっと勉強しようと思いまして、Pythonクックブックという本を買ってみました。&lt;br /&gt;で・す・が、物凄く難しいですねぇ。&lt;br /&gt;というか、本当に一部分の機能しか使っていないんだなということを、痛感させられます。&lt;br /&gt;Pythonが使用されているのは、多岐多用に渡っていますからそれはそうなんですけどね。&lt;br /&gt;CGで使うのは、本当に基本的な機能だけです。&lt;br /&gt;ですが、基本的な機能さえ覚えてしまえば、ほとんど応用できますね。&lt;br /&gt;あとは、CGのアルゴリズムをPythonに組み込めば、立派なスクリプターになれると思います。&lt;br /&gt;バネ係数とか、波紋の伝達の式とかとかとか。&lt;br /&gt;まだまだ勉強しなくてはならないものは、たくさんあります。&lt;br /&gt;&lt;br /&gt;ではでは、前回の回答からしますね。&lt;br /&gt;モデルの名前は、LR反転することなくオブジェクトの名前だけで反転するコードです。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[import stringapp = Applicationtable = string.maketrans('LR','RL')lSel = list()for oObj in app.Selection:  sMdl = oObj.Model  sName = oObj.Name.encode().translate(table)  lSel.append('%s.%s'%(sMdl,sName))app.Selection.SetAsText(','.join(lSel))]]&gt;&lt;/script&gt;&lt;br /&gt;テキスト処理する際、最速になる傾向は、&lt;span style="font-size: 180%; font-weight: bold;"&gt;分解・変換・結合&lt;/span&gt;です。&lt;br /&gt;細かく割って、変換した後、結合させる。&lt;br /&gt;という方法が、早く動作する傾向にあります。&lt;br /&gt;&lt;br /&gt;for oObj in app.&lt;span style="color: #009900; font-weight: bold;"&gt;Selection&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;この行で、セレクションのリストを順々にoObjに代入します。&lt;br /&gt;選択しているものが&lt;br /&gt;&lt;br /&gt;ROB.IK_Rarm, ROB.IK_Rfoot, ROB.IK_Rhand&lt;br /&gt;&lt;br /&gt;だとすると一番最初に代入されるのは&lt;br /&gt;&lt;br /&gt;ROB.IK_Rarm&lt;br /&gt;&lt;br /&gt;処理が終わって、2番目に代入されるのは&lt;br /&gt;&lt;br /&gt;ROB.IK_Rfoot&lt;br /&gt;&lt;br /&gt;となります。&lt;br /&gt;&lt;br /&gt;sMdl = oObj.&lt;span style="color: #009900; font-weight: bold;"&gt;Model&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;モデルの名前は、変換させたくないので、一度ｓMdlという変数にモデルをキープしておきます。&lt;br /&gt;&lt;br /&gt;ROB.IK_Rarm&lt;br /&gt;&lt;br /&gt;というオブジェクトでしたら、ROBという文字列が入る事になります。&lt;br /&gt;&lt;br /&gt;sName = oObj.&lt;span style="color: #009900; font-weight: bold;"&gt;Name&lt;/span&gt;.&lt;span style="color: #ff6600; font-weight: bold;"&gt;encode&lt;/span&gt;().&lt;span style="color: #ff6600; font-weight: bold;"&gt;translate&lt;/span&gt;(table)&lt;br /&gt;&lt;br /&gt;次にモデルの名前だけ前回のやり方で翻訳します。&lt;br /&gt;上記でしたら&lt;br /&gt;&lt;br /&gt;"IK_Larm"&lt;br /&gt;&lt;br /&gt;に変換されているはずですね。&lt;br /&gt;&lt;br /&gt;lSel = list()&lt;br /&gt;lSel.&lt;span style="color: #ff6600; font-weight: bold;"&gt;append&lt;/span&gt;('%s.%s'%(sMdl,sName))&lt;br /&gt;&lt;br /&gt;一度、for文の前に、lSelという空のリストを作っておきます。&lt;br /&gt;その後、&lt;span style="color: #ff6600; font-weight: bold;"&gt;append&lt;/span&gt;メソッドで、リストに追加します。&lt;br /&gt;その前にPython特有の文字列処理があります。&lt;br /&gt;&lt;br /&gt;'%s.%s'%(sMdl,sName)&lt;br /&gt;&lt;br /&gt;上記の例ですと&lt;br /&gt;&lt;br /&gt;sMdl="ROB"&lt;br /&gt;sName="IK_Larm"&lt;br /&gt;&lt;br /&gt;ですので"."（ドット）が挟まり&lt;br /&gt;&lt;br /&gt;"ROB.IK_Larm"&lt;br /&gt;&lt;br /&gt;になります。&lt;br /&gt;%sに、文字列が次々に代入されるという書き方です。&lt;br /&gt;&lt;br /&gt;sMdl+'.'+sName&lt;br /&gt;&lt;br /&gt;と書きたくなりますが、%sを使った書き方のほうが、高速に動作します。&lt;br /&gt;覚えておいて損は無いですよ。&lt;br /&gt;&lt;br /&gt;'%s'*3%('a','b','c')&lt;br /&gt;&lt;br /&gt;と書けば&lt;br /&gt;&lt;br /&gt;"abc"&lt;br /&gt;&lt;br /&gt;となります。文字列にも掛け算が出来るのもPythonの特徴です。&lt;br /&gt;ひとつの文字列を入れたい場合は、タプルにしなくてもOKです。&lt;br /&gt;&lt;br /&gt;s='XSI'&lt;br /&gt;'I love %s' % s&lt;br /&gt;&lt;br /&gt;↓&lt;br /&gt;&lt;br /&gt;"I love XSI"&lt;br /&gt;&lt;br /&gt;こんな感じですね。&lt;br /&gt;&lt;br /&gt;そして、次々に処理をしていき、リストlSelにappendで追加していきます。&lt;br /&gt;例えば&lt;br /&gt;&lt;br /&gt;lSel=[ "ROB.IK_Larm" ]&lt;br /&gt;lSel.append("ROB.IK_Lfoot")&lt;br /&gt;&lt;br /&gt;↓&lt;br /&gt;&lt;br /&gt;[ "ROB.IK_Larm", "ROB.IK_Lfoot" ]&lt;br /&gt;&lt;br /&gt;こんな感じです。&lt;br /&gt;最後には、内部的には、こんな感じで格納されているはずです。&lt;br /&gt;&lt;br /&gt;[ "ROB.IK_Larm", "ROB.IK_Lfoot", "ROB.IK_Lhand" ]&lt;br /&gt;&lt;br /&gt;最後にリストを単一の文字列に結合です。&lt;br /&gt;&lt;br /&gt;app.&lt;span style="color: #009900; font-weight: bold;"&gt;Selection&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;SetAsText&lt;/span&gt;(','.join(lSel))&lt;br /&gt;&lt;br /&gt;string.join(list）という形で、listの間にstringを挟んで行ってね。&lt;br /&gt;と命令します。&lt;br /&gt;上記は、リストの間に、','を挟みます。結果は&lt;br /&gt;&lt;br /&gt;"ROB.IK_Larm,ROB.IK_Lfoot,ROB.IK_Lhand"&lt;br /&gt;&lt;br /&gt;という単一の文字列になり、app.&lt;span style="color: #009900; font-weight: bold;"&gt;Selection&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;SetAsText&lt;/span&gt;でテキスト通りに選択しなさいという命令文で完成です。&lt;br /&gt;&lt;br /&gt;モデルが無い場合でも、Scene_Rootというモデルがあるので、安全に動作するはずです。&lt;br /&gt;しかし、まだまだ落とし穴はあるもので、NameにもLRが入っているものには、使うことが出来ません・・・。&lt;br /&gt;例えば&lt;br /&gt;&lt;br /&gt;ROB.ArmOffset_Rot_R&lt;br /&gt;&lt;br /&gt;だとか&lt;br /&gt;&lt;br /&gt;ROB.ROB_Rarm&lt;br /&gt;&lt;br /&gt;など名前を付けられてしまうともうお手上げですね。&lt;br /&gt;なので、名前の仕様を決めたほうがいいでしょう。&lt;br /&gt;LR以外は小文字でお願いね。とかですね。&lt;br /&gt;&lt;br /&gt;という感じで、今年もがんばって更新したいと思います。&lt;br /&gt;もうそろそろネタ切れかなーと思いきや、実はまだあったりするのでちょっと難しいところに行ってみたいと思います。&lt;br /&gt;正規表現をちょろりと。&lt;br /&gt;これは、本当に難しいので、一度では全然理解できないと思いますが、少しでも使えるようになるとかなり強力な力を発揮するので、少しずつ覚えておくのが、◎です。&lt;br /&gt;いろいろなサイトもありますが、まずはさわりだけやりたいと思います。&lt;br /&gt;&lt;br /&gt;ではでは、しばらくの時を経て、次回をおたのしみに☆&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-5616820518512569213?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/5616820518512569213/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=5616820518512569213' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/5616820518512569213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/5616820518512569213'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/12/sukio-sukio-sukio-python-vii.html' title='Sukio Sukio Sukio Python - VII'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-3825383850435156118</id><published>2008-12-10T19:10:00.007+09:00</published><updated>2010-02-06T19:21:26.827+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Sukio Sukio Sukio Python - VI</title><content type='html'>さてさて、6回目です。&lt;br /&gt;大分経ちましたが、いかがお過ごしでしょうか？&lt;br /&gt;最近、サボっている気がしますね･･･。&lt;br /&gt;忙しいと思ってくださいね。&lt;br /&gt;更新がんばります！&lt;br /&gt;とはいいつつ、今年最後の更新な気がしますね･･･。&lt;br /&gt;&lt;br /&gt;そういえば、読んでますメールを初めて戴きました。&lt;br /&gt;ウレシイデスー。&lt;br /&gt;見てくれる人がいらして感謝ですね。&lt;br /&gt;（某Pさんありがとうございます）&lt;br /&gt;これからも精進いたしますね。&lt;br /&gt;&lt;br /&gt;では本題に入りましょう。&lt;br /&gt;やっとか、という感じですが、とうとうPythonの使い方に入ります。&lt;br /&gt;いままでは、XSIの使い方しかご紹介してませんでしたので序の口です。&lt;br /&gt;でも、ワタクシもPythonは、初歩的な使い方にとどまっていますが&lt;br /&gt;Stringでの簡略の指定法、Listの使い方、強力なモジュール群、などなど紹介したいと思います。&lt;br /&gt;&lt;br /&gt;Pythonでは、Stringの指定も楽々に行えます。&lt;br /&gt;全てを解説すると、1回で終わらなくなってしまうので、良く使うやつをざっくり抜き出して使ってみますね。&lt;br /&gt;&lt;br /&gt;例えば、人骨には左右が存在します。&lt;br /&gt;右手の骨、'IK_Rhand'というオブジェクトを選択して&lt;br /&gt;対応する左手の骨'IK_Lhand'を取得したいときどうすれば良いでしょうか？&lt;br /&gt;そして、ほかの名前にも対応する書き方はどうすれば良いでしょう？&lt;br /&gt;&lt;br /&gt;回答は、LとRが対応しているものを探せば良いのです。&lt;br /&gt;&lt;br /&gt;Rを選択していて、実行したらそれに対応するLを選択するというものを書いてみます。&lt;br /&gt;&lt;br /&gt;こんな感じでしょうか。&lt;br /&gt;&lt;br /&gt;app = &lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Application&lt;/span&gt;&lt;br /&gt;sSel = app.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;GetAsText&lt;/span&gt;()&lt;br /&gt;app.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;SetAsText&lt;/span&gt;(sSel.&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;replace&lt;/span&gt;('R','L'))&lt;br /&gt;&lt;br /&gt;これだけで、選択が全てL側に移ると思います。&lt;br /&gt;少々脱線してしまいますが、良く使う&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;をちょっとだけ解説しますね。&lt;br /&gt;&lt;br /&gt;『&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;オブジェクトは、アプリケーションのグローバルセレクションです。』&lt;br /&gt;&lt;br /&gt;とマニュアルには、書いてありますが、なんのこっちゃ良く分かりませんが、&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;は、XSI特有のオブジェクトです。&lt;br /&gt;mayaやMotionBuilderなどの主要ソフトは、オブジェクトごとにSelectフラグというものが用意されているのですが、XSIは、&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;という変数に属しているものが選択されるというちょっと一風変わった仕様なのです。&lt;br /&gt;ようするに、&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;にオブジェクトをぶち込めばSelect状態になります。逆に空にすれば全て選択が外れます。&lt;br /&gt;変な感じですが、意外と使いやすいです。&lt;br /&gt;この説明でも良く分からないかもしれませんが、String解説に戻ります。&lt;br /&gt;&lt;br /&gt;sSel = app.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;GetAsText&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;これで、String型としてsSelに入れます。&lt;br /&gt;どういう形で返るかというと&lt;br /&gt;&lt;br /&gt;null&lt;br /&gt;null1&lt;br /&gt;null2&lt;br /&gt;&lt;br /&gt;と選択していたら&lt;br /&gt;&lt;br /&gt;"null,null1,null2"&lt;br /&gt;&lt;br /&gt;といった具合に返ってきます。&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;LogMessage&lt;/span&gt;は、Stringしか受け付けませんから、エラーチェックのときは、GetAsText()を多用します。&lt;br /&gt;&lt;br /&gt;app.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;SetAsText&lt;/span&gt;(sSel.&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;replace&lt;/span&gt;('R','L'))&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;SetAsText&lt;/span&gt;は、&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;をStringに書かれている通りに選択します。&lt;br /&gt;そして文字列メソッドの&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;replace&lt;/span&gt;を使いRからLに変えています。&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;replace&lt;/span&gt;は、置換です。&lt;br /&gt;&lt;br /&gt;'IK_Rhand,IK_Rarm'&lt;br /&gt;&lt;br /&gt;でしたら&lt;br /&gt;&lt;br /&gt;'IK_Lhand,IK_Larm'&lt;br /&gt;&lt;br /&gt;に置き換えます。&lt;br /&gt;&lt;br /&gt;けれども、これだけでは、Lを選択してもRに行きません。寂しいです。&lt;br /&gt;ですので&lt;br /&gt;&lt;br /&gt;Lを選択のときは、Rを選択する。&lt;br /&gt;Rを選択のときは、Lを選択する。&lt;br /&gt;&lt;br /&gt;というちょっとした仕込を入れましょう。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;import&lt;/span&gt; &lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;string&lt;/span&gt;&lt;br /&gt;app = &lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Application&lt;/span&gt;&lt;br /&gt;sSel = app.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;GetAsText&lt;/span&gt;().&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;encode&lt;/span&gt;()&lt;br /&gt;table = &lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;string&lt;/span&gt;.&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;maketrans&lt;/span&gt;('LR','RL')&lt;br /&gt;sSel = sSel.&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;translate&lt;/span&gt;(table)&lt;br /&gt;app.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;SetAsText&lt;/span&gt;(sSel)&lt;br /&gt;&lt;br /&gt;翻訳ツール(&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;translate&lt;/span&gt;)を使って、LとRを逆に認識させるというコードです。&lt;br /&gt;ステキなモジュール、&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;string&lt;/span&gt;を呼びました。&lt;br /&gt;これは、文字列とは違います。&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;string&lt;/span&gt;というモジュールです。&lt;br /&gt;モジュールを呼ぶときには、&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;import&lt;/span&gt;として、&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;class&lt;/span&gt;、&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;def&lt;/span&gt;を外部ファイルから呼ぶときに使います。&lt;br /&gt;おまじないみたいなもんです。&lt;br /&gt;そして通常翻訳するときには、'hello'は'こんにちは'に変換するみたいな感じでやってますが、同じ事を文字列で実行します。&lt;br /&gt;&lt;br /&gt;まず、変換テーブルというものを作ります。&lt;br /&gt;&lt;br /&gt;table = &lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;string&lt;/span&gt;.&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;maketrans&lt;/span&gt;('LR','RL')&lt;br /&gt;&lt;br /&gt;これは&lt;br /&gt;&lt;br /&gt;'L'は'R'にしなさい&lt;br /&gt;'R'は'L'にしなさい&lt;br /&gt;&lt;br /&gt;という翻訳機が使う変換テーブルを作成します。&lt;br /&gt;中身を見てみますと･･･&lt;br /&gt;&lt;br /&gt;'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&amp;amp;\'()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;･･･ワケ分かりません。&lt;br /&gt;ギャボンヌです。&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Application&lt;/span&gt;.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;ES_Speak&lt;/span&gt;('gabonnu')&lt;br /&gt;&lt;br /&gt;まあ、コンピュータが理解出来ればいいので&lt;br /&gt;こんな感じですよ。って教えてあげます。&lt;br /&gt;&lt;br /&gt;そして、変換テーブルに沿って文字列を翻訳します。&lt;br /&gt;&lt;br /&gt;sSel = sSel.&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;translate&lt;/span&gt;(table)&lt;br /&gt;&lt;br /&gt;'IK_Larm'という文字列なら'IK_Rarm'に翻訳します。&lt;br /&gt;そうそう。&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;translate&lt;/span&gt;は、str型でないと機能しないようです。&lt;br /&gt;XSIは、str型でも結構unicode型で返してくるファンクションが多いので、少々注意です。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;encode&lt;/span&gt;()で、str型に変換しています。&lt;br /&gt;&lt;br /&gt;sSel = app.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;GetAsText&lt;/span&gt;().&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;encode&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;そして最後に&lt;br /&gt;&lt;br /&gt;app.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;.&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;SetAsText&lt;/span&gt;(sSel)&lt;br /&gt;&lt;br /&gt;として、&lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;Selection&lt;/span&gt;をセットしなおします。&lt;br /&gt;これで、反転セレクトツールが出来ましたね。&lt;br /&gt;&lt;br /&gt;『やったよ！ﾏﾏﾝ！ﾎﾞｸにも出来た！』&lt;br /&gt;&lt;br /&gt;しかし、喜ぶのはまだ早いです。&lt;br /&gt;ここでもまだワナが潜んでおります。&lt;br /&gt;キャラクターなどは、Model階層化で作られることがほとんどです。&lt;br /&gt;キャラクター'ROB'というModelに属していたらどうでしょうか？&lt;br /&gt;&lt;br /&gt;･･･上手く取得出来ません。&lt;br /&gt;&lt;br /&gt;'ROB.IK_Rarm'を翻訳すると、'LOB.IK_Larm'になってしまいます･･･。&lt;br /&gt;目標が見つからなくエラーが出てしまいます。&lt;br /&gt;&lt;br /&gt;ああ、これじゃｸｿスクリプトじゃんか。&lt;br /&gt;これは、どうしよう･･･。&lt;br /&gt;悩む･･･。&lt;br /&gt;悩むなぁ･･･。&lt;br /&gt;&lt;br /&gt;なんて感じでスクリプト制作はまだまだ続きます。&lt;br /&gt;というわけで、この続きは次回までのお楽しみです。&lt;br /&gt;完成目指して、がんばってみますね。&lt;br /&gt;ではでは、しばらくの沈黙をいただきます。&lt;br /&gt;&lt;br /&gt;冬休み早くこねーかなー。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-3825383850435156118?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/3825383850435156118/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=3825383850435156118' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/3825383850435156118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/3825383850435156118'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/12/sukio-sukio-sukio-python-vi.html' title='Sukio Sukio Sukio Python - VI'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-905625113165390547</id><published>2008-11-28T12:01:00.002+09:00</published><updated>2008-11-28T12:11:36.312+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>XSI 7.01 Released.</title><content type='html'>やー。出ましたね。&lt;br /&gt;少しは、プロダクションで使えるようになったでしょうか。&lt;br /&gt;&lt;br /&gt;Fixed Bugs Listを見てみると恐ろしい量です･･･。&lt;br /&gt;&lt;br /&gt;UDEV00248322 - Incidence Node "Light List" is broken &lt;br /&gt;IncidenceのLight Listは直ったみたい？&lt;br /&gt;&lt;br /&gt;UDEV00248548 - Loading the Vector to Color node from the top menu does not work&lt;br /&gt;Vector to Colorが見えるようになったのかな？&lt;br /&gt;&lt;br /&gt;UDEV00247262 - Hidden Line Display and material with Transparency can cause XSI to crash&lt;br /&gt;うひひっ。恐ろしや。&lt;br /&gt;&lt;br /&gt;でも、7.02が出るまで我慢だなぁ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-905625113165390547?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/905625113165390547/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=905625113165390547' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/905625113165390547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/905625113165390547'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/11/xsi-701-released.html' title='XSI 7.01 Released.'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-5853901861091424219</id><published>2008-11-26T20:18:00.005+09:00</published><updated>2011-09-17T13:35:59.648+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Sukio Sukio Sukio Python - V</title><content type='html'>みなさまこんにちは。5回目になりました。&lt;br /&gt;&lt;br /&gt;さて、今回は、OM、オブジェクトモデルの探し方です。&lt;br /&gt;せっかくオブジェクト指向の言語Pythonを使用していますので、XSIも合わせて使ってみましょう。&lt;br /&gt;&lt;br /&gt;その前に、オブジェクト指向とはなんでしょうか？&lt;br /&gt;ワタクシも上手く伝え切れませんが、XSIをモデルに考えると、Explorerをイメージすると分かりやすいと思います。&lt;br /&gt;Nullには、Primitive、Kinematics、Visibility、Display&lt;br /&gt;とプロパティの引き出しがあり、そのそれぞれにパラメータを持ち、値を変えることが出来ます。&lt;br /&gt;Pythonの中にもこういった階層構造があり、stringでさえオブジェクトモデルでありその下には&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find',&lt;br /&gt;&lt;br /&gt;'index','isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join',&lt;br /&gt;&lt;br /&gt;'ljust','lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition',&lt;br /&gt;&lt;br /&gt;'rsplit','rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate',&lt;br /&gt;&lt;br /&gt;'upper','zfill'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;と本当にたくさんの便利なメソッドが用意されています。&lt;br /&gt;これらを使いこなしてこそ、Pythonを使う意味があるというもの。&lt;br /&gt;OMを使わなければ、Pythonでなくても良いのです。&lt;br /&gt;このように、&lt;span style="color: #009900; font-weight: bold;"&gt;XSIのメソッド&lt;/span&gt;を知るということと、&lt;span style="color: #ff6600; font-weight: bold;"&gt;Pythonのメソッド&lt;/span&gt;を知るということは別のことであり、両方学ばなければ十分に力が発揮されないことが理解出来ることでしょう。&lt;br /&gt;&lt;br /&gt;では、本題に戻りましょう。&lt;br /&gt;&lt;br /&gt;まず、テキトーに物を作って、階層構造を作って、ランダマイズを掛け、値をいじって、移動して、レンダリングをオフ、グループを作成して、というCMのログを見てみます。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[Application.NewScene("", "")Application.GetPrim("Null", "", "", "")Application.CreatePrim("Sphere", "MeshSurface", "", "")Application.CopyPaste("sphere", "", "null", 1)Application.ApplyOp("Randomize", "sphere", 3, "siPersistentOperation", "", 0)Application.SetValue("sphere.polymsh.randomizeop.amplx", 2, "")Application.SetValue("sphere.polymsh.randomizeop.amply", 2, "")Application.SetValue("sphere.polymsh.randomizeop.amplz", 2, "")Application.Translate("", 1, 0, 0, "siAbsolute", "siPivot", "siObj", "siX", "", "", "", "", "","", "", "", "", 0, "")Application.Translate("", 0, 1, 0, "siAbsolute", "siPivot", "siObj", "siY", "", "", "", "", "","", "", "", "", 0, "")Application.SetValue("sphere.visibility.rendvis", 0, "")Application.CreateGroup("", "", "")]]&gt;&lt;/script&gt;&lt;br /&gt;こんな感じです。&lt;br /&gt;多くのスクリプトは&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[Application.SetValue(oObj+".polymsh.randomizeop.amplx", 2, "")]]&gt;&lt;/script&gt;&lt;br /&gt;などして、汎用性を高めているに留まっています。&lt;br /&gt;これを実行しても、立派にスクリプトと言えるでしょう。&lt;br /&gt;ですが、ちょっと見にくい感じです。&lt;br /&gt;ですので、もう一段階レベルを上げる事を考えて見ます。&lt;br /&gt;このCMをほとんどOMに変えてみます。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[app=Applicationapp.NewScene()oRoot = app.ActiveSceneRootoNull = oRoot.AddNull()oObj = oNull.AddGeometry('Sphere','MeshSurface')oOp = XSIFactory.CreateObjectFromPreset( "Randomize", "Operators" )oOp.connect(oObj)oOp.amplx.Value = 2oOp.amply.Value = 2oOp.amplz.Value = 2oObj.posx.Value = 1oObj.posy.Value = 1oObj.rendvis.Value = FalseoRoot.AddGroup(oObj)]]&gt;&lt;/script&gt;&lt;br /&gt;物凄くスッキリしました。&lt;br /&gt;そして、実行すると一瞬で返ってきます。&lt;br /&gt;CMは、&lt;span style="color: #009900; font-weight: bold;"&gt;NewScene&lt;/span&gt;()のみです。&lt;br /&gt;&lt;br /&gt;app=&lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;まず、&lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;はとても長いので、appと短い変数にしてあげます。&lt;br /&gt;xsiとしている人も居ます。自分が分かればOKです。&lt;br /&gt;&lt;br /&gt;さて、Scene_Rootは、何を実行すれば取得出来るでしょうか？&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;のSDKマニュアルを見てみましょう。&lt;br /&gt;このオブジェクトには、これだけのメソッド、プロパティが用意されています。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;メソッド&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;ActivateWorkgroup  AddCommand  AddWorkgroup  Advise  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;ClassName  CreateAddon  CreateCommand  CreateProject  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;ExecuteScript  ExecuteScriptCode  ExecuteScriptCommand  GetCommandByScriptingName  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;InstallAddon  IsClassOf  IsEqualTo  LoadPlugin  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;LogMessage  RemoveCommand  RemoveWorkgroup  RescanWorkgroups  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Unadvise  UnInstallAddon  UnloadPlugin  UpdatePlugins  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Version           &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;プロパティ&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;ActiveProject  ActiveSceneRoot  ActiveToolName  Application  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Categories  Commands  Desktop  Devices  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Dictionary  EventInfos  Filters  FullName  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Help  InstallationPath  Interactive  License  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Name  NestedObjects  Origin  OriginPath  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Parent  Platform  Plugins  Preferences  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Selection  StatusBar  Type  Workgroups  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;たくさんありますね。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Application.Selection&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;としてあげれば、選択されたものが取得出来ます。&lt;br /&gt;肝心のScene_Rootですが、プロパティの2つ目、&lt;span style="color: #009900; font-weight: bold;"&gt;ActiveSceneRoot&lt;/span&gt;がそれに当たります。&lt;br /&gt;&lt;br /&gt;oRoot = app.&lt;span style="color: #009900; font-weight: bold;"&gt;ActiveSceneRoot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Scene_Rootに行う処理は、2回ありますので、取り合えず変数oRootに入れておきます。&lt;br /&gt;次に、&lt;span style="color: #009900; font-weight: bold;"&gt;ActiveSceneRoot&lt;/span&gt;にNullを追加したいので、&lt;span style="color: #009900; font-weight: bold;"&gt;ActiveSceneRoot&lt;/span&gt;のページに行き戻り値Modelというリンクを辿ってみましょう。&lt;br /&gt;これまた物凄くたくさんのメソッド群ですね。&lt;br /&gt;ここからNullが出そうなものは&lt;span style="color: #009900; font-weight: bold;"&gt;AddNull&lt;/span&gt;というメソッドを利用しようと思います。&lt;br /&gt;&lt;br /&gt;oNull = oRoot.&lt;span style="color: #009900; font-weight: bold;"&gt;AddNull&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;またまたリンクを辿ると&lt;span style="color: #009900; font-weight: bold;"&gt;AddNull&lt;/span&gt;には、ひとつ引数を与えられるみたいです。&lt;br /&gt;Stringを与えれば、その名前で追加します。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;AddNull&lt;/span&gt;('null_generate_by_script')&lt;br /&gt;&lt;br /&gt;などですね。今回は、省略します。&lt;br /&gt;ついでに出したNullは、oNullという変数に入れてあげます。&lt;br /&gt;&lt;br /&gt;oObj = oNull.&lt;span style="color: #009900; font-weight: bold;"&gt;AddGeometry&lt;/span&gt;('Sphere','MeshSurface')&lt;br /&gt;&lt;br /&gt;nullの子供にSphereを加えたいので、&lt;span style="color: #009900; font-weight: bold;"&gt;AddGeometry&lt;/span&gt;()を使います。第一引数は、プリセット。第二引数は、メッシュなのかナーブスかです。これもついでにoObjとしておきます。&lt;br /&gt;&lt;br /&gt;oOp = &lt;span style="color: #009900; font-weight: bold;"&gt;XSIFactory&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;CreateObjectFromPreset&lt;/span&gt;( "Randomize", "Operators" )&lt;br /&gt;oOp.&lt;span style="color: #009900; font-weight: bold;"&gt;connect&lt;/span&gt;(oObj)&lt;br /&gt;&lt;br /&gt;オペレータは、&lt;span style="color: #009900; font-weight: bold;"&gt;ApplyOp&lt;/span&gt;()を主に使いますが、今回は、完全OMにしてみました。&lt;br /&gt;Randomizeオペレータを一度シーンに呼び出し、適用させたいオブジェクト（この場合oObjです）にコネクトします。&lt;br /&gt;ですが、&lt;span style="color: #009900; font-weight: bold;"&gt;ApplyOp&lt;/span&gt;()はとても便利ですので、そのまま使ったほうが良いときがほとんどです。&lt;br /&gt;この場合は&lt;br /&gt;&lt;br /&gt;app.&lt;span style="color: #009900; font-weight: bold;"&gt;ApplyOp&lt;/span&gt;("Randomize",oObj)&lt;br /&gt;&lt;br /&gt;でOKでしょう。&lt;br /&gt;ただし、返り値が問題です。&lt;br /&gt;コマンド、&lt;span style="color: #009900; font-weight: bold;"&gt;ApplyOp&lt;/span&gt;()は、配列のXSICollectionで返ってきてしまいます。&lt;br /&gt;オペレータオブジェクトの外側にXSICollectionという殻が付いている状態です。&lt;br /&gt;(OperatorObject)←こんな感じ。&lt;br /&gt;&lt;br /&gt;ですので、殻の中身を食べたいのでこの様に大抵(0)を付けてあげて、0番目の配列を選んであげます。&lt;br /&gt;これにより、オペレータオブジェクトを直に変数に入れています。&lt;br /&gt;&lt;br /&gt;oOp = app.&lt;span style="color: #009900; font-weight: bold;"&gt;ApplyOp&lt;/span&gt;("Randomize",oObj)(0)&lt;br /&gt;&lt;br /&gt;こんな感じですね。oOpには、ランダマイズオペレータが入っています。&lt;br /&gt;それでは、ランダマイズオペレータのDisplacementをXYZ全て2にします。&lt;br /&gt;Operatorで検索をかけ、Operatorページに行ってみましょう。&lt;br /&gt;おや？アンプリチュードの値を変えられそうなメソッド、プロパティは、無さそうです。&lt;br /&gt;そうなのです。パラメータの値は、いちいちマニュアルには書いて居ないのです。&lt;br /&gt;パラメータの名前を知るには、オペレータを選択して、Inspectし、Markingします。&lt;br /&gt;Xをクリックしてみましょう。&lt;br /&gt;するとログには、こう出ます。&lt;br /&gt;&lt;br /&gt;Application.&lt;span style="color: #009900; font-weight: bold;"&gt;SetMarking&lt;/span&gt;("amplx")&lt;br /&gt;&lt;br /&gt;DisplacementのXの値は、"amplx"という名前なのが分かりました。&lt;br /&gt;ですので、この値をセットするには&lt;br /&gt;&lt;br /&gt;oOp.amplx.Value = 2&lt;br /&gt;oOp.amply.Value = 2&lt;br /&gt;oOp.amplz.Value = 2&lt;br /&gt;&lt;br /&gt;このように書きます。&lt;br /&gt;本来ですと&lt;br /&gt;&lt;br /&gt;oOp.&lt;span style="color: #009900; font-weight: bold;"&gt;Parameters&lt;/span&gt;("amplx").Value = 2&lt;br /&gt;&lt;br /&gt;と書きます。&lt;br /&gt;これはショートカットがききますので、ダイレクトにも書くことが出来ます。&lt;br /&gt;ショートカットで検索すれば、いろいろ出てきますので、参考にしましょう。&lt;br /&gt;出来ないものと出来るものがあるので、注意です。&lt;br /&gt;出来なかったら、Parametersを使えばOKです。&lt;br /&gt;&lt;br /&gt;oObj.posx.Value = 1&lt;br /&gt;oObj.posy.Value = 1&lt;br /&gt;&lt;br /&gt;Kinematicsも同様の探し方です。&lt;br /&gt;ショートカットを使いましょう。&lt;br /&gt;本来の書き方は&lt;br /&gt;&lt;br /&gt;oObj.Kinematics.Local.posx.Value = 1&lt;br /&gt;&lt;br /&gt;です。&lt;br /&gt;さて、次は、VisibilityのRenderViewのチェックをオフです。&lt;br /&gt;これもショートカットが存在します。&lt;br /&gt;良く使うものには大抵ついています。&lt;br /&gt;&lt;br /&gt;oObj.rendvis.Value = False&lt;br /&gt;&lt;br /&gt;これでOKです。&lt;br /&gt;&lt;br /&gt;oObj.&lt;span style="color: #009900; font-weight: bold;"&gt;Properties&lt;/span&gt;("Visibility").&lt;span style="color: #009900; font-weight: bold;"&gt;Parameters&lt;/span&gt;("rendvis").Value&lt;br /&gt;&lt;br /&gt;どちらでもといった感じでしょうか。&lt;br /&gt;ちなみに、Explorerで、四角いノードは、プロパティを示しています。&lt;br /&gt;名前が分かれば、&lt;span style="color: #009900; font-weight: bold;"&gt;Properties&lt;/span&gt;で取得出来ます。&lt;br /&gt;&lt;br /&gt;最後に、グループです。&lt;br /&gt;グループは、モデルに付くものです。ですので、Modelのマニュアルを覗いて見ると&lt;br /&gt;ありました、&lt;span style="color: #009900; font-weight: bold;"&gt;AddGroup&lt;/span&gt;()。&lt;br /&gt;これを使用しましょう。&lt;br /&gt;&lt;br /&gt;oRoot.&lt;span style="color: #009900; font-weight: bold;"&gt;AddGroup&lt;/span&gt;(oObj)&lt;br /&gt;&lt;br /&gt;第一引数は、メンバーを入れます。&lt;br /&gt;ここに入るのは、OMでないと受け付けてくれません。&lt;br /&gt;OMで処理するには、OMを使用しなければなりません。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;CreateGroup&lt;/span&gt;(sName,oObj)&lt;br /&gt;&lt;br /&gt;逆に、CMは、StringでもOMでも入れればGroupに入れてくれるようです。&lt;br /&gt;融通はこちらのほうが上でしょうか。&lt;br /&gt;&lt;br /&gt;現存のグループの名前が分かっている場合の取得方法は&lt;br /&gt;&lt;br /&gt;Application.&lt;span style="color: #009900; font-weight: bold;"&gt;ActiveSceneRoot&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;Groups&lt;/span&gt;("ABC")&lt;br /&gt;&lt;br /&gt;とすれば、ABCという名前のグループが取得出来ます。&lt;br /&gt;こちらも便利でしょ？&lt;br /&gt;&lt;br /&gt;という感じです。&lt;br /&gt;未だPythonのOMには、たどり着きませんでしたが、いかがでしたか？&lt;br /&gt;今回は、Pythonの部分に全く触れていないので、この説明は、vbでもjsでも同じことが言えます。&lt;br /&gt;&lt;br /&gt;題材をちょっと間違えたかもなぁ･･･ω&lt;br /&gt;ま、いっか。&lt;br /&gt;&lt;br /&gt;OMには、いろんなメリットがあり、必要なオブジェクトに瞬時にアクセスすることが出来ます。&lt;br /&gt;そして、処理スピードには、天と地の差が開く事になります。&lt;br /&gt;覚えるのは結構大変ですが、SDKマニュアルとお友達になれば、いつでも助けてくれることでしょう。&lt;br /&gt;&lt;br /&gt;というわけで、次回は、Pythonの使い方に注目してみましょう。&lt;br /&gt;String、List辺りをやってみようと思います。&lt;br /&gt;ファイル操作もやってみてもいいかも知れません。&lt;br /&gt;&lt;br /&gt;それでは、またお会い出来るのを心待ちにしてます。&lt;br /&gt;&lt;br /&gt;おたのしみに。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-5853901861091424219?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/5853901861091424219/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=5853901861091424219' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/5853901861091424219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/5853901861091424219'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/11/sukio-sukio-sukio-python-v.html' title='Sukio Sukio Sukio Python - V'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-8470209989827689843</id><published>2008-11-10T17:20:00.006+09:00</published><updated>2012-01-05T00:20:20.408+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Sukio Sukio Sukio Python - IV : UIの基本構造</title><content type='html'>今回で、4回目になりました。&lt;br /&gt;スクリプティングは、毎回同じことをやらせるのにとても都合のいいものです。&lt;br /&gt;寝ている間に、作業を終わらせることだって可能なのです。&lt;br /&gt;物量が無ければ、ほとんど意味の無いものですけど。&lt;br /&gt;&lt;br /&gt;さて、今回は、カスタムプロパティを使い、なんらかの動作をさせるボタンを作成してみましょう。&lt;br /&gt;&lt;br /&gt;単純に、ボタンを押したら選択されているもののposXをパラメータの値に移動するというものを作ってみます。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[from win32com.client import constants as cLogicCode = """def PosX_OnClicked():    app = Application    log = app.LogMessage    fNmb = PPG.Number.Value    app.Selection(0).Posx.Value = fNmb    log(fNmb)"""app = Applicationlog = app.LogMessageoPSet = app.ActiveSceneRoot.AddProperty(    "CustomProperty",    False,    "ButtonTEST" )oPSet.AddParameter2(    "number",    c.siDouble,    0.0,    -20.0, 20.0,    -20.0, 20.0,    c.siClassifUnknown,    c.siPersistable | c.siAnimatable )oLayout = oPSet.PPGLayoutoLayout.AddButton( "PosX" )oLayout.AddItem( "Number" )oLayout.Language = "Python"oLayout.Logic = LogicCodeapp.InspectObj( oPSet, "", "", c.siLock )]]&gt;&lt;/script&gt; &lt;br /&gt;&lt;br /&gt;いささか難しいコードになってしまいますが、一番シンプルな形ではないでしょうか。&lt;br /&gt;CMは、&lt;span style="color: #009900; font-weight: bold;"&gt;InspectObj&lt;/span&gt;のみとなってしまいますが、解説をいたします。&lt;br /&gt;&lt;br /&gt;XSIでのUIのダイアログの事をPPG（Property Page）と呼びます。&lt;br /&gt;PPGを作るには、3つの段階が必要になります。&lt;br /&gt;&lt;br /&gt;1. 内部的に処理するパラメータを定義する。(AddParameter)&lt;br /&gt;2. PPG内のレイアウトにどのような形で変数を表示させるか。(AddItem)&lt;br /&gt;3. ボタン、チェックボックス、ドロップダウンボックス、などをユーザーが押したり値をいじったら何を実行するか。(Logic)&lt;br /&gt;&lt;br /&gt;まず、必要なパラメータを準備しましょう。&lt;br /&gt;AddPropertyで、カスタムプロパティを作成します。&lt;br /&gt;&lt;br /&gt;oPSet = app.&lt;span style="color: #009900; font-weight: bold;"&gt;ActiveSceneRoot&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;AddProperty&lt;/span&gt;( "CustomProperty", False, "ButtonTEST" )&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;ActiveSceneRoot&lt;/span&gt;は、XSIの"Scene_Root"モデルを意味します。&lt;br /&gt;そこにプロパティ"ButtonTEST"を付けなさいという命令文です。&lt;br /&gt;イコールで繋ぐと、oPSetには、カスタムプロパティが入ります。&lt;br /&gt;&lt;br /&gt;次に、選択したもののposXを入れたいのですから、浮動小数点のタイプを用いたほうがいいでしょう。&lt;br /&gt;AddParameter2で、変数を作成します。&lt;br /&gt;&lt;br /&gt;oPSet.&lt;span style="color: #009900; font-weight: bold;"&gt;AddParameter2&lt;/span&gt;("number",&lt;span style="color: #ff6600; font-weight: bold;"&gt;c&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;siDouble&lt;/span&gt;,0.0,-20.0, 20.0,-20.0,20.0,&lt;span style="color: #ff6600; font-weight: bold;"&gt;c&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;siClassifUnknown&lt;/span&gt;,&lt;span style="color: #ff6600; font-weight: bold;"&gt;c&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;siPersistable &lt;/span&gt;| &lt;span style="color: #ff6600; font-weight: bold;"&gt;c&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;siAnimatable &lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;この変数名をnumberということにします。&lt;br /&gt;第2引数は、タイプですから、&lt;span style="color: #ff6600; font-weight: bold;"&gt;c&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;siDouble&lt;/span&gt;&lt;span style="color: #009900;"&gt;&lt;/span&gt;という浮動小数点の定数を入れます。&lt;br /&gt;あとは、表示するバーのデフォルトの値、最大最小値、内部的な制限の最大最小値、パラメータの分類（多くはデフォルトでOKです）&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;c&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;siPersistable&lt;/span&gt;は、値を保存可能に、&lt;span style="color: #ff6600; font-weight: bold;"&gt;c&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;siAnimatable&lt;/span&gt;はこのパラメータ自体をアニメーション可能にします。&lt;br /&gt;物凄くたくさんのオプションが存在するので、マニュアルを見て、いろいろ試してみましょう。&lt;br /&gt;&lt;br /&gt;次に、レイアウトを決めます。&lt;br /&gt;oLayout = oPSet.&lt;span style="color: #009900; font-weight: bold;"&gt;PPGLayout&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;カスタムプロパティには、&lt;span style="color: #009900; font-weight: bold;"&gt;PPGLayout&lt;/span&gt;というメソッドが存在します。&lt;br /&gt;コレを用いて、レイアウトにアクセスします。&lt;br /&gt;レイアウトに表示させたいものは、Numberというパラメータバーと実行するボタンです。&lt;br /&gt;&lt;br /&gt;oLayout.&lt;span style="color: #009900; font-weight: bold;"&gt;AddButton&lt;/span&gt;( "PosX" )&lt;br /&gt;oLayout.&lt;span style="color: #009900; font-weight: bold;"&gt;AddItem&lt;/span&gt;( "Number" )&lt;br /&gt;&lt;br /&gt;ボタンを作成するときは、&lt;span style="color: #009900; font-weight: bold;"&gt;AddParameter2&lt;/span&gt;を用いなくても大丈夫。&lt;br /&gt;ボタンにパラメータは必要ありません。&lt;br /&gt;ボタンの下に、numberというパラメーターバーを表示させます。&lt;br /&gt;&lt;br /&gt;ここまで、実行して、出来たプロパティをつつけば、レイアウト通り出来ているはずです。&lt;br /&gt;ただし、ボタンを押しても何も動きません。&lt;br /&gt;動作させるには、&lt;span style="color: #009900; font-weight: bold;"&gt;Logic&lt;/span&gt;メソッドを用いて、PPGに仕組みを覚えさせなければいけません。&lt;br /&gt;この形で仕組みを書くには、&lt;span style="color: #009900; font-weight: bold;"&gt;Logic&lt;/span&gt;コードをStringで渡してあげなくてはならないのです。&lt;br /&gt;&lt;br /&gt;Stringを使う際、"（ダブルクォーテーション）または、'（シングルクォーテーション）でくくった形になります。&lt;br /&gt;しかし、Pythonでは、インデントや改行などがあり、通常一行で書くにはとても辛い所です。&lt;br /&gt;ですが、'''を使う事によって、書いた文面を見た目通りに変数に入れることが出来ます。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[LogicCode = """def PosX_OnClicked():    app = Application    log = app.LogMessage    fNmb = PPG.Number.Value    app.Selection(0).Posx.Value = fNmb    log(fNmb)"""]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;LogicCode変数は、'''から'''までというニュアンスです。この中の&lt;br /&gt;&lt;br /&gt;fNmb = PPG.Number.Value&lt;br /&gt;&lt;br /&gt;という部分。これは、PPGのNumberというパラメータの値を参照します。&lt;br /&gt;fNmbという変数に入れています。（自分だけ分かればいいので、float Numberの略です）&lt;br /&gt;Selection(0)は、一番初めに選択したものになります。&lt;br /&gt;ちなみに、Selection(1)は、二番目に選択したものが入ります。&lt;br /&gt;&lt;br /&gt;app.Selection(0).Posx.Value = fNmb&lt;br /&gt;&lt;br /&gt;ここで、ポジションXの値をfNmbから受け取っています。&lt;br /&gt;フルで書くと&lt;br /&gt;&lt;br /&gt;Application.Selection(0).Kinematics.Local.Posx.Value = fNmb&lt;br /&gt;&lt;br /&gt;となりますが、キネマティクスのローカルは、ショートカットがききます。&lt;br /&gt;&lt;br /&gt;最後のCM&lt;br /&gt;&lt;br /&gt;app.&lt;span style="color: #009900; font-weight: bold;"&gt;InspectObj&lt;/span&gt;( oPSet, '', '', &lt;span style="color: #ff6600; font-weight: bold;"&gt;c&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;siLock &lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;これは、カスタムプロパティを左クリックでつついたように表示するってコマンドです。&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;c&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;siLock&lt;/span&gt;は、ページをロックします。&lt;br /&gt;他のオブジェクトをInspectしても表示を切り替えないようにするためです。&lt;br /&gt;&lt;br /&gt;以上、PPGの作り方の解説でした。&lt;br /&gt;少々分からないことだらけでしょうが、一個一個解析していけば、素晴らしいUIが完成すること間違いなしです。&lt;br /&gt;&lt;br /&gt;ちなみに、この書き方の弱点は、保存して、次に開いたときにレイアウトが保存出来ないってところです。&lt;br /&gt;今回の、ボタンとパラメータバーだけでは大丈夫ですが、コンボボックスやら、チェックボックス、FCurveエディター、などなど、豪華に作ったはいいが、消えてしまうのね～というのが開発者として、一回は通る道になっております。&lt;br /&gt;それを回避するには、カスタムプロパティ自体をプラグインとして登録してあげるしかありません。&lt;br /&gt;これは、マニュアルや他の人が作ったやり方を参照したほうが、覚えるのは早いでしょう。&lt;br /&gt;幸い、CustomPropertyWizardという恐ろしく便利なプリセット作成ツールがあるので、それを使ってくださいね。&lt;br /&gt;&lt;br /&gt;次回は、OMを使って、パラメータにアクセスする方法の見つけ方でもやりましょうか。&lt;br /&gt;&lt;br /&gt;ではでは、ゴキゲンヨウ！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-8470209989827689843?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/8470209989827689843/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=8470209989827689843' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8470209989827689843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8470209989827689843'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/11/sukio-sukio-sukio-python-iv.html' title='Sukio Sukio Sukio Python - IV : UIの基本構造'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-1157953303403535082</id><published>2008-10-25T13:27:00.006+09:00</published><updated>2011-09-17T13:38:30.954+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Sukio Sukio Sukio Python - III</title><content type='html'>Python好きよ好きよ好きよな初心者のためのPython講座その3です。&lt;br /&gt;&lt;br /&gt;今回で、恐らく脱落者続出だと思われますが、意味が全然分からなくても&lt;br /&gt;&lt;br /&gt;「ああ、オレってだめぽ・・・。スクリプト向いてないぽ・・・。」&lt;br /&gt;&lt;br /&gt;って、思わないで欲しいです。&lt;br /&gt;一朝一夕で覚えられたら、この記事を読まなくてもPythonを使いこなせるはずです。&lt;br /&gt;Pythonは、いつまでも貴方を待ち続けます。&lt;br /&gt;&lt;br /&gt;さて、始めましょう。&lt;br /&gt;&lt;br /&gt;今回は、&lt;span style="color: #ff6600; font-weight: bold;"&gt;def&lt;/span&gt;文です。&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;def&lt;/span&gt;は、他の言語の言う所の、functionに当たります。&lt;br /&gt;同じスクリプトで、何度も同じ内容のものを繰り返すときや、処理を見やすくす&lt;br /&gt;るとき、そして、Pythonでは、前に保存したスクリプトの&lt;span style="color: #ff6600; font-weight: bold;"&gt;def&lt;/span&gt;を呼び出すことも、簡単に行えます。&lt;br /&gt;&lt;br /&gt;まず、何度も使うといえば&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;LogMessage&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;この文は、何度もデバッグのためなどに多用することでしょう。&lt;br /&gt;ですので、例えばログ文を少し豪華にしたいなどのときや、何回も使うものをまとめておきます。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;def&lt;/span&gt; log(pMsg):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;LogMessage&lt;/span&gt;(pMsg)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6600; font-weight: bold;"&gt;return&lt;/span&gt; '+ + + ' + pMsg + ' + + +'&lt;br /&gt;&lt;br /&gt;log('abc')&lt;br /&gt;log(&lt;span style="color: #ff6600; font-weight: bold;"&gt;r&lt;/span&gt;'C:\Softimage\XSI_7.0\Application\bin\XSI.exe')&lt;br /&gt;sReturn = log('I love XSI')&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;&lt;/span&gt;log(sReturn)&lt;br /&gt;&lt;br /&gt;このようにして、&lt;span style="color: #009900; font-weight: bold;"&gt;LogMessage&lt;/span&gt;を簡略化出来ます。&lt;br /&gt;&lt;br /&gt;Pythonの場合、defを変数にすることが出来、最良手はコレですが。&lt;br /&gt;log = &lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;LogMessage&lt;/span&gt;&lt;br /&gt;log('abc')&lt;br /&gt;&lt;br /&gt;logというファンクションを作り、受け取る変数pMsgをセットします。これは、&lt;br /&gt;何個でも作成することが出来ます。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;def&lt;/span&gt; log(pMsg,pType):&lt;br /&gt;&lt;br /&gt;こんな感じです。&lt;br /&gt;&lt;br /&gt;下の、logファンクションで、'abc'というストリングを第１引数に入れ実行する&lt;br /&gt;と、上部のpMsgという変数に、'abc'が代入され、&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;LogMessage&lt;/span&gt;('abc')が実行されるシンプルなファンクションです。&lt;br /&gt;&lt;br /&gt;def文の中に、&lt;span style="color: #ff6600; font-weight: bold;"&gt;return&lt;/span&gt;文がありますが、コレは返ってくる値をセットすることが出来ます。&lt;br /&gt;無くても動作します。&lt;br /&gt;'I love XSI'がpMsgに代入されたとすると、返ってくるのは、'+ + + I love XSI + + +'になり、上記の例では、sReturnに代入されるという仕組みです。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;r&lt;/span&gt;'C:\Softimage\XSI_7.0\Application\bin\XSI.exe'&lt;br /&gt;&lt;br /&gt;この文で、スクリプトを書いたことがある方は、へぇ～と思いますが、Pythonには、Row Stringという型が用意されており、バックスラッシュ'\'を通常の文字として認識させることが可能です。&lt;br /&gt;例えば、JScriptで書くには、このようにしなければ、'\'は認識できません。&lt;br /&gt;&lt;br /&gt;'C:\\Softimage\\XSI_7.0\\Application\\bin\\XSI.exe'&lt;br /&gt;&lt;br /&gt;バックスラッシュの嵐が訪れる事になります。&lt;br /&gt;&lt;br /&gt;String型で'\'は、エスケープ文字と呼ばれ、改行やタブを表現することが出来ます。&lt;br /&gt;これにはいろいろあります。&lt;br /&gt;&lt;br /&gt;\\：バックスラッシュ (\)&lt;br /&gt;\'：一重引用符 (')&lt;br /&gt;\"：二重引用符 (")&lt;br /&gt;\a：ASCII 端末ベル (BEL)&lt;br /&gt;\b：ASCII バックスペース (BS)&lt;br /&gt;\f：ASCII フォームフィード (FF)&lt;br /&gt;\n：ASCII 行送り、改行 (LF)&lt;br /&gt;\r：ASCII 復帰 (CR)&lt;br /&gt;\t：ASCII 水平タブ (TAB)&lt;br /&gt;\v：ASCII 水平タブ (VT)&lt;br /&gt;\uxxxx：16-bit の 16 進数値 xxxx を持つ文字 (Unicode のみ)&lt;br /&gt;\Uxxxxxxxx：32-bit の 16 進数値 xxxxxxxx を持つ文字 (Unicode のみ)&lt;br /&gt;\ooo：8 進数値 ooo を持つ文字&lt;br /&gt;\xhh：16 進数値 hh を持つ文字&lt;br /&gt;\N{name}：Unicode データベース中で名前 name を持つ文字 (Unicode のみ)&lt;br /&gt;&lt;br /&gt;いろいろありますが、何のことかサッパリ。って感じでしょうか。&lt;br /&gt;ここで、使うだろうなっていうのは、バックスラッシュ(\)、ダブルクォーテーション(")、改行、タブくらいでしょうか。&lt;br /&gt;それだけ覚えておけば、豪華な&lt;span style="color: #009900; font-weight: bold;"&gt;LogMessage&lt;/span&gt;や、ログとしてテキスト吐き出しをするときなど、応用が可能です。&lt;br /&gt;&lt;br /&gt;さてそれでは、&lt;span style="color: #ff6600; font-weight: bold;"&gt;def&lt;/span&gt;を絡めつつ、PickSessionを使用して、動作するScriptを書いて見ましょう。&lt;br /&gt;&lt;br /&gt;1. Pickする度に、原点に移動する。&lt;br /&gt;2. 終了するには、右クリックする。&lt;br /&gt;&lt;br /&gt;という内容にしましょう。&lt;br /&gt;&lt;br /&gt;まず、たくさんのNullを出してバラバラに配置しておきます。&lt;br /&gt;Iで作ったScriptを実行してもOKです。&lt;br /&gt;もちろん、自分で作成されるのがベストです。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[def MatchTransformationPickElement():  oBtn = 1  while(oBtn != 0):    oBtn,oMdf,oElm = app.PickElement()    if oBtn==0: log('Done'); break    app.ResetTransform(oElm)    log(oElm)app = Applicationlog = app.LogMessageMatchTransformationPickElement()]]&gt;&lt;/script&gt;&lt;br /&gt;こんな感じでしょうか。内容を見ていきましょう。&lt;br /&gt;プログラム的に言えば、上から順に実行されて行きますが、defに関しては&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;一度メモリに溜め込んで、他の行で実行されて初めて効力を発揮する&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;というニュアンスです。&lt;br /&gt;このコードは&lt;br /&gt;&lt;br /&gt;app = &lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;が一番最初に実行されます。&lt;br /&gt;次に、log = app.&lt;span style="color: #009900; font-weight: bold;"&gt;LogMessage&lt;/span&gt;&lt;br /&gt;次に、作ったファンクションである&lt;br /&gt;&lt;br /&gt;MatchTransformationPickElement()&lt;br /&gt;&lt;br /&gt;が実行されます。&lt;br /&gt;oBtn = 1　や　&lt;span style="color: #ff6600; font-weight: bold;"&gt;while&lt;/span&gt;などがありますが、まず、注目していただきたいのは、&lt;span style="color: #009900; font-weight: bold;"&gt;PickElement&lt;/span&gt;()です。&lt;br /&gt;実は、&lt;span style="color: #009900; font-weight: bold;"&gt;PickElement&lt;/span&gt;()もファンクションなのです。&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;PickElement&lt;/span&gt;()を実行すると、Picking Modeになります。&lt;br /&gt;そして、ユーザーがマウスボタンを押すと3つの戻り値、Return Valueを得ます。&lt;br /&gt;&lt;br /&gt;ButtonPressed, ModifierPressed, PickedElement&lt;br /&gt;&lt;br /&gt;ButtonPressedは、なんのボタンを押したか。&lt;br /&gt;1：左クリック&lt;br /&gt;2：中クリック&lt;br /&gt;0：右クリック&lt;br /&gt;このような数字が返ってきます。&lt;br /&gt;&lt;br /&gt;ModifierPressedは、装飾キーは押しているか。&lt;br /&gt;0：なし&lt;br /&gt;1：+Shiftクリック&lt;br /&gt;2：+Ctrlクリック&lt;br /&gt;3：+Shift+Ctrlクリック&lt;br /&gt;今回は、使いません。&lt;br /&gt;&lt;br /&gt;最後のPickedElementは、XSIのオブジェクトを返します。&lt;br /&gt;詳しくはPickElementをハイライトして、マニュアルを見てみましょう。&lt;br /&gt;&lt;br /&gt;oBtn, oMdf, oElm = app.&lt;span style="color: #009900; font-weight: bold;"&gt;PickElement&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;変数を並べておけば、それぞれに代入されます。&lt;br /&gt;左クリックでNullを選んだとすると、oBtnに1が、oMdfには0、oElmには、Nullが入る事になります。&lt;br /&gt;次の文に進みます。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt; oBtn==0: log('Done'); &lt;span style="color: #ff6600; font-weight: bold;"&gt;break&lt;/span&gt;&lt;br /&gt;app.&lt;span style="color: #009900; font-weight: bold;"&gt;ResetTransform&lt;/span&gt;(oElm)&lt;br /&gt;&lt;br /&gt;前回やった、if文ですが、このようにセミコロン(;)で改行を代用しこのように書くことが出来ます。&lt;br /&gt;つまり、oBtnが0のとき、これは、右クリックしたときに、&lt;br /&gt;&lt;br /&gt;log('Done')&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;break&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;を実行することを意味します。&lt;br /&gt;終了したいので'Done'とログし、break文で、&lt;span style="color: #ff6600; font-weight: bold;"&gt;while&lt;/span&gt;を抜けます。&lt;br /&gt;この場合、&lt;span style="color: #ff6600; font-weight: bold;"&gt;def&lt;/span&gt;は、もう何もないので、ココで終わります。&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;break&lt;/span&gt;を実行すると、&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt;、&lt;span style="color: #ff6600; font-weight: bold;"&gt;while&lt;/span&gt;、&lt;span style="color: #ff6600; font-weight: bold;"&gt;def&lt;/span&gt;の途中で終了出来るのです。&lt;br /&gt;&lt;br /&gt;左クリックをした場合、&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt;は、スルーされ&lt;br /&gt;&lt;br /&gt;app.&lt;span style="color: #009900; font-weight: bold;"&gt;ResetTransform&lt;/span&gt;(oElm)&lt;br /&gt;&lt;br /&gt;が実行され、Nullが原点に戻ります。&lt;br /&gt;実は、ここでスクリプトは、終わりません。それは&lt;span style="color: #ff6600; font-weight: bold;"&gt;while&lt;/span&gt;文というものがあるからです。&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;while&lt;/span&gt;文は、条件式が&lt;span style="color: #ff6600; font-weight: bold;"&gt;True&lt;/span&gt;であれば、ずーっといつまでも実行し続けるというものです。&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt;文のループ版みたいな感じでしょうか。かなり強力です。&lt;br /&gt;しかし、&lt;span style="color: #ff6600; font-weight: bold;"&gt;while&lt;/span&gt;文を多用するのはあまりオススメしません。&lt;br /&gt;一歩間違うと、いつまでたっても終わらないスクリプトが完成してしまいます。&lt;br /&gt;ちょっと恐ろしい文です。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;while&lt;/span&gt;(oBtn != 0):&lt;br /&gt;&lt;br /&gt;は、oBtnが、0じゃないとき。つまり、右クリックじゃないときにずーっと実行しなさいという意味になります。&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;def&lt;/span&gt;文のはじめに&lt;br /&gt;&lt;br /&gt;oBtn = 1&lt;br /&gt;&lt;br /&gt;を定義しているのは、whileに一番最初に入ったとき、oBtnという変数は存在しませんので、エラーになるのを回避するためです。&lt;br /&gt;&lt;br /&gt;さて、こんな感じですが、お分かりになりましたでしょうか？&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;def&lt;/span&gt;は結構つかみにくいものであったと記憶してますので、無理に使わなくてもスクリプトを書くことは出来ます。&lt;br /&gt;ですが、構造が理解できると、必ず使うようになります。&lt;br /&gt;少しずつ覚えて行くと良いでしょう。&lt;br /&gt;&lt;br /&gt;今回も物凄く長くなってしまいました・・・。&lt;br /&gt;スクリプトは、細かい定義がたくさんあって、説明するのが大変です。&lt;br /&gt;もうちょっとシンプルに行きたいものです。&lt;br /&gt;&lt;br /&gt;次回は、GUIの作成をしてみたいと思います。&lt;br /&gt;カスタムパラメータを作り、ボタンをプチっとしたら、何かが起こるというものです。&lt;br /&gt;これが出来れば、結構面白い事が出来るでしょう。&lt;br /&gt;楽しみの幅が広がりますね。&lt;br /&gt;&lt;br /&gt;ではでは、またの機会に・・・。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-1157953303403535082?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/1157953303403535082/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=1157953303403535082' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1157953303403535082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1157953303403535082'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/10/sukio-sukio-sukio-python-iii.html' title='Sukio Sukio Sukio Python - III'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-1502761454438370522</id><published>2008-10-18T05:00:00.001+09:00</published><updated>2011-09-17T13:40:22.075+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Sukio Sukio Sukio Python - II</title><content type='html'>Python好きよ好きよ好きよな初心者のためのPython講座その2です。&lt;br /&gt;&lt;br /&gt;今回は、if文をご紹介。&lt;br /&gt;ついでに、for文のもうひとつの使い方をご紹介します。&lt;br /&gt;今回は、Selectionをからめた使い方です。&lt;br /&gt;選択したものに対してのみ、実行するスクリプトを作ってみましょう。&lt;br /&gt;&lt;br /&gt;前回のIで作ったNullを作るスクリプトで、10個の並んだNullを作りましょう。&lt;br /&gt;&lt;br /&gt;スクリプトを使って、ある特定のオブジェクトを取得するというのは&lt;br /&gt;常に苦労するところです。&lt;br /&gt;コーディングをしていて、1/3くらいはそこに注力します。&lt;br /&gt;ですので、最重要であるといっても過言ではありません。&lt;br /&gt;気を遣って充分考えて取得しましょう。&lt;br /&gt;&lt;br /&gt;選択したものを変数に入れるには次の命令文を書きます。&lt;br /&gt;&lt;br /&gt;oSel = &lt;span style="color: #009900; font-weight: bold;"&gt;Application.GetValue&lt;/span&gt;("SelectionList")&lt;br /&gt;&lt;br /&gt;または&lt;br /&gt;&lt;br /&gt;oSel = &lt;span style="color: #009900; font-weight: bold;"&gt;Application.Selection&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;です。&lt;br /&gt;上記はCMを使い、下記はOMを使用しています。&lt;br /&gt;変数に代入されるのは、内部的には決定的に違いますが、結果はどちらも大して差はありません。&lt;br /&gt;10個のNullを選択して、実行してログを見てみましょう。&lt;br /&gt;ログを見るには、この命令文です。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Application.LogMessage&lt;/span&gt;(oSel)&lt;br /&gt;&lt;br /&gt;VBやJなら、両方とも選択したオブジェクト名がずらーっと表示されますが、Pythonの場合、ちょっとだけ違う結果になってしまいます。&lt;br /&gt;ここで変数のデータの型という定義が存在するのですが、進めながら少しずつお話しましょう。&lt;br /&gt;&lt;br /&gt;さて、選択された10個のNullを取得することが出来るようになりました。&lt;br /&gt;次に、その10個に対して、Sizeを少しずつ大きくしていく事にします。&lt;br /&gt;&lt;br /&gt;NullのSizeを変えるコマンドを知りたいので、ためしにひとつ選んでSizeを変えてみます。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Application.SetValue&lt;/span&gt;("null.null.size", 2, "")&lt;br /&gt;&lt;br /&gt;このようなログが出てきました。&lt;br /&gt;SetValueの第1引数は、ターゲット。第2引数はその値です。&lt;br /&gt;&lt;br /&gt;先ほど選択したものの変数oSelと前回のforを使い順々に処理していきます。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[i = 1app = ApplicationoSel = app.GetValue("SelectionList")for oObj in oSel:  app.SetValue(oObj.Name+".null.size", i, "")  i += 1]]&gt;&lt;/script&gt;&lt;br /&gt;ここでのポイントは、&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt;に対し、&lt;span style="color: #ff6600; font-weight: bold;"&gt;range&lt;/span&gt;ではなくoSelという変数を入れています。&lt;br /&gt;oSelのデータ型は、XSICollectionです。&lt;br /&gt;[null,null1,null2,null3,null4,null5,null6,null7,null8,null9]&lt;br /&gt;内部的には、このような格納されています。&lt;br /&gt;変わってrange(10)のデータ型は、リストです。&lt;br /&gt;[0,1,2,3,4,5,6,7,8,9]&lt;br /&gt;内部的には、こんな感じ。&lt;br /&gt;Pythonでの配列（Array）は、リスト、タプル、ディクショナリーと種類が存在しますがXSICollectionは、リストにとても近いです。&lt;br /&gt;ですので、oSelの左から順にoObjという変数に格納して、forのインデント内を実行しなさい。&lt;br /&gt;となります。&lt;br /&gt;1順目は、null(OM)がoObjに格納されて、処理されるという仕組みです。&lt;br /&gt;&lt;br /&gt;次に、&lt;span style="color: #009900; font-weight: bold;"&gt;SetValue&lt;/span&gt;の第1引数ですが、ターゲットを順に変えていく必要があります。&lt;br /&gt;&lt;br /&gt;app.&lt;span style="color: #009900; font-weight: bold;"&gt;SetValue&lt;/span&gt;(oObj.Name+".null.size", i, "")&lt;br /&gt;&lt;br /&gt;oObjには"null"が入っています。oObjは、オブジェクトモデルなので、Nameというパラメーターを取得出来ます。&lt;br /&gt;そして、iには、1が入っています。&lt;br /&gt;&lt;br /&gt;なので内部的には、こう解釈されます。&lt;br /&gt;&lt;br /&gt;app.&lt;span style="color: #009900; font-weight: bold;"&gt;SetValue&lt;/span&gt;("null.null.size", 1, "")&lt;br /&gt;&lt;br /&gt;最後の&lt;br /&gt;&lt;br /&gt;i += 1&lt;br /&gt;&lt;br /&gt;で、iに1が足されますので、結果2になりました。&lt;br /&gt;これで、1順目が終了です。&lt;br /&gt;&lt;br /&gt;次に2順目に行きます。&lt;br /&gt;仕組みは分かっていますので、次の命令文が実行される事になります。&lt;br /&gt;&lt;br /&gt;app.&lt;span style="color: #009900; font-weight: bold;"&gt;SetValue&lt;/span&gt;("null1.null.size", 2, "")&lt;br /&gt;&lt;br /&gt;こんな感じで、次々に処理され、NullのSizeがどんどん大きくなるというスクリプトが出来ました。&lt;br /&gt;&lt;br /&gt;それでは、次のステップに進みましょう。&lt;br /&gt;&lt;br /&gt;並べられた、Nullですが、全てに処理を適用するのではなく、ひとつ飛ばしに実行するには、どうしたらいいでしょう？&lt;br /&gt;ここで、if文が登場です。&lt;br /&gt;iの値が、偶数のときのみNullのSizeを変えるというのを実行することにしてみます。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[i = 1app = ApplicationoSel = app.GetValue("SelectionList")for oObj in oSel:  if i % 2 == 0:    app.SetValue(oObj.Name+".null.size", i, "")  else:    app.SetValue(oObj.Name+".null.size", 1, "")  i += 1]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt;文は、後に条件式が来ます。演算子（ここでは　"=="　お互いに等価であることを意味します）を境に、&lt;span style="color: #ff6600; font-weight: bold;"&gt;True&lt;/span&gt;（真）なのか&lt;span style="color: #ff6600; font-weight: bold;"&gt;False&lt;/span&gt;（偽）なのかを判断するだけです。&lt;br /&gt;ここでの条件式は&lt;br /&gt;&lt;br /&gt;i % 2 == 0&lt;br /&gt;&lt;br /&gt;%は、剰余を表します。剰余とは、割り算をしたときの余りのことです。&lt;br /&gt;つまり、2で割ったときに余りが0になるのは偶数なので、割り切れるときに&lt;span style="color: #ff6600; font-weight: bold;"&gt;True&lt;/span&gt;となり、&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt;文の中身が実行される仕組みです。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;else&lt;/span&gt;文は、&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt;が&lt;span style="color: #ff6600; font-weight: bold;"&gt;False&lt;/span&gt;のときに、実行されます。&lt;br /&gt;iが奇数のときは、Sizeを1にという命令文が実行されます。&lt;br /&gt;&lt;br /&gt;それでは、その上、4番目のNullにだけは、Sizeを0.1にするということをするには、どうしたらいいでしょうか？&lt;br /&gt;&lt;br /&gt;4番目のNullだけに適用したい場合、iの値が4では、偶数なので&lt;br /&gt;&lt;br /&gt;i % 2 == 0&lt;br /&gt;&lt;br /&gt;この式に、さらに、4以外という条件を付与しなければなりません。&lt;br /&gt;その値以外という演算子は!=を使います。&lt;br /&gt;&lt;br /&gt;i != 4&lt;br /&gt;&lt;br /&gt;ですので、偶数だけど、4以外という条件式は&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt; i % 2 == 0 &lt;span style="color: #ff6600; font-weight: bold;"&gt;and&lt;/span&gt; i != 4:&lt;br /&gt;&lt;br /&gt;とやり、&lt;span style="color: #ff6600; font-weight: bold;"&gt;and&lt;/span&gt;を入れます。&lt;br /&gt;&lt;br /&gt;そして4になるときの処理は、&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt;文が&lt;span style="color: #ff6600; font-weight: bold;"&gt;False&lt;/span&gt;になり、&lt;span style="color: #ff6600; font-weight: bold;"&gt;else&lt;/span&gt;にたどり着く前に&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt;文を定義しなくてはなりません。&lt;br /&gt;そのときは、&lt;span style="color: #ff6600; font-weight: bold;"&gt;elif&lt;/span&gt;文です。else ifを省略した形ですね。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;elif&lt;/span&gt; i == 4:&lt;br /&gt;&lt;br /&gt;この文を使って、こんな感じになりました。&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;&lt;![CDATA[i = 1app = ApplicationoSel = app.GetValue("SelectionList")for oObj in oSel:  if i % 2 == 0 and i != 4:    app.SetValue(oObj.Name+".null.size", i, "")  elif i == 4:    app.SetValue(oObj.Name+".null.size", 0.1, "")  else:    app.SetValue(oObj.Name+".null.size", 1, "")  i += 1]]&gt;&lt;/script&gt;&lt;br /&gt;4のときだけ、elif文が適用されるようになりました。&lt;br /&gt;これで、4番目のNullにだけ、Size 0.1が適用されます。&lt;br /&gt;&lt;br /&gt;if文は、こんな感じで、とてもシンプルです。&lt;br /&gt;複雑になるのは、条件式の部分。ここには、結構毎回悩まされますが、ロジックを探すのもスクリプトの面白さと言えるでしょう。&lt;br /&gt;&lt;br /&gt;今回も、かなり長くなってしまいましたが、コレでほぼPythonは手中に入れたようなものです。&lt;br /&gt;ほとんどのスクリプトは、&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt;文と&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt;文で成り立っています。&lt;br /&gt;物を自動的に判別するというところが、時間が一番かかるところ。&lt;br /&gt;処理するものは、Nullなのか、PolygonMeshなのか、Lightなのか、Passなのか。&lt;br /&gt;XSIには、とても多くのオブジェクトタイプが存在しますが、それを上回る判別方法がたくさん存在します。&lt;br /&gt;それをひとつひとつ見つけて行くことが進歩の秘訣です。&lt;br /&gt;&lt;br /&gt;それでは今回はこの辺で。&lt;br /&gt;次は、&lt;span style="color: #ff6600; font-weight: bold;"&gt;def&lt;/span&gt;でしょうか。これも大切なものでファンクションと呼ばれるものです。&lt;br /&gt;オブジェクトをPickして、実行するタイプのものを作りましょう。&lt;br /&gt;&lt;br /&gt;では、次回まで･･･。&lt;br /&gt;&lt;br /&gt;オタノシミニ☆&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-1502761454438370522?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/1502761454438370522/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=1502761454438370522' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1502761454438370522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1502761454438370522'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/10/sukio-sukio-sukio-python-ii.html' title='Sukio Sukio Sukio Python - II'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-1919100371364793059</id><published>2008-10-14T20:04:00.012+09:00</published><updated>2011-12-12T17:33:26.776+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Sukio Sukio Sukio Python - I</title><content type='html'>スクリプトの羅列とかいって、全然書いてなかったので、ちくちく書いてみる事にします。&lt;br /&gt;&lt;br /&gt;ですが、VBは良く分からんですし、いまさらJScriptをやるのはなんなので&lt;br /&gt;Pythonにスポットを当ててみようと思います。&lt;br /&gt;&lt;br /&gt;なんで、いちいち標準で入っている、VBやJを使わないん？&lt;br /&gt;&lt;br /&gt;って思いますが、Pythonを触り始めると、元に戻るのがイヤんなります。&lt;br /&gt;&lt;br /&gt;だまされたと思って、門をくぐってみるとたちまち便利な事に気づくでしょう。&lt;br /&gt;ただ、これを感じるのは、他の言語をやった人のみですが・・・。&lt;br /&gt;&lt;br /&gt;しかしながら、初心者の方もPythonからハジメテミルのはとっても良いと思います。&lt;br /&gt;&lt;br /&gt;なので、早速ゆーっくり初めてみましょう。&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;まずはじめに&lt;br /&gt;&lt;br /&gt;初心者の方には全く分からないと思いますが、XSIの命令文とPythonの命令文があります。&lt;br /&gt;XSIの命令文というのは、&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;GetPrim()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;とか&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;SetValue()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;とかXSIのマニュアルに書いてある命令文たちです。&lt;br /&gt;&lt;br /&gt;変わって、Pythonの命令文は&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;とか&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;とかが存在します。&lt;br /&gt;こちらは、XSIマニュアルには書いてません。&lt;br /&gt;webなどを参考にするしか手はありません。&lt;br /&gt;&lt;br /&gt;最初は、全然分からないと思いますが、見分けられるようになると、次のステップに上がったのかなと思ってもらってOKです。&lt;br /&gt;ちなみに、Pythonの命令文を覚えておきさえすれば、他のソフトでも同じやり方で通用するということになります。&lt;br /&gt;&lt;br /&gt;このサイトでは、&lt;span style="color: #ff6600; font-weight: bold;"&gt;Pythonの命令文&lt;/span&gt;、&lt;span style="color: #009900; font-weight: bold;"&gt;XSIの命令文&lt;/span&gt;と、このように表記しますね。&lt;br /&gt;&lt;br /&gt;それでは、第一回目。&lt;br /&gt;当然、&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt;を取り上げたいと思います。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt; i &lt;span style="color: #ff6600; font-weight: bold;"&gt;in&lt;/span&gt; &lt;span style="color: #ff6600; font-weight: bold;"&gt;range&lt;/span&gt;(10):&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;  &amp;nbsp;&amp;nbsp;Application.LogMessage&lt;/span&gt;( i )&lt;br /&gt;&lt;br /&gt;2行のこのスクリプトでは、0～9を表示せよ。&lt;br /&gt;という内容です。&lt;br /&gt;&lt;br /&gt;コピペして、スクリプトエディターで実行してログを見てみましょう。&lt;br /&gt;数字の羅列が表示されたと思います。&lt;br /&gt;&lt;br /&gt;それでは、2行目に注目してください。&lt;br /&gt;Pythonでは、インデントというものが、存在します。&lt;br /&gt;インデントというものは、&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt;の下の行のスペース、段落を意味します。&lt;br /&gt;これは、スペースでも、tabでもOKです。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt;文は、インデント内を繰り返す命令文です。&lt;br /&gt;他の言語では、インデントを付けるのは習慣で、無くても動作するんですが、Pythonでは、無くては動作しません。&lt;br /&gt;他の制作者が作っても必ずこの形になるので、コードが見やすくなるという特徴もあります。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;range&lt;/span&gt;文は、数字の羅列を生成します。&lt;br /&gt;結果を見ても分かりますが、0～9を生成します。&lt;br /&gt;10は、生成しません。&lt;br /&gt;コンピューターは、0が一番最初の数字と認識します。&lt;br /&gt;そして、10未満までというニュアンスでOKです。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;in&lt;/span&gt;文もありますが、簡単に言うと&lt;br /&gt;&lt;br /&gt;0～9を &lt;span style="font-weight: bold;"&gt;i&lt;/span&gt; という変数に順々に代入して、インデント内の処理をしなさい。&lt;br /&gt;&lt;br /&gt;という意味になります。&lt;br /&gt;&lt;br /&gt;ほとんどのスクリプトは、このような、ループ処理を多用しています。&lt;br /&gt;&lt;br /&gt;では、次に、nullを10個出してみましょう。&lt;br /&gt;&lt;br /&gt;app = &lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt; i &lt;span style="color: #ff6600; font-weight: bold;"&gt;in&lt;/span&gt; &lt;span style="color: #ff6600; font-weight: bold;"&gt;range&lt;/span&gt;(10):&lt;br /&gt;&amp;nbsp;&amp;nbsp;app.&lt;span style="color: #009900; font-weight: bold;"&gt;GetPrim&lt;/span&gt;("Null")&lt;br /&gt;&lt;br /&gt;for文の処理の中身だけを取り替えました。&lt;br /&gt;そして、行が増えましたが、少し簡略化してみました。&lt;br /&gt;Applicationと書くのは、少々手間ですので、appという変数にしてみました。&lt;br /&gt;このように、"."(ドット)の前は他の変数にする事が出来ます。&lt;br /&gt;&lt;br /&gt;そして、書き方には、もう一通りの書き方があります。&lt;br /&gt;&lt;br /&gt;app = &lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt; i &lt;span style="color: #ff6600; font-weight: bold;"&gt;in&lt;/span&gt; &lt;span style="color: #ff6600; font-weight: bold;"&gt;range&lt;/span&gt;(10):&lt;br /&gt;&amp;nbsp;&amp;nbsp;app.&lt;span style="color: #009900; font-weight: bold;"&gt;ActiveSceneRoot&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;AddNull&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;このようなものです。&lt;br /&gt;上記は、コマンドと呼びます（以下CM）&lt;br /&gt;XSIは、ボタンを押すとコマンドを呼び出して、結果を表示します。&lt;br /&gt;下記は、オブジェクトモデルです（以下OM）&lt;br /&gt;メニューやボタンからでは、呼び出すことが出来ない直接的なやり方です。&lt;br /&gt;計算を内部的に行い、スクリプトが終わったと同時に結果のみを表示します。&lt;br /&gt;スピードは、こちらのほうが、断然早いです。&lt;br /&gt;100個作成する。といった、スクリプトで試してみると一目瞭然だと思います。&lt;br /&gt;ただし、いきなりOMから入ると本当に訳が分からなくなるので、最初からはあまりオススメしません。&lt;br /&gt;&lt;br /&gt;次に進みます。&lt;br /&gt;ただ出すだけではつまらないので、作る度に1グリッド移動して配置するというものを作ってみましょう。&lt;br /&gt;&lt;br /&gt;一度、nullを作成して、xに1移動します。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Application.GetPrim&lt;/span&gt;("Null", "", "", "")&lt;br /&gt;&lt;span style="color: #009900; font-weight: bold;"&gt;Application.Translate&lt;/span&gt;("", 1, 0, 0, "siAbsolute", "siPivot", "siObj", "siX", "", "", "siXYZ", "", "", "", "", "", "", 0, "")&lt;br /&gt;&lt;br /&gt;これをコピペして、また同じように、&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt;文の中身だけ取り替えてみましょう。&lt;br /&gt;ですが、ここで、ちょっとしたポイントがあります。&lt;br /&gt;&lt;br /&gt;app = &lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt; i &lt;span style="color: #ff6600; font-weight: bold;"&gt;in&lt;/span&gt; &lt;span style="color: #ff6600; font-weight: bold;"&gt;range&lt;/span&gt;(10):&lt;br /&gt;&amp;nbsp;&amp;nbsp;app.&lt;span style="color: #009900; font-weight: bold;"&gt;GetPrim&lt;/span&gt;("Null", "", "", "")&lt;br /&gt;&amp;nbsp;&amp;nbsp;app.&lt;span style="color: #009900; font-weight: bold;"&gt;Translate&lt;/span&gt;("", &lt;span style="color: red; font-weight: bold;"&gt;i&lt;/span&gt;, 0, 0, "siAbsolute", "siPivot", "siObj", "siX", "", "", "siXYZ", "", "", "", "", "", "", 0, "")&lt;br /&gt;&lt;br /&gt;1のところを&lt;span style="color: red; font-weight: bold;"&gt;i&lt;/span&gt;にちょこっとだけ、変えています。&lt;br /&gt;スクリプトエディターで、&lt;span style="color: #009900; font-weight: bold;"&gt;Translate&lt;/span&gt;というところをハイライトして、?ボタンを押してみてください。&lt;br /&gt;マニュアルが表示されました。&lt;br /&gt;カッコ"()"の中身にいろいろ書いてありますが、iの部分の第2引数（"ひきすう"といいます）は、X座標を指定してあげればいいことが分かります。&lt;br /&gt;ですので、rangeで生成したiの変数を使用して、X座標を入れてあげます。&lt;br /&gt;&lt;br /&gt;nullを作ってXの0～9の座標に移動しなさい。&lt;br /&gt;&lt;br /&gt;といった、スクリプトが出来ました。&lt;br /&gt;&lt;br /&gt;XではなくYに移動させたい場合は第3引数のYのところを&lt;span style="color: red; font-weight: bold;"&gt;i&lt;/span&gt;にすればいいので&lt;br /&gt;&lt;br /&gt;app = &lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt; i &lt;span style="color: #ff6600; font-weight: bold;"&gt;in&lt;/span&gt; &lt;span style="color: #ff6600; font-weight: bold;"&gt;range&lt;/span&gt;(10):&lt;br /&gt;&amp;nbsp;&amp;nbsp;app.&lt;span style="color: #009900; font-weight: bold;"&gt;GetPrim&lt;/span&gt;("Null", "", "", "")&lt;br /&gt;&amp;nbsp;&amp;nbsp;app.&lt;span style="color: #009900; font-weight: bold;"&gt;Translate&lt;/span&gt;("", 0, &lt;span style="color: red; font-weight: bold;"&gt;i&lt;/span&gt;, 0, "siAbsolute", "siPivot", "siObj", "si&lt;span style="color: red; font-weight: bold;"&gt;Y&lt;/span&gt;", "", "", "siXYZ", "", "", "", "", "", "", 0, "")&lt;br /&gt;&lt;br /&gt;このように書けばOKです。&lt;br /&gt;第8引数のsiXが実は曲者ですが、フィルターをsiYにしましょう。&lt;br /&gt;&lt;br /&gt;そして、ちょっとダイエットするとコレだけで動作します。&lt;br /&gt;&lt;br /&gt;app = &lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt; i &lt;span style="color: #ff6600; font-weight: bold;"&gt;in&lt;/span&gt; &lt;span style="color: #ff6600; font-weight: bold;"&gt;range&lt;/span&gt;(10):&lt;br /&gt;&amp;nbsp;&amp;nbsp;app.&lt;span style="color: #009900; font-weight: bold;"&gt;GetPrim&lt;/span&gt;("Null")&lt;br /&gt;&amp;nbsp;&amp;nbsp;app.&lt;span style="color: #009900; font-weight: bold;"&gt;Translate&lt;/span&gt;("", &lt;span style="color: red; font-weight: bold;"&gt;i&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;実は、マニュアルの[]でくくられた引数は、省略することが出来ます。&lt;br /&gt;省略したらどうなるのかというと、デフォルト値がセットされることになっています。&lt;br /&gt;&lt;br /&gt;書き方はいろいろありますが、簡単な方法でやります。&lt;br /&gt;一番スマートな書き方は、このようになります。&lt;br /&gt;&lt;br /&gt;app = &lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;&lt;br /&gt;oRoot = &lt;span style="color: #009900; font-weight: bold;"&gt;Application.ActiveSceneRoot&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt; &lt;span style="color: red; font-weight: bold;"&gt;i&lt;/span&gt; &lt;span style="color: #ff6600; font-weight: bold;"&gt;in&lt;/span&gt; &lt;span style="color: #ff6600; font-weight: bold;"&gt;range&lt;/span&gt;(10):&lt;br /&gt;&amp;nbsp;&amp;nbsp;oNull = oRoot.&lt;span style="color: #009900; font-weight: bold;"&gt;AddNull&lt;/span&gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;oNull.&lt;span style="color: #009900; font-weight: bold;"&gt;posx&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;Value&lt;/span&gt; = &lt;span style="color: red; font-weight: bold;"&gt;i&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;OMを使用し、作ったNullを変数にして、posxパラメータをダイレクトに入力しています。&lt;br /&gt;何度も書きますが、スピードは、歴然です。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt;文の中に&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt;文を書くことも可能です。&lt;br /&gt;&lt;br /&gt;app = &lt;span style="color: #009900; font-weight: bold;"&gt;Application&lt;/span&gt;&lt;br /&gt;oRoot = &lt;span style="color: #009900; font-weight: bold;"&gt;Application.ActiveSceneRoot&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt; &lt;span style="color: red; font-weight: bold;"&gt;ix&lt;/span&gt; &lt;span style="color: #ff6600; font-weight: bold;"&gt;in&lt;/span&gt; &lt;span style="color: #ff6600; font-weight: bold;"&gt;range&lt;/span&gt;(10):&lt;br /&gt;&lt;span style="color: #ff6600; font-weight: bold;"&gt;&amp;nbsp;&amp;nbsp;for&lt;/span&gt; &lt;span style="color: red; font-weight: bold;"&gt;iy&lt;/span&gt; &lt;span style="color: #ff6600; font-weight: bold;"&gt;in&lt;/span&gt; &lt;span style="color: #ff6600; font-weight: bold;"&gt;range&lt;/span&gt;(10):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oNull = oRoot.&lt;span style="color: #009900; font-weight: bold;"&gt;AddNull&lt;/span&gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oNull.&lt;span style="color: #009900; font-weight: bold;"&gt;posx&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;Value&lt;/span&gt; = &lt;span style="color: red; font-weight: bold;"&gt;ix&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oNull.&lt;span style="color: #009900; font-weight: bold;"&gt;posy&lt;/span&gt;.&lt;span style="color: #009900; font-weight: bold;"&gt;Value&lt;/span&gt; = &lt;span style="color: red; font-weight: bold;"&gt;iy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;100個のNullが碁盤の目に並びましたね。&lt;br /&gt;&lt;br /&gt;と、このあたりで、訳が分からなくなる人続出でしょうから、&lt;span style="color: #ff6600; font-weight: bold;"&gt;for&lt;/span&gt;文は、このくらいにします。&lt;br /&gt;次回は、&lt;span style="color: #ff6600; font-weight: bold;"&gt;if&lt;/span&gt;ですね。&lt;br /&gt;&lt;br /&gt;オタノシミニ！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-1919100371364793059?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/1919100371364793059/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=1919100371364793059' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1919100371364793059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1919100371364793059'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/10/sukio-sukio-sukio-python-i.html' title='Sukio Sukio Sukio Python - I'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-3850628345516479908</id><published>2008-10-07T19:13:00.006+09:00</published><updated>2008-10-07T23:05:50.346+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Expression'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>画角と解像度の緻密な関係</title><content type='html'>今回はメモ的なログで。&lt;br /&gt;&lt;br /&gt;元の画像をキープしたまま、画像の見える範囲を広げたい。&lt;br /&gt;と思ったことはありませんか？&lt;br /&gt;&lt;br /&gt;ズームアウトで外側の枠だけを広げて2倍の解像度にしたい場合&lt;br /&gt;カメラの画角をどうやって設定したらいいか分かりますか？&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-9eu6tYGM5o/SOtShYeRxGI/AAAAAAAAAFE/ZwCBa2PYlnU/s1600-h/degree_view.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_-9eu6tYGM5o/SOtShYeRxGI/AAAAAAAAAFE/ZwCBa2PYlnU/s320/degree_view.jpg" alt="" id="BLOGGER_PHOTO_ID_5254384123716420706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;『画角を2倍、解像度2倍でいいんじゃね？』&lt;br /&gt;&lt;br /&gt;最初は誰もがそう考えるはずです。&lt;br /&gt;ワタクシも疑いませんでした。&lt;br /&gt;だけど、実際は違うのです。&lt;br /&gt;&lt;br /&gt;角度を2倍にしたら、見える範囲は2倍になるのは正しいのですが･･･。&lt;br /&gt;なんでかは、あんまり証明できないけれど、実際は違うみたいです。&lt;br /&gt;&lt;br /&gt;Mayaには、カメラスケールというものが存在していて、簡単に結果を出すことが出来たりしますが&lt;br /&gt;残念ながら、XSIには、標準でそんなものは用意されていません。&lt;br /&gt;&lt;br /&gt;なので、ピッタリ来る計算式を出してExpressionを組んで見ましょう。&lt;br /&gt;&lt;br /&gt;中学校でおなじみの懐かしの三角定理を使います。&lt;br /&gt;&lt;br /&gt;下図は、トップビューからの図です。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-9eu6tYGM5o/SOtQPgBCkGI/AAAAAAAAAE8/A3J-416qfl8/s1600-h/degree.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_-9eu6tYGM5o/SOtQPgBCkGI/AAAAAAAAAE8/A3J-416qfl8/s320/degree.jpg" alt="" id="BLOGGER_PHOTO_ID_5254381617480372322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;緑の角度　x　は、三角定理を使うので元の画角の1/2を示しています。&lt;br /&gt;求めたい赤の角度は　x'　として、これまた1/2とします。&lt;br /&gt;&lt;br /&gt;aは、仮想のプレーンを想像して、そこまでの距離の長さ&lt;br /&gt;bは、解像度の1/2の長さと仮定します。&lt;br /&gt;&lt;br /&gt;最終目的はbがn倍になったときに、x'　がどのように変化するかです。&lt;br /&gt;&lt;br /&gt;まずタンジェントを使います。&lt;br /&gt;&lt;br /&gt;tan(x)=b/a　...①&lt;br /&gt;&lt;br /&gt;が成り立ちます。&lt;br /&gt;&lt;br /&gt;xを出すには、arctanを使います。&lt;br /&gt;アークタンジェントとは、タンジェントの逆関数で、角度とか座標を求めるときに良く使ったりします。かなり便利なので、覚えて置くと◎です。&lt;br /&gt;&lt;br /&gt;tan(x) = y のときに、arctan(y) = xになります。&lt;br /&gt;&lt;br /&gt;これを利用して&lt;br /&gt;&lt;br /&gt;arctan(tan(x))=x&lt;br /&gt;&lt;br /&gt;①の式を使って&lt;br /&gt;&lt;br /&gt;arctan(b/a)=x&lt;br /&gt;&lt;br /&gt;です。&lt;br /&gt;bをn倍したら　x'　になるので&lt;br /&gt;&lt;br /&gt;arctan(nb/a)=x'&lt;br /&gt;&lt;br /&gt;になります。なので、また式を戻してみます。&lt;br /&gt;&lt;br /&gt;arctan(n･tan(x))=x'&lt;br /&gt;&lt;br /&gt;になります。これで、角度の半分が求まります。&lt;br /&gt;&lt;br /&gt;結果が求まりました！&lt;br /&gt;XSIのExpressionは、こんな感じでしょうか。&lt;br /&gt;&lt;br /&gt;atan(n*tan(Camera.camera.fov/2))*2&lt;br /&gt;&lt;br /&gt;ちなみにですが、ソフトによって、tan()は、radianしか入らなかったりするんですが&lt;br /&gt;XSIは、degreeで入ってくれますね。&lt;br /&gt;pythonでコレをやる場合は、radianをdegreeに変換して使いましょう。&lt;br /&gt;&lt;br /&gt;import math as m&lt;br /&gt;x=40&lt;br /&gt;n=1.1&lt;br /&gt;m.degrees(m.atan(n*m.tan(m.radians(x/2))))*2&lt;br /&gt;&lt;br /&gt;こんな感じですね。&lt;br /&gt;話がそれましたが･･･。&lt;br /&gt;&lt;br /&gt;数学って、こんな感じで使うんですよねー。&lt;br /&gt;美しいものです。&lt;br /&gt;&lt;br /&gt;こうやって、数学を覚えたりしたら、もうちょっと勉強したんだけどなぁ。&lt;br /&gt;数学って楽しいものなんですよね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-3850628345516479908?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/3850628345516479908/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=3850628345516479908' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/3850628345516479908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/3850628345516479908'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/10/blog-post.html' title='画角と解像度の緻密な関係'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-9eu6tYGM5o/SOtShYeRxGI/AAAAAAAAAFE/ZwCBa2PYlnU/s72-c/degree_view.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-5405873910648387422</id><published>2008-10-02T18:08:00.002+09:00</published><updated>2008-10-02T18:24:34.176+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>XSI7 - Solve a freezing probrem</title><content type='html'>XSI7、入れた当初は、不安定すぎ･･･。&lt;br /&gt;これじゃ、全然使えなさ過ぎ･･･。&lt;br /&gt;win2000互換じゃないとsample sceneが、開けなかったり、viewerが、shadedモードで&lt;br /&gt;サブディビかけただけで、青画面になったり･･･。&lt;br /&gt;&lt;br /&gt;などなど、不安だらけでしたが、青画面のログを見てみると、display driverなんちゃらかんちゃら、って書いてあったので、思い切って最新のドライバーに更新してみました。&lt;br /&gt;&lt;br /&gt;したら、全部解消されました♪&lt;br /&gt;&lt;br /&gt;win2000互換じゃなくても、sample落ちません♪&lt;br /&gt;&lt;br /&gt;サブディビも落ちなくなりました♪&lt;br /&gt;&lt;br /&gt;そのほかは知りませんが、ちょっとは前進したかも。&lt;br /&gt;&lt;br /&gt;みなさんも、最新のドライバー試して見るといいかもです。&lt;br /&gt;&lt;br /&gt;またエラーがあったら、報告しますね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-5405873910648387422?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/5405873910648387422/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=5405873910648387422' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/5405873910648387422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/5405873910648387422'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/10/xsi7-solve-freezing-probrem.html' title='XSI7 - Solve a freezing probrem'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-9005701028236606594</id><published>2008-09-10T22:38:00.006+09:00</published><updated>2008-09-11T01:00:05.477+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ICE'/><title type='text'>Real Time Ambient Occlusion via ICE</title><content type='html'>うひゃー。とても疲れました。&lt;br /&gt;&lt;br /&gt;でも、ワタクシでも出来ました。&lt;br /&gt;リアルタイムアンビエントオクルーヂョン。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-9eu6tYGM5o/SMfOvJJTE7I/AAAAAAAAAE0/g-xAvToZYBs/s1600-h/RT_AO.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/SMfOvJJTE7I/AAAAAAAAAE0/g-xAvToZYBs/s320/RT_AO.jpg" alt="" id="BLOGGER_PHOTO_ID_5244387600400323506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;めちゃくちゃ苦労しました・・・。&lt;br /&gt;しかも、出来たものは激重･･･。&lt;br /&gt;このシーン2000ポリしか無いんですが、CPUメーターがすぐ70%とか行ってしまいます。&lt;br /&gt;しかも、落ちやすいし・・・。&lt;br /&gt;さらに、VertexColorにコネクト出来ず、WeightMap止まりです。&lt;br /&gt;&lt;br /&gt;アルゴリズムの簡略化というものは、奥が深すぎます。&lt;br /&gt;ICE、奥が深すぎます。&lt;br /&gt;&lt;br /&gt;しかしながら、AOのアルゴリズムは、比較的簡単です。&lt;br /&gt;&lt;br /&gt;あるポイントから、ランダムに複数のレイを飛ばし、その遮蔽率でそのポイントの明るさを決定するものです。&lt;br /&gt;&lt;br /&gt;一行で終わるのか・・・orz&lt;br /&gt;&lt;br /&gt;なんだけど、CGの世界では、ベクトルが、物に当たるということを表現するのに物凄い労力が必要なのです。&lt;br /&gt;衝突判定の勉強をしていて良かったと思いました。&lt;br /&gt;とはいえ、最適化までは、手が伸びず、挫折しましたけど・・・。&lt;br /&gt;&lt;br /&gt;このICEノードで、苦労したところはー&lt;br /&gt;&lt;br /&gt;ポイントに対して、どうやって、ランダムレイをジェネレイトするのか。&lt;br /&gt;んー、まったく思いつきませんでした。&lt;br /&gt;それを解決したのは、コレ。&lt;br /&gt;&lt;span style="font-family: arial;font-size:100%;" &gt;&lt;strong style="font-weight: bold;"&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Random Integer&lt;br /&gt;http://community.softimage.com/downloads.php?do=file&amp;amp;id=138&lt;br /&gt;&lt;br /&gt;Moduloで、ランダム値を発生させるとは・・・。アメイズィング！ジーニアス！&lt;br /&gt;素晴らしすぎるので、５ツ星を付けてみました。&lt;br /&gt;こういう単純なものって、宝物ですわね。&lt;br /&gt;Halfdan Ingvarsson様に感謝です。&lt;br /&gt;&lt;br /&gt;あとは、helge mathee様のTutorial - Arrays in ICE on Vimeoです。&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt;    &lt;param name="allowfullscreen" value="true"&gt;    &lt;param name="allowscriptaccess" value="always"&gt;    &lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1497673&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1"&gt;    &lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=1497673&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/1497673?pg=embed&amp;amp;sec=1497673"&gt;Tutorial - Arrays in ICE&lt;/a&gt; from &lt;a href="http://vimeo.com/user656111?pg=embed&amp;amp;sec=1497673"&gt;helge mathee&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;amp;sec=1497673"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;ArrayのValueをリニアに作ることすら出来なかったワタクシには、とてつもなく参考になりました。&lt;br /&gt;感謝です。ありがとうございます。&lt;br /&gt;&lt;br /&gt;XSI7のtrialが、今日切れるので、しばらくお預けですな。&lt;br /&gt;でも、出来てほっとしましたYO！&lt;br /&gt;&lt;br /&gt;次は、何作ろうかなー。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-9005701028236606594?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/9005701028236606594/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=9005701028236606594' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/9005701028236606594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/9005701028236606594'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/09/real-time-ambient-occlusion-via-ice.html' title='Real Time Ambient Occlusion via ICE'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-9eu6tYGM5o/SMfOvJJTE7I/AAAAAAAAAE0/g-xAvToZYBs/s72-c/RT_AO.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-9029172889101971952</id><published>2008-09-01T18:34:00.005+09:00</published><updated>2008-09-01T19:11:46.821+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ICE'/><category scheme='http://www.blogger.com/atom/ns#' term='Deformation'/><title type='text'>ICE - Deformation Basic</title><content type='html'>ICEを使った、とても基本的なDeformationです。&lt;br /&gt;&lt;br /&gt;現状のバージョンでは、基本的にICEは、Kinematicsに値を入れることは出来なくなっています。&lt;br /&gt;環境変数を変えれば可能ですが、サポート対象外です。なんでかはナゾですが。&lt;br /&gt;&lt;br /&gt;ですので、ポイント情報を、ヌルの変換にそのまま追従させる、poseコンストもどきをやってみました。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-9eu6tYGM5o/SLu3XPhgfPI/AAAAAAAAAEM/684GYNzjAvg/s1600-h/ICEtreeMatchTransform_view.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_-9eu6tYGM5o/SLu3XPhgfPI/AAAAAAAAAEM/684GYNzjAvg/s320/ICEtreeMatchTransform_view.jpg" alt="" id="BLOGGER_PHOTO_ID_5240984201307651314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ICE Treeの構造です。&lt;br /&gt;&lt;br /&gt;cubeに、ICE Treeを構築します。&lt;br /&gt;Set Dataに、self.PointPositionをセットします。&lt;br /&gt;Multiply Vector by Matricsノードを繋ぎます。&lt;br /&gt;Get Dataノードに、self.PointPositionをセットし、上記ノードのvectorに接続します。&lt;br /&gt;別のGet Dataノードに、null.kine.localをセットし、Matrixに接続します。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-9eu6tYGM5o/SLu3bCVTRtI/AAAAAAAAAEU/hkIbFY1OKHY/s1600-h/ICEtreeMatchTransform.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/SLu3bCVTRtI/AAAAAAAAAEU/hkIbFY1OKHY/s320/ICEtreeMatchTransform.jpg" alt="" id="BLOGGER_PHOTO_ID_5240984266486269650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;以上で、nullの動きを伝えるICE Treeが完成です。&lt;br /&gt;&lt;br /&gt;次に、WeightMapを利用して、2つのnullをコントローラーとした&lt;br /&gt;Envelopeの基本のICE Treeです。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-9eu6tYGM5o/SLu8cQGZ1wI/AAAAAAAAAEc/xMy3iXlKXvc/s1600-h/ICEtreeEnvelopeBasic.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_-9eu6tYGM5o/SLu8cQGZ1wI/AAAAAAAAAEc/xMy3iXlKXvc/s320/ICEtreeEnvelopeBasic.jpg" alt="" id="BLOGGER_PHOTO_ID_5240989784919889666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Set Dataにself.PointPositionをセットします。&lt;br /&gt;Multiply Vector by Matrixに接続します。&lt;br /&gt;Get Dataノードに、self.PointPositionをセットし、上記ノードVectorに接続。&lt;br /&gt;Linear Interpolateノードを取得し、MVbMのMatrixに接続します。&lt;br /&gt;上記ノードのFirstにGet Dataノード、null.kine.localを接続します。&lt;br /&gt;SecondにGet Dataノード、null1.kine.localを接続します。&lt;br /&gt;Blendに、Get Weight Map Valueをつなげれば、完成です。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-9eu6tYGM5o/SLu8gqhlq6I/AAAAAAAAAEk/1YJouJwvcL8/s1600-h/ICEtreeEnvelopeBasic_view.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/SLu8gqhlq6I/AAAAAAAAAEk/1YJouJwvcL8/s320/ICEtreeEnvelopeBasic_view.jpg" alt="" id="BLOGGER_PHOTO_ID_5240989860732709794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;多分、これをたーくさん増やしていけば、ICE Envelopeが完成するはずです。&lt;br /&gt;でも、面倒なので、やってません･･･。&lt;br /&gt;ハッキリ言って、Compounds待ちです。そこまで、頭良く無いのです。残念ながら・・・。&lt;br /&gt;Dual &lt;strong style="font-weight: normal;"&gt;Quaternionが待ち遠しいなぁ。&lt;br /&gt;&lt;br /&gt;早く登場しないかなー。&lt;br /&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-9029172889101971952?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/9029172889101971952/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=9029172889101971952' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/9029172889101971952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/9029172889101971952'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/09/ice-deformation-basic.html' title='ICE - Deformation Basic'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-9eu6tYGM5o/SLu3XPhgfPI/AAAAAAAAAEM/684GYNzjAvg/s72-c/ICEtreeMatchTransform_view.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-6232036908571461849</id><published>2008-08-14T14:18:00.006+09:00</published><updated>2008-08-14T17:14:25.456+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FBX'/><category scheme='http://www.blogger.com/atom/ns#' term='Animation'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Scalingのワナ</title><content type='html'>Scalingには、トラップが仕掛けてあります。&lt;br /&gt;&lt;br /&gt;何にも知らないで、ほかのソフトでアニメーションを付けXSIで、再現しようとして、Importすると&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;んじゃコレっ？！&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;てな結果があったりします。&lt;br /&gt;そのほか、nullの軸が90度になっておらず、変な形になっている？&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;・・・まいっか。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;という経験がある方もいらっしゃると思います。&lt;br /&gt;&lt;br /&gt;XSIのScalingには、2つのモードがあるのはご存知でしょうか？&lt;br /&gt;Kinematics Local のScalingタブの、Scaling Computationという欄に&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Hierarchical (Softimage) Scaling&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;とうものが存在します。&lt;br /&gt;通常は、オンになってます。&lt;br /&gt;&lt;br /&gt;下図は、&lt;br /&gt;&lt;br /&gt;上オフ&lt;br /&gt;下オン&lt;br /&gt;&lt;br /&gt;になっていて、左のnullが親で、右のnullを子供にしていてposX:3、rotY45がそれぞれ入っています。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-9eu6tYGM5o/SKPAZqZeQ7I/AAAAAAAAAD0/UXfv1RnYV8g/s1600-h/Scaling1.0.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_-9eu6tYGM5o/SKPAZqZeQ7I/AAAAAAAAAD0/UXfv1RnYV8g/s320/Scaling1.0.jpg" alt="" id="BLOGGER_PHOTO_ID_5234238739045041074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;親のnull（左）をぞれぞれ、Xに0.5スケールしてみます。&lt;br /&gt;するとこんな感じです。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-9eu6tYGM5o/SKPBbDZkkVI/AAAAAAAAAEE/kSl3tQYpWvw/s1600-h/Scaling0.5.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_-9eu6tYGM5o/SKPBbDZkkVI/AAAAAAAAAEE/kSl3tQYpWvw/s320/Scaling0.5.jpg" alt="" id="BLOGGER_PHOTO_ID_5234239862447837522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;スケールの印象からすると、オフ状態の上が正しい結果なんでしょうね。&lt;br /&gt;見た目に、nullが親の形状に沿って変形しています。&lt;br /&gt;反面、Defaultの、&lt;span style="font-weight: bold;"&gt;Hierarchical (Softimage) Scaling&lt;/span&gt;をオンにした状態のnull（下）では、子供のsclxのみにしか変換がかかりません。&lt;br /&gt;&lt;br /&gt;これは、Rotationをかえて、どんどんと階層を作った場合、Scaleの変換が正しく行われないことを意味します。&lt;br /&gt;&lt;br /&gt;ということで、オフにして、作業すればOKです。&lt;br /&gt;&lt;br /&gt;気をつけなければならないことは、MotionBuilderなどで、作ったFBXをImportして、骨に流し込むときには、&lt;span style="font-weight: bold;"&gt;Hierarchical (Softimage) Scaling&lt;/span&gt;は、オンにしていないとうまくきません。&lt;br /&gt;MotionBuilderのScalingのモードは、&lt;span style="font-weight: bold;"&gt;Hierarchical (Softimage) Scalingがオンのときと一緒&lt;/span&gt;です。&lt;br /&gt;なので、Importするときは、オンにして、読み込みましょう。&lt;br /&gt;&lt;br /&gt;バチコン来ます！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-6232036908571461849?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/6232036908571461849/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=6232036908571461849' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/6232036908571461849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/6232036908571461849'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/08/scaling.html' title='Scalingのワナ'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-9eu6tYGM5o/SKPAZqZeQ7I/AAAAAAAAAD0/UXfv1RnYV8g/s72-c/Scaling1.0.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-4013281658373843260</id><published>2008-08-12T20:31:00.009+09:00</published><updated>2008-09-01T19:18:27.142+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>XSI 7 and Python Install Tips</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-9eu6tYGM5o/SKF0sIJ35iI/AAAAAAAAADk/Sx81ATA617k/s1600-h/XSI7.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_-9eu6tYGM5o/SKF0sIJ35iI/AAAAAAAAADk/Sx81ATA617k/s320/XSI7.jpg" alt="" id="BLOGGER_PHOTO_ID_5233592543433188898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;遂に、我がマシンにも導入されました。&lt;br /&gt;いじり倒してやるっ。&lt;br /&gt;&lt;br /&gt;と思ったのも束の間、ICEの敷居の高さに、正直ビビリマシタ･･･。&lt;br /&gt;&lt;br /&gt;はっきり言って、デザイナーが気軽に覚えられるものでは到底ありません･･･。&lt;br /&gt;スクリプトをちょっと書けるレベルだけじゃ&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;全然ダメ&lt;/span&gt;&lt;/span&gt;です。&lt;br /&gt;CGソフトのことを心底愛していないと使いこなすことは出来ません。&lt;br /&gt;&lt;br /&gt;た・だ、そこを克服することが出来れば、レベルはまた一段階上がることでしょう。&lt;br /&gt;ICE MASTERの道は、かなり果てしないものに見えますが、一歩一歩上がって行けば、大丈夫です。（きっと）&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-9eu6tYGM5o/SKF0vnSasvI/AAAAAAAAADs/zWYy0Q7t8LA/s1600-h/python_window.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_-9eu6tYGM5o/SKF0vnSasvI/AAAAAAAAADs/zWYy0Q7t8LA/s320/python_window.jpg" alt="" id="BLOGGER_PHOTO_ID_5233592603330130674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;そんでもって、やっとわが社にもPythonが導入される兆しが見えました。&lt;br /&gt;やっりぃ。&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;XSI&lt;/span&gt;で、Pythonを使うには、&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ActivePython&lt;/span&gt;をサーバーに入れるってのが&lt;br /&gt;一番楽でしたが、&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;ActivePython&lt;/span&gt;は、あくまで擬似らしくPythonとは違うみたいです。&lt;br /&gt;&lt;br /&gt;なので、Pythonじゃなきゃいやじゃ！&lt;br /&gt;&lt;br /&gt;とゴネて、無理クリやってもらいました。&lt;br /&gt;&lt;br /&gt;そもそも、&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;XSI&lt;/span&gt;で、Pythonを使えるようにするには、&lt;br /&gt;&lt;a class="boBody" href="http://www.python.org/"&gt;&lt;span class="DkMagenta"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.python.org/"&gt;http://www.python.org&lt;/a&gt;&lt;br /&gt;本家から、Python本体をDownloadする。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/pywin32"&gt;http://sourceforge.net/projects/pywin32&lt;/a&gt;&lt;br /&gt;から、さらに、Python for Windows ExtensionsをDownloadして&lt;br /&gt;Installしなくてはなりません。&lt;br /&gt;&lt;br /&gt;このExtensionsが曲者でして、Pythonが、ローカルマシンにInstallされていないと&lt;br /&gt;Installerが機能しない点にありました。&lt;br /&gt;全てのデザイナーが使える環境にするには、一台一台入れていかないといけない状態です。&lt;br /&gt;&lt;br /&gt;ですが、この手順で、サーバーにPythonをおいて、それを見に行けるようすることが可能です。&lt;br /&gt;&lt;br /&gt;1. 一旦ローカルにInstallしてしまい、XSIを一度起動して、すぐ落とします。&lt;br /&gt;&lt;br /&gt;2. %PythonPath%\Lib\site-packages内の拡張モジュール類を、サーバーPythonのsite-packagesフォルダ内にコピー。&lt;br /&gt;&lt;br /&gt;3. ローカルにある、PythonのDLL類も全てサーバーにコピー。&lt;br /&gt;（python25.dll、pythoncom25.dll、pywintypes25.dll←コレたちだけかな？エラーが出たらスミマセンそれもコピーで）&lt;br /&gt;&lt;br /&gt;4. 環境変数のPython Pathをサーバーに指定。ついでにPathもPythonフォルダに通しておきます。&lt;br /&gt;&lt;br /&gt;5. %PythonPath%\Lib\site-packages\win32comext\axscript\client\pyscript.pyを実行。&lt;br /&gt;（レジストリを書き換えるスクリプトなので、Admin権限が必要です。）&lt;br /&gt;&lt;br /&gt;で、出来ました♪&lt;br /&gt;&lt;br /&gt;一部、気をつけなければいけないことは&lt;br /&gt;%PythonPath%\Lib\site-packages\win32com\gen_py&lt;br /&gt;ここの中身は、ユーザーが書き込めるようにしなければならないので&lt;br /&gt;&lt;br /&gt;%PythonPath%\Lib\site-packages\win32com\__init__.py&lt;br /&gt;内のgen_pathを書き換え&lt;br /&gt;&lt;br /&gt;__gen_path__ = os.getenv('TEMP')&lt;br /&gt;&lt;br /&gt;などにして、Localに作るようにします。&lt;br /&gt;&lt;br /&gt;コレで、たくさんのマシンにインストールしまくることなく、サーバーをアップデートなりで&lt;br /&gt;一括で管理出来る事になります。&lt;br /&gt;&lt;br /&gt;ううーん。スバラシイ！&lt;br /&gt;&lt;br /&gt;というわけで、JScriptとは、オサラバ。サヨウナラ。&lt;br /&gt;Mayaも、MotionBuilderも、Pythonなので、Python一筋です。&lt;br /&gt;&lt;br /&gt;がっつり行きましょうー。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-4013281658373843260?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/4013281658373843260/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=4013281658373843260' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/4013281658373843260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/4013281658373843260'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/08/xsi-7-and-python-install-tips.html' title='XSI 7 and Python Install Tips'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-9eu6tYGM5o/SKF0sIJ35iI/AAAAAAAAADk/Sx81ATA617k/s72-c/XSI7.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-622582986748783009</id><published>2008-08-07T10:30:00.005+09:00</published><updated>2008-08-07T10:30:14.127+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reel'/><title type='text'>XSIのトップをひたすら走る方々</title><content type='html'>同じXSIとして、心強いですねー。&lt;br /&gt;&lt;br /&gt;psyop - HP Maestro&lt;br /&gt;&lt;br /&gt;psyopの作るものはいつ見てもホレボレします。&lt;br /&gt;めちゃくちゃカッコいいス。&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="349"&gt;&lt;param name="movie" value="http://www.youtube.com/v/vpG8J5j24Uc&amp;amp;hl=ja&amp;amp;fs=1&amp;amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/vpG8J5j24Uc&amp;amp;hl=ja&amp;amp;fs=1&amp;amp;border=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="349"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;The Mill - Behind the Scenes of Mitsubishi Eclipse Robot Factory&lt;br /&gt;&lt;br /&gt;The Millは、ワタクシ外部に対してとても弱いので、この前のセミナーで初めて知りました。&lt;br /&gt;うひっ。1000万ポリゴンすカ。レベルの違いを感じます・・・。&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="349"&gt;&lt;param name="movie" value="http://www.youtube.com/v/pUvaSS_In_0&amp;amp;hl=ja&amp;amp;fs=1&amp;amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/pUvaSS_In_0&amp;amp;hl=ja&amp;amp;fs=1&amp;amp;border=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="349"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-622582986748783009?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/622582986748783009/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=622582986748783009' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/622582986748783009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/622582986748783009'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/08/xsi.html' title='XSIのトップをひたすら走る方々'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-6960678989464712647</id><published>2008-08-06T10:53:00.007+09:00</published><updated>2008-08-06T11:19:59.321+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Animation'/><title type='text'>Manage Device Drivers</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-9eu6tYGM5o/SJkKAnR5V7I/AAAAAAAAADU/VG2NSszTWnc/s1600-h/dm_1st.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_-9eu6tYGM5o/SJkKAnR5V7I/AAAAAAAAADU/VG2NSszTWnc/s320/dm_1st.jpg" alt="" id="BLOGGER_PHOTO_ID_5231223447827863474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;んん～？またしても、全然知らなかった機能が･･･。&lt;br /&gt;&lt;br /&gt;Animation -&gt; Tools&lt;br /&gt;-&gt; Devices -&gt; Manage Device Drivers&lt;br /&gt;&lt;br /&gt;今日、初めてボタンを押しました･･･orz&lt;br /&gt;一体何年使ってるんだ･･･。&lt;br /&gt;&lt;br /&gt;コレってなんだか、SIにもあったような気がする・・・。&lt;br /&gt;全然覚えて無いけど。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-9eu6tYGM5o/SJkKHDlROPI/AAAAAAAAADc/5d56ACz_Kng/s1600-h/dm_2nd.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/SJkKHDlROPI/AAAAAAAAADc/5d56ACz_Kng/s320/dm_2nd.jpg" alt="" id="BLOGGER_PHOTO_ID_5231223558504528114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;使い方は、Addから、Mouseを選択。&lt;br /&gt;MouseプロパティをInspectして、そのままActiveをOn。&lt;br /&gt;&lt;br /&gt;Mouseの動きがキャプれます。&lt;br /&gt;コレは使えるカモ！！！&lt;br /&gt;（って思った人は、何人居るんだろう・・・。）&lt;br /&gt;&lt;br /&gt;Defaultでは、Mouse-xが、選択されたもののposxにバインドされていますな。rotにも出来るのが嬉しいですな。&lt;br /&gt;&lt;br /&gt;中クリックで、キャプチャー開始。右クリで、キャプチャー終了。&lt;br /&gt;&lt;br /&gt;左クリックは、なんも入っていないので、Command - FirstFrameとか入れておけば、スタートフレームに戻れますね。&lt;br /&gt;&lt;br /&gt;早速、カメラの画ブレモーションに入れてみよう。上手くいくかなー？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-6960678989464712647?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/6960678989464712647/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=6960678989464712647' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/6960678989464712647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/6960678989464712647'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/08/manage-device-drivers.html' title='Manage Device Drivers'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-9eu6tYGM5o/SJkKAnR5V7I/AAAAAAAAADU/VG2NSszTWnc/s72-c/dm_1st.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-514210558443925940</id><published>2008-08-05T17:01:00.011+09:00</published><updated>2008-08-05T17:24:31.704+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rendering'/><title type='text'>mental ray の基本中～の基本。</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-9eu6tYGM5o/SJgLA-WHKWI/AAAAAAAAACs/1zVxZcL8q2c/s1600-h/mr_rnd.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/SJgLA-WHKWI/AAAAAAAAACs/1zVxZcL8q2c/s320/mr_rnd.jpg" alt="" id="BLOGGER_PHOTO_ID_5230943078554478946" border="0" /&gt;&lt;/a&gt;アンチエイリアシングの設定をどうすればいいのか分からない？&lt;br /&gt;そんなの簡単だよ。こうやってこうやってこうすりゃいいじゃん。&lt;br /&gt;なるほどね。こういうふうに設定すればいいのか。&lt;br /&gt;&lt;br /&gt;でも、設定した値の意味は、分からないまま。&lt;br /&gt;&lt;br /&gt;現状では、分かっている人が、分かっていない人に仕様書を渡せば良かったのです。&lt;br /&gt;それでほとんどエラーなく、すんなりレンダリングが出来たはずでした。&lt;br /&gt;&lt;br /&gt;だけど、近年、データの巨大化が進む中、同じ設定では、レンダリングが出来る出来ないが顕著になってきました。&lt;br /&gt;&lt;br /&gt;Hair、FG、SSSなどなどなど･･･。管理職泣かせの技術たち。&lt;br /&gt;&lt;br /&gt;そこで、エラーで止まってしまうフレームが出てきた場合どのようにしてレンダリングをかけられるようになるのかを結構はしょりで説明したいと思います。&lt;br /&gt;&lt;br /&gt;今回は、エイリアシングの設定から。&lt;br /&gt;&lt;br /&gt;Aliasing ( Raytracing &amp;amp; Scanline Only )とSampling Contrastには、常に密接な関係があります。&lt;br /&gt;&lt;br /&gt;まず、Sampling Contrastから説明することにしましょう。&lt;br /&gt;この設定の値はカラーです。RGBAの4つの値から成っています。&lt;br /&gt;この値は、レンダリングされる絵のピクセルとピクセルの差を見ています。&lt;br /&gt;&lt;br /&gt;■□&lt;br /&gt;↑ピクセルのつもり&lt;br /&gt;&lt;br /&gt;例えば、上記のようにピクセルが、RGBAが0（つまり真っ黒）と1（真っ白）の様な絵があったとしましょう。2ピクセルの絵と考えてください。&lt;br /&gt;その場合、ピクセルとピクセルの色の差は、1-0の1になるわけです。&lt;br /&gt;現在のSampling Contrastの設定は、全て0.2ですので、Aliasing ( Raytracing &amp;amp; Scanline Only )のMax Levelでアンチエイリアシングがかかります。&lt;br /&gt;この場合、Max Levelの1が適用されます。&lt;br /&gt;&lt;br /&gt;■■&lt;br /&gt;&lt;br /&gt;次の例は、真っ黒なピクセルが隣り合った場合です。&lt;br /&gt;この場合は、ピクセルとピクセルの色の差は、0-0の0です。&lt;br /&gt;Sampling Contrastと比較して差が許容範囲なので、Aliasing ( Raytracing &amp;amp; Scanline Only )のMin Levelでアンチエイリアシングがかかります。&lt;br /&gt;この場合は、Min Levelの-1が適用される訳です。（ほんとは、もうちょっと複雑な判定をします）&lt;br /&gt;&lt;br /&gt;画像でコントラストの差を視覚的に見てみましょう。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-9eu6tYGM5o/SJgKaPNbvDI/AAAAAAAAACk/c05fbEvIibU/s1600-h/mr_cnt.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_-9eu6tYGM5o/SJgKaPNbvDI/AAAAAAAAACk/c05fbEvIibU/s320/mr_cnt.jpg" alt="" id="BLOGGER_PHOTO_ID_5230942413066583090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ま、だいたい、0.05だと人間視覚的に限界なんじゃね？ということが分かります。&lt;br /&gt;ということは、最終レンダレベルだと、Sampling Contrastは0.05くらいで良さそうですね。&lt;br /&gt;プレビューなら、0.2とかにして、Min Levelの面積を大きくしてあげれば、プレビュー時間を短くすることが出来ます。&lt;br /&gt;&lt;br /&gt;これで、色の差のコントラストが少ないときにはレベルを下げて、色の差が大きい場合はレベルを上げてレンダリング時間を効率よく使う事が出来ます。&lt;br /&gt;&lt;br /&gt;例えば、真っ黒な部分の計算をしようとしたとき、全てのLevelが2の高い状態で計算するのは時間の無駄だという事です。&lt;br /&gt;なぜ、時間の無駄かといのは、次の説明を読めば分かることでしょう。&lt;br /&gt;&lt;br /&gt;Aliasing ( Raytracing &amp;amp; Scanline Only )のレベルとは、どういう意味なのか。&lt;br /&gt;0の場合は、そのピクセル単体をそのまま計算します。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-9eu6tYGM5o/SJgJIXSiwiI/AAAAAAAAACM/0sY1Ck6C7PA/s1600-h/mr_lvl0.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_-9eu6tYGM5o/SJgJIXSiwiI/AAAAAAAAACM/0sY1Ck6C7PA/s320/mr_lvl0.jpg" alt="" id="BLOGGER_PHOTO_ID_5230941006486225442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;アンチエイリアシング無しの状態です。ギザギザ。&lt;br /&gt;&lt;br /&gt;1の場合は、ピクセルを4分割して、サブピクセルとして計算します。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-9eu6tYGM5o/SJgJYNI8ZRI/AAAAAAAAACU/6fUownYSvKU/s1600-h/mr_lvl1.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_-9eu6tYGM5o/SJgJYNI8ZRI/AAAAAAAAACU/6fUownYSvKU/s320/mr_lvl1.jpg" alt="" id="BLOGGER_PHOTO_ID_5230941278639514898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ちょっとまだ、アンチエイリアシングが甘いかな？という状態です。&lt;br /&gt;でも、ブラーがかかるのなら、このくらいで十分いけるし、0でもいいんじゃね？って感じです。&lt;br /&gt;&lt;br /&gt;2の場合は、ピクセルを16分割して、サブピクセルとして計算します。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-9eu6tYGM5o/SJgKMSaeIQI/AAAAAAAAACc/tFfd6AKKP2Y/s1600-h/mr_lvl2.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_-9eu6tYGM5o/SJgKMSaeIQI/AAAAAAAAACc/tFfd6AKKP2Y/s320/mr_lvl2.jpg" alt="" id="BLOGGER_PHOTO_ID_5230942173408403714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;これくらいなら、ほぼジャギる事は無いでしょう。&lt;br /&gt;これ以上上げると時間が重くなり過ぎて、自分の首を絞めることウケアイ。&lt;br /&gt;&lt;br /&gt;つまり、Levelが1の場合は、単純に解像度を2倍で計算している事とだいたい同じになります。&lt;br /&gt;Levelが2の場合は解像度4倍です。&lt;br /&gt;&lt;br /&gt;逆に、-1の場合はどうなるかというと、4ピクセルに対して、1回しか計算しようとしません。&lt;br /&gt;つまり、Levelが-1の場合は、なんと解像度1/2で計算している事と同じになるのです。&lt;br /&gt;こんな設定仕事では、使ってはいけません（結構居るんだな。コレが。※ちなみに、Vrayでも大体同じ）&lt;br /&gt;&lt;br /&gt;ようするに、最終レンダリングをする場合、-1という値を入れて計算をするというのは、得策ではありません。&lt;br /&gt;当然、ジャギーが発生する事になります。&lt;br /&gt;ただし、Sampling Contrastの設定次第では、うまくいくかもしれません。&lt;br /&gt;0.005の様な、肉眼で分からないくらいの色の差であれば、-1で計算しても良いかもしれません。&lt;br /&gt;けれど、4ピクセルに対して1回しか計算できないので、細い剣の様な物をレンダリングする場合や、テクスチャがとても細かい場合、レイがヒットすることなく真っ黒なピクセルとして計算されることが多々あります。&lt;br /&gt;&lt;br /&gt;逆に、Levelが2であって、16ピクセル分の計算をしたとしても、それ以上のテクスチャの解像度がある場合、ちらつきが発生してしまいます。&lt;br /&gt;意味無さ杉くん。&lt;br /&gt;テクスチャの解像度がデカければデカいほど良い訳では無いことを十分理解しておいてください。&lt;br /&gt;キャラクターがどのくらいのサイズでレンダリングされるのかを判断して、テクスチャのサイズを小さくする事が必要になります。&lt;br /&gt;テクスチャのサイズを小さくすることで、メモリの確保も出来るほか、ちらつきを抑える事が出来るでしょう。&lt;br /&gt;&lt;br /&gt;ちなみに、メモリに関して、マニュアルにはこんな事が書いてありました。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;メモリ要件の計算で使用される標準規則では、サーフェイス上の三角形1000個につき1MBのメモリが割り当てられます。&lt;br /&gt;512× 512のテクスチャごとに、1MBの追加メモリが必要になります&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;だそうです。&lt;br /&gt;つ・ま・り、1Triangleで、1B消費するってことだから、100万Triangleで、1GBのメモリを消費するってことです。&lt;br /&gt;&lt;br /&gt;分かりやすっ。&lt;br /&gt;&lt;br /&gt;（でも、結構長い間、知らずに過ごして来ました･･･。）&lt;br /&gt;&lt;br /&gt;でもこれ、ギガポリゴンコアって、どうなるんだろう・・・。&lt;br /&gt;ギガポリゴンコアだから、大丈夫なのか？！&lt;br /&gt;IIになるし、大丈夫なのか？！&lt;br /&gt;&lt;br /&gt;最後に、アンチを決定する際、熟練の技として&lt;br /&gt;&lt;br /&gt;まず、これで、いいだろうと思われる値をセットします。&lt;br /&gt;次に、3枚だけレンダリングします。&lt;br /&gt;3枚をループ再生します。&lt;br /&gt;&lt;br /&gt;コレだけで、ちらついているかが分かるようになります。&lt;br /&gt;&lt;br /&gt;だいたい。&lt;br /&gt;&lt;br /&gt;だいたいね。&lt;br /&gt;&lt;br /&gt;だいたいだかんね。&lt;br /&gt;&lt;br /&gt;だから、全フレ計算するなんて、アホなことすんなよっ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-514210558443925940?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/514210558443925940/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=514210558443925940' title='6 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/514210558443925940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/514210558443925940'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/08/mental-ray.html' title='mental ray の基本中～の基本。'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-9eu6tYGM5o/SJgLA-WHKWI/AAAAAAAAACs/1zVxZcL8q2c/s72-c/mr_rnd.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-4680507699709341859</id><published>2008-08-04T16:47:00.005+09:00</published><updated>2008-08-04T21:12:35.514+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Animation'/><category scheme='http://www.blogger.com/atom/ns#' term='Simulation'/><title type='text'>ぴくショー克服</title><content type='html'>Syflexなど、Simlationしたオブジェクトで、Collisionに挟まれると、ポリゴンが暴れてしまう、四面楚歌ぴくぴく現象（略してぴくショー）が起きるかと思います。&lt;br /&gt;ぴくショーを直すのは至難のワザですし、時間がかかりまくります。&lt;br /&gt;モーションキャプチャーのアニメーションも、ノイズと呼ばれる、ガコッとなるキーが入る場合も多々ありますが、その場合は、その部分のキーをがっつり消去するなどで、簡単に直すことが出来ます。&lt;br /&gt;ですが、Defomationなのでポイントのアニメーションは、通常見ることが出来ません。&lt;br /&gt;ましてや、相手はcache。ファイルの中身をエディットする気にもさらさらなりません。&lt;br /&gt;&lt;br /&gt;そこで、ポイントのアニメーションが編集出来ればいいなーと思うので&lt;br /&gt;ポイント相手に、ひとつひとつnullをplotして、アニメーション編集をしてみることにしましょう。&lt;br /&gt;&lt;br /&gt;問題点を挙げます。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;まず、1つは、Defomerを生かした状態で、デザイナーが編集しやすいように、その上になんらかのConstruction Stackを付け、外部にRigを作る必要があります。&lt;/li&gt;&lt;li&gt;次に、そのRigは、視覚的にPointと同期して欲しいことでしょう。&lt;/li&gt;&lt;li&gt;最後に、大量のPointに対して処理を行うには、Scriptを書いたほうがいいでしょう。&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;この3つをクリアするだけで、OKです。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-9eu6tYGM5o/SJbxgsbUZ4I/AAAAAAAAACE/DUIwuU0VNQo/s1600-h/pikuSho.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_-9eu6tYGM5o/SJbxgsbUZ4I/AAAAAAAAACE/DUIwuU0VNQo/s320/pikuSho.jpg" alt="" id="BLOGGER_PHOTO_ID_5230633561221261186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ポイントClusterを作りnullにアニメをObject to Clusterで、くっ付けます。&lt;br /&gt;そのnullをplot。このnullは見れなくていいので、IconをNoneにします。コンストも抹殺しましょう。&lt;br /&gt;&lt;br /&gt;そのnullの子供にnull1を作り、SRTを0に設定。このnullがコントローラーになります。&lt;br /&gt;IconをCircleなどにしておきます。&lt;br /&gt;&lt;br /&gt;さらに、null2を作り、null1にTranslationのXYZにそれぞれExpression = で繋ぎます。このトランス情報が、Deformerの差分として、加えられればいいので今度は、逆に、null2を先ほどPlotしたCluster PointにCluster CenterでDeformを加えます。&lt;br /&gt;null2も見えなくていいので、IconをNoneにします。&lt;br /&gt;&lt;br /&gt;これで、Rigプロセスは、完了しました。&lt;br /&gt;&lt;br /&gt;あとは、コントローラーのnull1をGlobal Trans Plotして、ギザギザしているアニメーションをなだらかにするだけです。&lt;br /&gt;Plotしないで、オフセッターとしても使い道はあります。&lt;br /&gt;&lt;br /&gt;あとは、履歴などをたどって、Scriptにするだけです。&lt;br /&gt;&lt;br /&gt;このプロセスの弱点は、Clusterが死ぬほど出来ることと、nullが物凄くたくさん出来ることと、元のオブジェクトにSRTのアニメーションが入っている場合は、うまくいきません。&lt;br /&gt;あと、研究が足りないのでcageしたものに対してこのプロセスをすると失敗します。&lt;br /&gt;&lt;br /&gt;ICEで、もしかしたらもちっと楽に出来るのかなー？と思いつつ淡い期待を抱く今日この頃。&lt;br /&gt;の前に、もっと簡単なフローがあるかもなー？と思ったりもして。&lt;br /&gt;&lt;br /&gt;というわけで、また新たなワザ見つけたら、書いてみます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-4680507699709341859?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/4680507699709341859/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=4680507699709341859' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/4680507699709341859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/4680507699709341859'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/08/syflexsimlationcollision-defomation.html' title='ぴくショー克服'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-9eu6tYGM5o/SJbxgsbUZ4I/AAAAAAAAACE/DUIwuU0VNQo/s72-c/pikuSho.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-3205663463475138815</id><published>2008-08-01T23:09:00.003+09:00</published><updated>2008-08-01T23:44:07.149+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shader'/><title type='text'>Nullちゃんで、ライティングしてみた。</title><content type='html'>Scene内に、ひとつもライティングが無い状態で、Nullのみでライティング。&lt;br /&gt;やってみました。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-9eu6tYGM5o/SJMaSh_b57I/AAAAAAAAAB0/kMtd_brJJZE/s1600-h/lambertRender.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_-9eu6tYGM5o/SJMaSh_b57I/AAAAAAAAAB0/kMtd_brJJZE/s320/lambertRender.jpg" alt="" id="BLOGGER_PHOTO_ID_5229552497971685298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Scene内には、オブジェクトは、SphereとNullとカメラのみです。&lt;br /&gt;後は、Nullの位置を見るShaderを作ればOK。&lt;br /&gt;&lt;br /&gt;というわけで、繋いで見ます。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-9eu6tYGM5o/SJMZWEq_WoI/AAAAAAAAABs/pkgT3eVPcnI/s1600-h/lambertRenderTree.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_-9eu6tYGM5o/SJMZWEq_WoI/AAAAAAAAABs/pkgT3eVPcnI/s320/lambertRenderTree.jpg" alt="" id="BLOGGER_PHOTO_ID_5229551459309148802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;普段は見慣れないノードがたくさん刺さってますね。&lt;br /&gt;ワタクシも仕事では、一度も使った試しがありません。&lt;br /&gt;&lt;br /&gt;やることは、サーフェイスの向きとライティングの向きの内積を出せば拡散反射になるということです。&lt;br /&gt;&lt;br /&gt;まずは、二股に分かれている上の部分。&lt;br /&gt;&lt;br /&gt;XSI_Model_Mapノードを使用して、オブジェクトのNormal情報をゲット。&lt;br /&gt;XSI_Model_Mapノードは、0から1の範囲で、サーフェイスの表面の向きをRGB値として取得します。&lt;br /&gt;上を向いている面なら、( 0.5, 1, 0.5 )を返します。&lt;br /&gt;左を向いている面なら、( 0, 0.5, 0.5 )を返します。&lt;br /&gt;このままだと、ベクトルの向きにはならないので、Vector_math_vectorノードを使って2倍して1引きます。&lt;br /&gt;すると、範囲は-1から1の正しい向きの値が取得出来ます。&lt;br /&gt;上なら、（ 0, 1, 0 ）&lt;br /&gt;左なら、（ -1, 0, 0 ）です。&lt;br /&gt;&lt;br /&gt;次に、下の部分。&lt;br /&gt;&lt;br /&gt;Color2vectorノードのColor InputにNullのポジション情報をExpressionで繋ぎます。&lt;br /&gt;このままだと、長さが1ではないベクトルが返ってくるので、Vector_math_vectorノードでNormalizeして1の長さにします。&lt;br /&gt;これで、ライティングの向き情報が取得出来ました。&lt;br /&gt;&lt;br /&gt;二つの情報が出揃ったので、Vector_math_scalarノードを使い、Dot Product（内積）を取得します。&lt;br /&gt;&lt;br /&gt;このスカラー値こそが、世に名を轟かせているかの有名なLambertです。&lt;br /&gt;&lt;br /&gt;特にこんなこと知らなくても、仕事出来ますし、意味ねーじゃんと思いますが&lt;br /&gt;CGソフト作るってものすげー大変なんだなーって思いました。&lt;br /&gt;&lt;br /&gt;いやいや、開発者には頭が上がりません。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-3205663463475138815?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/3205663463475138815/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=3205663463475138815' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/3205663463475138815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/3205663463475138815'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/08/null.html' title='Nullちゃんで、ライティングしてみた。'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-9eu6tYGM5o/SJMaSh_b57I/AAAAAAAAAB0/kMtd_brJJZE/s72-c/lambertRender.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-2043863729173060286</id><published>2008-08-01T00:34:00.008+09:00</published><updated>2008-08-01T10:56:03.475+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reel'/><title type='text'>人体ミクロの世界のトテモキレイな demo reel</title><content type='html'>キモくないと思いますが、臓器のとってもキレイなデモムービー。&lt;br /&gt;&lt;br /&gt;Hybrid Medical Animation&lt;br /&gt;&lt;a href="http://www.hybridmedicalanimation.com/demoReel.html"&gt;http://www.hybridmedicalanimation.com/demoReel.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;BGMも、トッテモカワイイですね。&lt;br /&gt;ちなみに、MOGWAIの他の曲のクリップはこちら。&lt;br /&gt;Friend Of The Night&lt;br /&gt;&lt;a href="http://jp.youtube.com/watch?v=K_NrZCZwlhc"&gt;http://jp.youtube.com/watch?v=K_NrZCZwlhc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;うーん、たまらんっ。たまんねーなっ。&lt;br /&gt;CGじゃなくてもいいものはいいねぇ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-2043863729173060286?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/2043863729173060286/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=2043863729173060286' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/2043863729173060286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/2043863729173060286'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/08/demo-reel.html' title='人体ミクロの世界のトテモキレイな demo reel'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-7146707216815316675</id><published>2008-07-31T17:07:00.004+09:00</published><updated>2008-08-01T01:19:52.827+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Animation'/><title type='text'>Timeline で Animation 編集</title><content type='html'>アニメーションが入っているノードを選択すると、Timeline にキーが赤く表示されます。&lt;br /&gt;これ移動できねーかなーと思ってたら出来ました。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Timeline上で、Shift押しながら左ドラッグで範囲指定が出来る&lt;/span&gt;って知ってました？&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-9eu6tYGM5o/SJGxvOfXBeI/AAAAAAAAABg/ylkb-2N5lkc/s1600-h/tl.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_-9eu6tYGM5o/SJGxvOfXBeI/AAAAAAAAABg/ylkb-2N5lkc/s320/tl.jpg" alt="" id="BLOGGER_PHOTO_ID_5229156067255453154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;いやー、知りませんでしたよね？そうですよね？意外でしたよね？&lt;br /&gt;&lt;br /&gt;さらに、中ドラッグで、キーが移動出来ます。&lt;br /&gt;囲まれた範囲の左っ側を中ドラッグするとスケールも出来るんですよね。&lt;br /&gt;右っ側も同じ。&lt;br /&gt;キーを削除するには、右クリでメニューだして、Deleteを選ぶと消えます。&lt;br /&gt;&lt;br /&gt;DopeSheet が無くともこれで十分じゃないのか？！&lt;br /&gt;&lt;br /&gt;Timeline エライ！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-7146707216815316675?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/7146707216815316675/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=7146707216815316675' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/7146707216815316675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/7146707216815316675'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/07/timeline-animation.html' title='Timeline で Animation 編集'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-9eu6tYGM5o/SJGxvOfXBeI/AAAAAAAAABg/ylkb-2N5lkc/s72-c/tl.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-3176021424894713260</id><published>2008-07-31T17:04:00.003+09:00</published><updated>2008-07-31T21:38:52.104+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Animation'/><title type='text'>Animation Layer のあれこれ</title><content type='html'>Animation Layerは、ウソクリップです。略してウソップ。&lt;br /&gt;Mixerに表示されるくせに、移動もカットも出来ません。&lt;br /&gt;出来るのは、Weightが変えられるくらいです。&lt;br /&gt;Clipの上にLayerを付けてアニメーションを修正出来るすっばらしいものなんですが&lt;br /&gt;一つのClipとして、Mergeするには、ちょっとしたワザが必要になります。&lt;br /&gt;&lt;br /&gt;これには、2通りあります。&lt;br /&gt;&lt;br /&gt;1. まず、普通にSourceClipをApply Action（もし、Clipを移動やスケールをしている場合、Freeze and Replaceなどで新しく作り直します）&lt;br /&gt;して、LayerをMergeして、Fcurveにしてから、Storeする。&lt;br /&gt;&lt;br /&gt;2. もしくは、Layerを加えたノードに対し、Global Plotを実行してから、ClipをFreeze and Replaceして、LayerとGlobalアニメを削除。&lt;br /&gt;&lt;br /&gt;ちょっと大変です。ウソップ。&lt;br /&gt;&lt;br /&gt;Layerの弱点は他にもいろいろあってー&lt;br /&gt;&lt;br /&gt;たとえば、Clipを移動したいときには、Layerにも同じ変換を加えなければなりません。&lt;br /&gt;スゲェ大変。&lt;br /&gt;&lt;br /&gt;あと、致命的だなと思うのは、LayerをMergeして集約したとしても、元のアニメーションとは完全には一致しません。&lt;br /&gt;出来るアニメはちょいズレです。&lt;br /&gt;ホントにちょこっとだけど。&lt;br /&gt;&lt;br /&gt;Plotするときに、Fitをかけてしまうんですね～。&lt;br /&gt;これには、オプションを付けてほしかった。&lt;br /&gt;&lt;br /&gt;ま、いいのかな。ほとんど分からないので。&lt;br /&gt;&lt;br /&gt;カメラのアニメーションなど、キーの位置はここがいいのに！&lt;br /&gt;って場合は、絶対オススメしません。&lt;br /&gt;キーが増えるだけだし。&lt;br /&gt;&lt;br /&gt;で、これならどうだ？！って思った方法があるのだけど。&lt;br /&gt;&lt;br /&gt;結構意外だったのが、LayerをActionとして保存して、読み込むと普通のClipになっていること。&lt;br /&gt;だけど、普通にMixerに並べても、Clip同士ではアニメーションが平均化してしまうので&lt;br /&gt;Mixer Properties...のNormalizeをオフにします。&lt;br /&gt;このプロパティは、Mixerに付くので、全部のClipが加算になります。&lt;br /&gt;なので、必要なClipをCompaundして、CompaundのMixer Propertiesから、Normalizeをオフにして&lt;br /&gt;CompaundしたClipのみを加算にします。&lt;br /&gt;で、Freeze and ReplaceすればClip完成。&lt;br /&gt;&lt;br /&gt;のはずだと思ったのも束の間。今度は、Rotationがズレてしまいました･･･。&lt;br /&gt;Rotationは、やはり難しい･･･。&lt;br /&gt;&lt;br /&gt;出来たら報告する予定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-3176021424894713260?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/3176021424894713260/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=3176021424894713260' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/3176021424894713260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/3176021424894713260'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/07/animation-layerno.html' title='Animation Layer のあれこれ'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-1531011475595907076</id><published>2008-07-30T22:56:00.004+09:00</published><updated>2008-07-31T22:11:07.724+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Animation'/><title type='text'>Transformの優先順位</title><content type='html'>コンストやらMixerやら、同じノードに複数のアニメーションを入れることが出来ますがー&lt;br /&gt;最強なのはどれでしょう？&lt;br /&gt;&lt;br /&gt;と、気になったアナタは偉いです。&lt;br /&gt;&lt;br /&gt;ちなみに、こんな感じ。&lt;br /&gt;&lt;br /&gt;1. Constraint&lt;br /&gt;2. Global Transform Fcurve&lt;br /&gt;3. Animation Mixer&lt;br /&gt;4. Local Transform Fcurve, Expression, Scripted Operator&lt;br /&gt;&lt;br /&gt;ということになってるみたいです。&lt;br /&gt;&lt;br /&gt;ということで、ここでちょい技。&lt;br /&gt;コンストした状態、もしくは、グローバルを Marked Parameter Plot した状態では&lt;br /&gt;Mixerは、無効になります。&lt;br /&gt;ですがこのときに、ClipをFreeze and Replaceすると&lt;br /&gt;Sourceに登録されているParameterのみがPlotされます。&lt;br /&gt;&lt;br /&gt;つ・ま・り、Clipがコンストorグローバルのアニメーションになるってことです。&lt;br /&gt;&lt;br /&gt;Apply Actionしなくて済みます。&lt;br /&gt;&lt;br /&gt;ちょっと素敵でしょ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-1531011475595907076?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/1531011475595907076/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=1531011475595907076' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1531011475595907076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/1531011475595907076'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/07/transform.html' title='Transformの優先順位'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-7742921136509389419</id><published>2008-07-30T20:38:00.004+09:00</published><updated>2008-08-02T00:04:42.651+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ShortCut'/><title type='text'>Schematic View の Nキー</title><content type='html'>最近知りました。ががーん。&lt;br /&gt;&lt;br /&gt;Schematic Viewで、ノード選択して、Nキーを押すと&lt;br /&gt;階層がしまわれたり、広がったりの Expand/Collapse が出来ます。&lt;br /&gt;マウス中ダブクリでも出来るけど、このほうがTree選択されないから楽チン。&lt;br /&gt;&lt;br /&gt;さらに、ノード選択して、Alt押しながら矢印キーで、階層を上下左右に移動出来ます。&lt;br /&gt;結構便利。&lt;br /&gt;&lt;br /&gt;さらにさらに、Alt押しながらノードをドラッグアンドドロップすると&lt;br /&gt;そのノードが子供になります。&lt;br /&gt;これも、Treeが選択状態にならないので、便利。&lt;br /&gt;&lt;br /&gt;さらにさらにさらに、ノード選択して、Ctl+Shift+Tで、モデル階層が選択出来るって知ってた？&lt;br /&gt;&lt;br /&gt;結構いろいろ便利機能あるよねー。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-7742921136509389419?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/7742921136509389419/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=7742921136509389419' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/7742921136509389419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/7742921136509389419'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/07/schematic-view-n.html' title='Schematic View の Nキー'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4481316956768607686.post-8228523059654597764</id><published>2008-07-30T02:03:00.006+09:00</published><updated>2008-07-30T21:02:25.116+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Animation'/><title type='text'>Pose Constraint と Position &amp; Orientation Constraint</title><content type='html'>Pose Constraint&lt;br /&gt;と&lt;br /&gt;Position かつ Orientation Constraint の２重コンストは&lt;br /&gt;結果が違いマス。&lt;br /&gt;&lt;br /&gt;同じになりそうだけどネ～。&lt;br /&gt;&lt;br /&gt;感覚としては、Poseは、Parent/Childの関係とほぼ一緒の挙動をするのに対し&lt;br /&gt;Position、及び、Orientationは、数値のみをリンクするって感じ。&lt;br /&gt;&lt;br /&gt;ちなみに、Rotation値の違うもの同士を Orientation の CnsCompで、&lt;br /&gt;コンストした場合、大抵うまくアニメーションを写せません。&lt;br /&gt;なぜかっていうのは、Euler（オイラー）の解説をしなくてはならないのですが&lt;br /&gt;理解していません。&lt;br /&gt;難しすぎるんだもの･･･。&lt;br /&gt;&lt;br /&gt;うまく行かないなーと思ったら、Poseコンスト。&lt;br /&gt;&lt;br /&gt;これで、大丈夫。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4481316956768607686-8228523059654597764?l=a-s-c-e-n-s-i-o-n.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/feeds/8228523059654597764/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4481316956768607686&amp;postID=8228523059654597764' title='7 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8228523059654597764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4481316956768607686/posts/default/8228523059654597764'/><link rel='alternate' type='text/html' href='http://a-s-c-e-n-s-i-o-n.blogspot.com/2008/07/pose-constraintposition-orientation.html' title='Pose Constraint と Position &amp; Orientation Constraint'/><author><name>Atsushi Tsugaruya</name><uri>https://profiles.google.com/117749654363349405692</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-uSBhlTU5Vtc/AAAAAAAAAAI/AAAAAAAAAPY/z2r6M0y-l-I/s512-c/photo.jpg'/></author><thr:total>7</thr:total></entry></feed>
