<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>note.x</title>
	<atom:link href="http://blog.r3c7.net/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.r3c7.net</link>
	<description>やってみたコト、行ったトコ、使ってみたモノなどを淡々と記録しています。</description>
	<lastBuildDate>Mon, 01 Feb 2010 06:35:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Projection map study</title>
		<link>http://blog.r3c7.net/?p=443</link>
		<comments>http://blog.r3c7.net/?p=443#comments</comments>
		<pubDate>Mon, 01 Feb 2010 06:35:46 +0000</pubDate>
		<dc:creator>rect</dc:creator>
				<category><![CDATA[try]]></category>
		<category><![CDATA[papervision3d2.0]]></category>

		<guid isPermaLink="false">http://blog.r3c7.net/?p=443</guid>
		<description><![CDATA[
Projection map Test（要：FlashPlayer9）
※各Cubeはドラッグで動かせます。
プロジェクションマップの習作。
パフォーマンス悪いなぁ。根本的に考え直さないとダメか。
]]></description>
			<content:encoded><![CDATA[<p class="photo"><a href="/wp-content/uploads/projectionmap/main.swf" target="_blank"><img src="/wp-content/uploads/e_projectionmap.jpg" border="0" /></a></p>
<p><a href="/wp-content/uploads/projectionmap/main.swf" target="_blank" class="ext-link">Projection map Test</a>（要：FlashPlayer9）<br />
※各Cubeはドラッグで動かせます。</p>
<p>プロジェクションマップの習作。<br />
パフォーマンス悪いなぁ。根本的に考え直さないとダメか。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r3c7.net/?feed=rss2&amp;p=443</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beginning PV3D guide book for Flash3D contents develop</title>
		<link>http://blog.r3c7.net/?p=439</link>
		<comments>http://blog.r3c7.net/?p=439#comments</comments>
		<pubDate>Sat, 09 Jan 2010 06:50:58 +0000</pubDate>
		<dc:creator>rect</dc:creator>
				<category><![CDATA[review]]></category>
		<category><![CDATA[papervision3d2.0]]></category>

		<guid isPermaLink="false">http://blog.r3c7.net/?p=439</guid>
		<description><![CDATA[
昨年末、yas@ClockMakerさんのご好意で「Flash3Dコンテンツ制作のためのPapervision3D入門」を献本していただき、年末年始に少しずつ読んだ。yasさんの太っ腹さに感謝。
あざーッス！
総じて懇 [...]]]></description>
			<content:encoded><![CDATA[<p class="photo"><a href="http://clockmaker.jp/blog/2009/12/papervision3d-book/" target="_blank"><img src="/wp-content/uploads/pv3dbasicbook.jpg" border="0" /></a></p>
<p>昨年末、yas@ClockMakerさんのご好意で「<a href="http://clockmaker.jp/blog/2009/12/papervision3d-book/" target="_blank">Flash3Dコンテンツ制作のためのPapervision3D入門</a>」を献本していただき、年末年始に少しずつ読んだ。yasさんの太っ腹さに感謝。<br />
あざーッス！</p>
<p>総じて懇切丁寧、全項カラーで超豪華。この本を隅々まで読み込んで実際に手を動かし、それでも理解できなきゃPV3D以前の問題なんじゃね？と、言えるくらい基礎から実践＋αまで非常に盛りだくさんな内容でお腹いっぱい。PV3DのAPIを使いこなして、Flashコンテンツに3D要素をちょろっと加えたいだけならこれ一冊で十分。</p>
<p>ただ、説明の分かりやすさや冗長さの回避が優先されて、多少語弊のある記述もチラホラ見受けられるので（UVの解説とかシェーディング系Materialあたり）、ネット上に多数ある情報も併せて参照するとなお良い。このへんは入門書のジレンマですな。</p>
<p>「英語わかんね」とかいうモノグサ野郎もこれでバッチシ！PV3Dに興味のあるFlashデベロッパは、手元に置いて損は無いかと。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r3c7.net/?feed=rss2&amp;p=439</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Take the Blender</title>
		<link>http://blog.r3c7.net/?p=433</link>
		<comments>http://blog.r3c7.net/?p=433#comments</comments>
		<pubDate>Fri, 27 Nov 2009 11:23:12 +0000</pubDate>
		<dc:creator>rect</dc:creator>
				<category><![CDATA[try]]></category>
		<category><![CDATA[blender]]></category>

		<guid isPermaLink="false">http://blog.r3c7.net/?p=433</guid>
		<description><![CDATA[3Dアプリでモデリング・モーション付やって、それをそのままASで扱えたらさぞかし楽しかろうと常々考えてきたにもかかわらず、一向にベストな方法が見つけられないし、出現しそうもないので、自力で色々作り始めてみることにした。
 [...]]]></description>
			<content:encoded><![CDATA[<p>3Dアプリでモデリング・モーション付やって、それをそのままASで扱えたらさぞかし楽しかろうと常々考えてきたにもかかわらず、一向にベストな方法が見つけられないし、出現しそうもないので、自力で色々作り始めてみることにした。</p>
<p>本来、.daeが正しく書き出せて、正しく読み込まれればそれが出来るはずなんだろうけど、現状3dsMAXとかMayaでも持ってない限り可能性が薄い。Unwrap3Dはwin用だし。んで、BlenderのエクスポータでもいじってみようかとColladaの仕様書とか見てみたりするんだけど、これがもーなにがなんだか。</p>
<p>そんなわけで.blend形式。<a href="http://www.atmind.nl/blender/index.html" target="_blank">ファイルフォーマットが公開されてる</a>んで、こいつを手がかりに.blendローダーを作成。バイナリ最高。バージョンによるデータの差異は吸収できてないしメッシュの読み込みだけだけど、2.49bのファイルは問題ないとこまで来た。<br />
いいかげんな3Dエンジンらしきものも自作。ジオメトリパイプラインの実装でつまずきまくって、首吊ろうかと思ったけど何とか動くようになった。まだ何かがオカシイので多分どっかの符号間違えてる。苦労した分、オレオレエンジンの成長が楽しくてしょーがない。擬人化したいぐらい。</p>
<p>ここまでの成果として、Blenderで編集したメッシュが.swf側に即時反映されるビューアを作ってみた。画面右がFlashPlayer。</p>
<p id="blas">
<script type="text/javascript">
var so = new SWFObject("/wp-content/uploads/video/player.swf", "blasv", "504", "269", "10", "#000000");
so.addVariable("file","/wp-content/uploads/video/relationblender.flv");
so.addVariable("image","/wp-content/uploads/video/threlationblender.jpg");
so.write("blas");
</script>
</p>
<p>城戸さんそのまんまなのがアレだしショボすぎて泣けてくるけど、これ、ちゃんと作ればかなり便利かも。swfで実際に表示されるまで分からない部分とかが、モデリングしながら確認できるのはメチャメチャ助かる。</p>
<p>当面は、プレハブみたいな実装の3Dエンジンをもうちょっとマトモなものにしつつ、なんとかしてモーションデータの再生までこぎ着けたい。とか宣言して自分を追い詰めておく。<br />
まぁぼちぼち。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r3c7.net/?feed=rss2&amp;p=433</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Away3D Lite v1.0 first impression</title>
		<link>http://blog.r3c7.net/?p=427</link>
		<comments>http://blog.r3c7.net/?p=427#comments</comments>
		<pubDate>Sat, 12 Sep 2009 05:53:48 +0000</pubDate>
		<dc:creator>rect</dc:creator>
				<category><![CDATA[try]]></category>
		<category><![CDATA[away3d away3dlite]]></category>

		<guid isPermaLink="false">http://blog.r3c7.net/?p=427</guid>
		<description><![CDATA[以前アナウンスがあったAway3Dの高速化に関する話が、Away3D Liteとして結実。
svnリポジトリのtrunk入りしてたのが、ようやく正式発表されましたよっと。
最大の功労者であるsleepydesign の  [...]]]></description>
			<content:encoded><![CDATA[<p>以前アナウンスがあった<a href="http://away3d.com/flash-10-speed-tests" target="_blank">Away3Dの高速化に関する話</a>が、Away3D Liteとして結実。<br />
svnリポジトリのtrunk入りしてたのが、ようやく正式発表されましたよっと。<br />
最大の功労者である<a href="http://sleepydesign.blogspot.com/">sleepydesign の katopz</a>に敬礼！Greate work katopz!</p>
<p><a href="http://away3d.com/away3d-lite-v1-0-fastest-and-smallest-3d-engine-in-flash" target="_blank" class="ext-link"> Away3D Lite v1.0: fastest and smallest 3d engine in Flash.</a></p>
<p>動作が軽いのと共に機能もライト、とりあえず最低限の機能のみ提供されてる感じ。<br />
高機能化の果てに超重量級エンジンになっちゃった本家Away3Dとは別に、パフォーマンス重視専用のライブラリを別展開するという戦略なのか、単に本家の再設計が面倒だったのかはさておき、選択肢が増えたのはありがたいことであります。<br />
どの程度の高速化がなされているかは上記のエントリに掲載されているデモで確認できる。</p>
<p>手元のデータでもやってみた。</p>
<p class="photo"><a href="/wp-content/uploads/away3dlite/loader/loaderDae.swf" target="_blank"><img src="/wp-content/uploads/e_away3dlitetest.jpg" border="0" /></a></p>
<p><a href="/wp-content/uploads/away3dlite/loader/loaderDae.swf" target="_blank" class="ext-link">Dae Performance Test</a>（要：FlashPlayer10）<br />
画面クリックで増殖、減らせないので注意。</p>
<p>sortTypeが上手く動作せずZソートがおかしいけど、3000△ポリ超えてもそこそこ動いてる。</p>
<p>.mqoを扱うクラスも標準提供されているので、メタセコのデータでも試してみた。<br />
<a href="/wp-content/uploads/away3dlite/loader/loaderMqo.swf" target="_blank" class="ext-link">Mqo Performance Test</a>（要：FlashPlayer10）<br />
※モデルデータは、もとがしさんが配布されているものをお借りしました。</p>
<p>今までが1000△ポリあたりで限界だった事を考えると、このくらいのローポリモデルが扱えるようになったのはスゴイな。ビルボードとかPlaneとかを大量に使いたいみたいなケースにはもってこいかも。</p>
<p>触ってみた感触として、</p>
<ul>
<li>本家とは完全に別物であることを再確認。</li>
<li>APIがPV3Dの1.5〜1.7あたりと似た印象。</li>
<li>未完成な感じが否めない（謎挙動・sortTypeのバグとか）</li>
</ul>
<p>とか思った。</p>
<p>Matrix3Dなどのコアクラスが自前のものではなく、全部ビルトインクラスに置き換わってたりして、FP10の3D機能を体系化した3Dエンジンのひな形として参考になりそうではある。これをベースに自分好みのエンジンに調教するのもアリなんじゃねーかと。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r3c7.net/?feed=rss2&amp;p=427</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[Away3D] Away3D 2.4 Feature – Explode</title>
		<link>http://blog.r3c7.net/?p=420</link>
		<comments>http://blog.r3c7.net/?p=420#comments</comments>
		<pubDate>Fri, 21 Aug 2009 06:48:28 +0000</pubDate>
		<dc:creator>rect</dc:creator>
				<category><![CDATA[try]]></category>
		<category><![CDATA[away3d]]></category>

		<guid isPermaLink="false">http://blog.r3c7.net/?p=420</guid>
		<description><![CDATA[ワーカーホリック野郎な日々を送ってる間にAway3Dがバージョンアップ。
Away3d: 2.4 &#038; 3.4 released!
とりあえず地味な機能から試してみる。

ExplodeTest（要：FlashP [...]]]></description>
			<content:encoded><![CDATA[<p>ワーカーホリック野郎な日々を送ってる間にAway3Dがバージョンアップ。<br />
<a href="http://away3d.com/away3d-24-34-released" target="_blank" class="ext-link">Away3d: 2.4 &#038; 3.4 released!</a></p>
<p>とりあえず地味な機能から試してみる。</p>
<p class="photo"><a href="/wp-content/uploads/away3d/geom/main.swf" target="_blank"><img src="/wp-content/uploads/e_explode.jpg" border="0" /></a></p>
<p><a href="/wp-content/uploads/away3d/geom/main.swf" target="_blank" class="ext-link">ExplodeTest</a>（要：FlashPlayer9）</p>
<p>Explodeクラスは、指定したObject3Dインスタンス内の全Faceを位置関係をそのままに、バラバラのMeshやFaceに分解してくれるジオメトリモディファイア。<br />
Away3DはもともとFace単位でvisibleプロパティを持ってるので、表示／非表示をFace単位で行うことができていたけど、Face単位で大きさ変えたりすることはできなかった。その名のとおり、簡易的な爆発表現なんかに使えそうだし、演出面で結構使えるかもしれない。</p>
<p>具体的には以下のようにして使う。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="actionscript actionscript" style="font-family:monospace;"><span style="color: #069;">import</span> away3d.<span style="color: #444;">geom</span>.<span style="color: #444;">Explode</span>;
&nbsp;
- 中略 -
&nbsp;
<span style="color: #699; font-family:Verdana;">//適当なメッシュを用意</span>
<span style="color: #39c; font-weight: bold;">var</span> wcMat:WireColorMaterial = <span style="color: #39c; font-weight: bold;">new</span> WireColorMaterial<span style="color: #444;">&#40;</span>0x0099CC, <span style="color: #444;">&#123;</span>wirecolor:0x00CCFF<span style="color: #444;">&#125;</span><span style="color: #444;">&#41;</span>;
<span style="color: #39c; font-weight: bold;">var</span> sphere:Sphere = <span style="color: #39c; font-weight: bold;">new</span> Sphere<span style="color: #444;">&#40;</span><span style="color: #444;">&#123;</span>material:wcMat, radius:<span style="color: #444;">100</span>, segmentsW:<span style="color: #444;">8</span>, segmentsH:<span style="color: #444;">6</span><span style="color: #444;">&#125;</span><span style="color: #444;">&#41;</span>;
&nbsp;
<span style="color: #699; font-family:Verdana;">//Explodeでメッシュを分解</span>
<span style="color: #39c; font-weight: bold;">var</span> _explode:Explode = <span style="color: #39c; font-weight: bold;">new</span> Explode<span style="color: #444;">&#40;</span><span style="color: #39c; font-weight: bold;">true</span>, <span style="color: #39c; font-weight: bold;">true</span><span style="color: #444;">&#41;</span>;
<span style="color: #39c; font-weight: bold;">var</span> _explodedObj:ObjectContainer3D = _explode.<span style="color: #069;">apply</span><span style="color: #444;">&#40;</span>sphere<span style="color: #444;">&#41;</span> as ObjectContainer3D;
&nbsp;
<span style="color: #699; font-family:Verdana;">//分解されたメッシュが束ねられたObjectContainer3Dをシーンに追加</span>
scene.<span style="color: #444;">addChild</span><span style="color: #444;">&#40;</span>_explodedObj<span style="color: #444;">&#41;</span>;</pre></td></tr></table></div>

<p>Explodeのコンストラクタに渡す引数は以下のようになってる模様。</p>
<ul>
<li><strong>第1引数</strong>：分解したFaceを個別のMeshとして定義するかどうか<br />
	trueなら、Faceの数分Meshが生成される。falseなら、共有していた頂点をFaceの数だけ用意してそれぞれ単独の面として扱えるようにする。</p>
<li><strong>第2引数</strong>：再定義後のMeshの中心点をFaceの重心にもってくるかどうか<br />
	falseなら、元になったObject3Dの原点が中心点のままになる
</ul>
<p>コンストラクタの第1引数をtrueにして、個別のMeshを生成した場合は、</p>
<pre class="code">
for each(var item:Mesh in _explodedObj.children)
{
    item.scaleX = 0.5;
}
</pre>
<p>などとして、それぞれのMeshを制御する。</p>
<p>理屈では、Colladaメッシュにも適用できる。</p>
<p class="photo"><a href="/wp-content/uploads/away3d/geom/daeexplode.swf" target="_blank"><img src="/wp-content/uploads/e_explode2.jpg" border="0" /></a></p>
<p><a href="/wp-content/uploads/away3d/geom/daeexplode.swf" target="_blank" class="ext-link">dae Explode</a>（要：FlashPlayer9）</p>
<p>ただ、現状のExplode.asには、元にしたメッシュがFace単位でマテリアル指定されているような場合、マテリアルが引き継がれないという問題があって、テクスチャが無効になってしまう。そこで、Explode.asを以下のように書き換えることで暫定的に対処した。ついでに「bothsides、backの要素が引き継がれない」という問題にも対処。</p>
<p>Explode.as 61行目</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
</pre></td><td class="code"><pre class="actionscript actionscript" style="font-family:monospace;"><span style="color: #069; font-weight: bold;">for</span><span style="color: #444;">&#40;</span>i=0;i<span style="color: #444;">&lt;</span>loop;++i<span style="color: #444;">&#41;</span><span style="color: #444;">&#123;</span>
&nbsp;
    face = obj.<span style="color: #444;">faces</span><span style="color: #444;">&#91;</span>i<span style="color: #444;">&#93;</span>;
    mesh = <span style="color: #39c; font-weight: bold;">new</span> Mesh<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
&nbsp;
    va = <span style="color: #39c; font-weight: bold;">new</span> Vertex<span style="color: #444;">&#40;</span>face.<span style="color: #444;">v0</span>.<span style="color: #444;">x</span>, face.<span style="color: #444;">v0</span>.<span style="color: #444;">y</span>, face.<span style="color: #444;">v0</span>.<span style="color: #444;">z</span><span style="color: #444;">&#41;</span>;
    vb = <span style="color: #39c; font-weight: bold;">new</span> Vertex<span style="color: #444;">&#40;</span>face.<span style="color: #444;">v1</span>.<span style="color: #444;">x</span>, face.<span style="color: #444;">v1</span>.<span style="color: #444;">y</span>, face.<span style="color: #444;">v1</span>.<span style="color: #444;">z</span><span style="color: #444;">&#41;</span>;
    vc = <span style="color: #39c; font-weight: bold;">new</span> Vertex<span style="color: #444;">&#40;</span>face.<span style="color: #444;">v2</span>.<span style="color: #444;">x</span>, face.<span style="color: #444;">v2</span>.<span style="color: #444;">y</span>, face.<span style="color: #444;">v2</span>.<span style="color: #444;">z</span><span style="color: #444;">&#41;</span>;
    uva = <span style="color: #39c; font-weight: bold;">new</span> UV<span style="color: #444;">&#40;</span>face.<span style="color: #444;">uv0</span>.<span style="color: #444;">u</span>, face.<span style="color: #444;">uv0</span>.<span style="color: #444;">v</span><span style="color: #444;">&#41;</span>;
    uvb = <span style="color: #39c; font-weight: bold;">new</span> UV<span style="color: #444;">&#40;</span>face.<span style="color: #444;">uv1</span>.<span style="color: #444;">u</span>, face.<span style="color: #444;">uv1</span>.<span style="color: #444;">v</span><span style="color: #444;">&#41;</span>;
    uvc = <span style="color: #39c; font-weight: bold;">new</span> UV<span style="color: #444;">&#40;</span>face.<span style="color: #444;">uv2</span>.<span style="color: #444;">u</span>, face.<span style="color: #444;">uv2</span>.<span style="color: #444;">v</span><span style="color: #444;">&#41;</span>;
&nbsp;
    mesh.<span style="color: #444;">addFace</span><span style="color: #444;">&#40;</span><span style="color: #39c; font-weight: bold;">new</span> Face<span style="color: #444;">&#40;</span>va, vb, vc, obj.<span style="color: #444;">material</span> as ITriangleMaterial, uva, uvb, uvc<span style="color: #444;">&#41;</span><span style="color: #444;">&#41;</span>;
    _container.<span style="color: #444;">addChild</span><span style="color: #444;">&#40;</span>mesh<span style="color: #444;">&#41;</span>;
<span style="color: #444;">&#125;</span></pre></td></tr></table></div>

<p>これを、</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
</pre></td><td class="code"><pre class="actionscript actionscript" style="font-family:monospace;"><span style="color: #069; font-weight: bold;">for</span><span style="color: #444;">&#40;</span>i=0;i<span style="color: #444;">&lt;</span>loop;++i<span style="color: #444;">&#41;</span><span style="color: #444;">&#123;</span>
&nbsp;
    face = obj.<span style="color: #444;">faces</span><span style="color: #444;">&#91;</span>i<span style="color: #444;">&#93;</span>;
    mesh = <span style="color: #39c; font-weight: bold;">new</span> Mesh<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
&nbsp;
    va = <span style="color: #39c; font-weight: bold;">new</span> Vertex<span style="color: #444;">&#40;</span>face.<span style="color: #444;">v0</span>.<span style="color: #444;">x</span>, face.<span style="color: #444;">v0</span>.<span style="color: #444;">y</span>, face.<span style="color: #444;">v0</span>.<span style="color: #444;">z</span><span style="color: #444;">&#41;</span>;
    vb = <span style="color: #39c; font-weight: bold;">new</span> Vertex<span style="color: #444;">&#40;</span>face.<span style="color: #444;">v1</span>.<span style="color: #444;">x</span>, face.<span style="color: #444;">v1</span>.<span style="color: #444;">y</span>, face.<span style="color: #444;">v1</span>.<span style="color: #444;">z</span><span style="color: #444;">&#41;</span>;
    vc = <span style="color: #39c; font-weight: bold;">new</span> Vertex<span style="color: #444;">&#40;</span>face.<span style="color: #444;">v2</span>.<span style="color: #444;">x</span>, face.<span style="color: #444;">v2</span>.<span style="color: #444;">y</span>, face.<span style="color: #444;">v2</span>.<span style="color: #444;">z</span><span style="color: #444;">&#41;</span>;
    uva = <span style="color: #39c; font-weight: bold;">new</span> UV<span style="color: #444;">&#40;</span>face.<span style="color: #444;">uv0</span>.<span style="color: #444;">u</span>, face.<span style="color: #444;">uv0</span>.<span style="color: #444;">v</span><span style="color: #444;">&#41;</span>;
    uvb = <span style="color: #39c; font-weight: bold;">new</span> UV<span style="color: #444;">&#40;</span>face.<span style="color: #444;">uv1</span>.<span style="color: #444;">u</span>, face.<span style="color: #444;">uv1</span>.<span style="color: #444;">v</span><span style="color: #444;">&#41;</span>;
    uvc = <span style="color: #39c; font-weight: bold;">new</span> UV<span style="color: #444;">&#40;</span>face.<span style="color: #444;">uv2</span>.<span style="color: #444;">u</span>, face.<span style="color: #444;">uv2</span>.<span style="color: #444;">v</span><span style="color: #444;">&#41;</span>;
&nbsp;
    <span style="color: #39c; font-weight: bold;">var</span> setMaterial:ITriangleMaterial;
    <span style="color: #069; font-weight: bold;">if</span> <span style="color: #444;">&#40;</span>obj.<span style="color: #444;">material</span><span style="color: #444;">&#41;</span> setMaterial = obj.<span style="color: #444;">material</span> as ITriangleMaterial;
    <span style="color: #069; font-weight: bold;">else</span> setMaterial = face.<span style="color: #444;">material</span> as ITriangleMaterial;
&nbsp;
    <span style="color: #39c; font-weight: bold;">var</span> fc:Face = <span style="color: #39c; font-weight: bold;">new</span> Face<span style="color: #444;">&#40;</span>va, vb, vc, setMaterial, uva, uvb, uvc<span style="color: #444;">&#41;</span>;
    mesh.<span style="color: #444;">addFace</span><span style="color: #444;">&#40;</span>fc<span style="color: #444;">&#41;</span>;
    _container.<span style="color: #444;">addChild</span><span style="color: #444;">&#40;</span>mesh<span style="color: #444;">&#41;</span>;
    mesh.<span style="color: #444;">bothsides</span> = obj.<span style="color: #444;">bothsides</span>;
    fc.<span style="color: #444;">back</span> = obj.<span style="color: #444;">back</span> as ITriangleMaterial;
<span style="color: #444;">&#125;</span></pre></td></tr></table></div>

<p>とする。</p>
<p>あとは、バラバラになった後のMeshが、もともとのFaceの法線方向をforwardベクトルにしてくれるといいのになぁと思ったけど面倒くさそうだったのでとりあえず保留。<br />
また、Explodeコンストラクタの第1引数をtrueにして、FaceごとのMeshを生成すると当然負荷が増大するので、パフォーマンス重視の場合はMeshを生成せずに、Faceレベルでコントロールする方法を確立しないとダメっぽい。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r3c7.net/?feed=rss2&amp;p=420</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pollyanna</title>
		<link>http://blog.r3c7.net/?p=414</link>
		<comments>http://blog.r3c7.net/?p=414#comments</comments>
		<pubDate>Mon, 06 Jul 2009 13:27:41 +0000</pubDate>
		<dc:creator>rect</dc:creator>
				<category><![CDATA[try]]></category>
		<category><![CDATA[SiON]]></category>

		<guid isPermaLink="false">http://blog.r3c7.net/?p=414</guid>
		<description><![CDATA[しばらくの間、超多忙状態が続きそうなのでショボいデータでお茶を濁しておく。
前回のpcm同期ネタはリズムというよりSEみたいな使い方だったので、もうちょっとまともにリズム刻んでみるテスト。


var so = new  [...]]]></description>
			<content:encoded><![CDATA[<p>しばらくの間、超多忙状態が続きそうなのでショボいデータでお茶を濁しておく。<br />
前回のpcm同期ネタはリズムというよりSEみたいな使い方だったので、もうちょっとまともにリズム刻んでみるテスト。</p>
<p id="polly">
<script type="text/javascript">
var so = new SWFObject("/wp-content/uploads/sion/mother02/sip.swf", "po", "320", "38", "10", "#000000");
so.addParam("base", "/wp-content/uploads/sion/mother02/");
so.write("polly");
</script>
</p>
<p>（要：FlashPlayer10）</p>
<p>いい感じのが見つからなくて、スネアのみOPM。<br />
途中で投げ出した感がそこはかとなく漂っておりますな。<br />
さっさと仕事終わらせよう。</p>
<p><strong>090710追記</strong>：<br />
肝心な事を何も書いてなかった。<br />
当初、<a href="http://blog.r3c7.net/?p=399">前回のpcm同期テスト</a>と同じく、mp3ファイルを外部読み込みしようとしたところ、激しくレイテンシーが発生してしまった。mp3ファイルとかの圧縮音源はその仕様上データの前後に無音部分が出来ちゃうらしく、これが原因だった模様。この辺りの事情、恥ずかしながら今回初めて知った。前回はテンポがゆっくり目だったからなのか、全然気がつかなかった。</p>
<p>そこで今回は、AIFFで保存したデータをFlashに読み込んで、mp3圧縮を指定した上でswfを書き出しておき、このswfを外部読み込みして該当のSoundインスタンスを生成した。こうすることで遅延なく発音するpcmパートが完成。Flashに読み込む段階で、AIFFやWAV保存してあることがポイントみたいだ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r3c7.net/?feed=rss2&amp;p=414</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UI Sound with SiON</title>
		<link>http://blog.r3c7.net/?p=406</link>
		<comments>http://blog.r3c7.net/?p=406#comments</comments>
		<pubDate>Sun, 21 Jun 2009 14:57:10 +0000</pubDate>
		<dc:creator>rect</dc:creator>
				<category><![CDATA[try]]></category>
		<category><![CDATA[SiON]]></category>

		<guid isPermaLink="false">http://blog.r3c7.net/?p=406</guid>
		<description><![CDATA[SiON使って、UIにSEを付けたりしてみるテスト。


var so = new SWFObject("/wp-content/uploads/sion/uisound/main.swf", "uis", "504", [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.libspark.org/wiki/keim/SiON" target="_blank">SiON</a>使って、UIにSEを付けたりしてみるテスト。</p>
<p id="uisound" class="photo">
<script type="text/javascript">
var so = new SWFObject("/wp-content/uploads/sion/uisound/main.swf", "uis", "504", "180", "10", "#000000");
so.addParam("base", "/wp-content/uploads/sion/uisound/");
so.write("uisound");
</script>
</p>
<p>（要：FlashPlayer10）</p>
<p>マウスイベントなんかに連動して音を鳴らす場合、今まではmp3ファイル読み込んで再生してたけど、SiONを使うことで、PSG / FM / WaveTable / PCMなどの多彩な音源で、しかもラクしてサウンド制御ができる。個人的にはOPMが鳴るってだけで抱かれてもいいと思ったけど、トータルに音の制御ができるという側面はコンテンツ制作する上でとっても有用。</p>
<p>例えば、下記のようなコードで音の鳴るボタンが作れる。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
</pre></td><td class="code"><pre class="actionscript actionscript" style="font-family:monospace;">package
<span style="color: #444;">&#123;</span>
    <span style="color: #069;">import</span> flash.<span style="color: #444;">display</span>.<span style="color: #444;">*</span>;
    <span style="color: #069;">import</span> flash.<span style="color: #444;">events</span>.<span style="color: #444;">*</span>;
&nbsp;
    <span style="color: #069;">import</span> org.<span style="color: #444;">si</span>.<span style="color: #444;">sion</span>.<span style="color: #444;">*</span>;
&nbsp;
    <span style="color: #444;">&#91;</span>SWF<span style="color: #444;">&#40;</span><span style="color: #069;">backgroundColor</span>=0x000000<span style="color: #444;">&#41;</span><span style="color: #444;">&#93;</span>
    <span style="color: #069;">public</span> <span style="color: #39c; font-weight: bold;">class</span> main <span style="color: #069;">extends</span> Sprite
    <span style="color: #444;">&#123;</span>
        <span style="color: #069;">private</span> <span style="color: #39c; font-weight: bold;">var</span> driver:SiONDriver;
        <span style="color: #069;">private</span> <span style="color: #39c; font-weight: bold;">var</span> sinWave:SiONVoice;
&nbsp;
        <span style="color: #069;">public</span> <span style="color: #39c; font-weight: bold;">function</span> main<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>
        <span style="color: #444;">&#123;</span>
            <span style="color: #069; font-weight: bold;">if</span> <span style="color: #444;">&#40;</span><span style="color: #069;">stage</span><span style="color: #444;">&#41;</span> init<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
            <span style="color: #069; font-weight: bold;">else</span> addEventListener<span style="color: #444;">&#40;</span>Event.<span style="color: #444;">ADDED_TO_STAGE</span>, init<span style="color: #444;">&#41;</span>;
        <span style="color: #444;">&#125;</span>
&nbsp;
        <span style="color: #069;">public</span> <span style="color: #39c; font-weight: bold;">function</span> init<span style="color: #444;">&#40;</span><span style="color: #069;">e</span>:Event = <span style="color: #39c; font-weight: bold;">null</span><span style="color: #444;">&#41;</span>:<span style="color: #069;">void</span>
        <span style="color: #444;">&#123;</span>
            removeEventListener<span style="color: #444;">&#40;</span>Event.<span style="color: #444;">ADDED_TO_STAGE</span>, init<span style="color: #444;">&#41;</span>;
&nbsp;
            <span style="color: #069;">stage</span>.<span style="color: #444;">frameRate</span> = <span style="color: #444;">60</span>;
            <span style="color: #069;">stage</span>.<span style="color: #069;">scaleMode</span> = StageScaleMode.<span style="color: #444;">NO_SCALE</span>;
            <span style="color: #069;">stage</span>.<span style="color: #069;">align</span> = StageAlign.<span style="color: #444;">TOP_LEFT</span>;
            <span style="color: #069;">stage</span>.<span style="color: #069;">quality</span> = StageQuality.<span style="color: #444;">BEST</span>;
&nbsp;
            initSiON<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
        <span style="color: #444;">&#125;</span>
&nbsp;
        <span style="color: #069;">private</span> <span style="color: #39c; font-weight: bold;">function</span> initSiON<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>:<span style="color: #069;">void</span>
        <span style="color: #444;">&#123;</span>
            <span style="color: #699; font-family:Verdana;">//SiONDriverをスタンバイ</span>
            driver = <span style="color: #39c; font-weight: bold;">new</span> SiONDriver<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
            driver.<span style="color: #069;">play</span><span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
&nbsp;
            <span style="color: #699; font-family:Verdana;">//音色定義（%5, @0 = sin波）</span>
            sinWave = <span style="color: #39c; font-weight: bold;">new</span> SiONVoice<span style="color: #444;">&#40;</span><span style="color: #444;">5</span>,0<span style="color: #444;">&#41;</span>;
&nbsp;
            <span style="color: #699; font-family:Verdana;">//UIを定義</span>
            <span style="color: #39c; font-weight: bold;">var</span> soundButton:Sprite = <span style="color: #39c; font-weight: bold;">new</span> Sprite<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
            soundButton.<span style="color: #444;">graphics</span>.<span style="color: #069;">beginFill</span><span style="color: #444;">&#40;</span>0x0099cc<span style="color: #444;">&#41;</span>;
            soundButton.<span style="color: #444;">graphics</span>.<span style="color: #444;">drawRoundRect</span><span style="color: #444;">&#40;</span>0, 0, <span style="color: #444;">120</span>, <span style="color: #444;">120</span>, <span style="color: #444;">4</span>, <span style="color: #444;">4</span><span style="color: #444;">&#41;</span>;
            soundButton.<span style="color: #444;">graphics</span>.<span style="color: #069;">endFill</span><span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
            addChild<span style="color: #444;">&#40;</span>soundButton<span style="color: #444;">&#41;</span>;
            soundButton.<span style="color: #444;">x</span> = <span style="color: #444;">20</span>, soundButton.<span style="color: #444;">y</span> = <span style="color: #444;">20</span>;
&nbsp;
            soundButton.<span style="color: #444;">addEventListener</span><span style="color: #444;">&#40;</span>MouseEvent.<span style="color: #444;">ROLL_OVER</span>, <span style="color: #069;">onrollover</span><span style="color: #444;">&#41;</span>;
            soundButton.<span style="color: #069;">useHandCursor</span> = <span style="color: #39c; font-weight: bold;">true</span>;
        <span style="color: #444;">&#125;</span>
&nbsp;
        <span style="color: #069;">public</span> <span style="color: #39c; font-weight: bold;">function</span> <span style="color: #069;">onrollover</span><span style="color: #444;">&#40;</span><span style="color: #069;">e</span>:MouseEvent<span style="color: #444;">&#41;</span>:<span style="color: #069;">void</span>
        <span style="color: #444;">&#123;</span>
            <span style="color: #699; font-family:Verdana;">//ノート番号90番（オクターブ7の「ファ」）の音を</span>
            <span style="color: #699; font-family:Verdana;">//事前に定義した音色（sinWave）で鳴らす。</span>
            <span style="color: #699; font-family:Verdana;">//第3引数：音長（1 = 16分音符）, 第4引数：発音までのディレイ</span>
            driver.<span style="color: #444;">noteOn</span><span style="color: #444;">&#40;</span><span style="color: #444;">90</span>, sinWave, <span style="color: #444;">1</span>, 0<span style="color: #444;">&#41;</span>;
        <span style="color: #444;">&#125;</span>
    <span style="color: #444;">&#125;</span>
<span style="color: #444;">&#125;</span></pre></td></tr></table></div>

<p>音色定義については、<a href="http://mmltalks.appspot.com/document/siopm_mml_ref_05.html" target="_blank">SiON MMLリファレンス</a>「音色関連 &#8211; &#8216;%&#8217;,'@&#8217;の第1引数」の項を参照。</p>
<p>音色定義を</p>
<pre class="code">
var sawWave:SiONVoice = new SiONVoice(5,1);    // ノコギリ波
var triWave:SiONVoice = new SiONVoice(5,4);    // 三角波
var squareWave:SiONVoice = new SiONVoice(5,5); // 矩形波
</pre>
<p>などと差し替えることで違う音色にできる。PSG / FM / WaveTable 音源については、使いこなせれば、別途音源データを用意せずに、コーディングだけで多彩な音を鳴らすことができる反面、音色定義自体がそれなりの知識と慣れを要求するので、UIサウンドとしてお手軽にSiONを活用することを考えた場合、swfに埋め込んだ、もしくは外部から読み込んだmp3サウンドをSiONで制御するのが良いんじゃないかと思う。例えば以下のような感じで。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
</pre></td><td class="code"><pre class="actionscript actionscript" style="font-family:monospace;">package
<span style="color: #444;">&#123;</span>
    <span style="color: #069;">import</span> flash.<span style="color: #444;">display</span>.<span style="color: #444;">*</span>;
    <span style="color: #069;">import</span> flash.<span style="color: #444;">events</span>.<span style="color: #444;">*</span>;
    <span style="color: #069;">import</span> flash.<span style="color: #444;">media</span>.<span style="color: #444;">*</span>;
&nbsp;
    <span style="color: #069;">import</span> org.<span style="color: #444;">si</span>.<span style="color: #444;">sion</span>.<span style="color: #444;">*</span>;
&nbsp;
    <span style="color: #444;">&#91;</span>SWF<span style="color: #444;">&#40;</span><span style="color: #069;">backgroundColor</span>=0x000000<span style="color: #444;">&#41;</span><span style="color: #444;">&#93;</span>
    <span style="color: #069;">public</span> <span style="color: #39c; font-weight: bold;">class</span> main <span style="color: #069;">extends</span> Sprite
    <span style="color: #444;">&#123;</span>
        <span style="color: #069;">private</span> <span style="color: #39c; font-weight: bold;">var</span> driver:SiONDriver;
        <span style="color: #069;">private</span> <span style="color: #39c; font-weight: bold;">var</span> pcmsound:SiONVoice;
&nbsp;
        <span style="color: #444;">&#91;</span>Embed<span style="color: #444;">&#40;</span>source=<span style="color: #933;">'hoge.mp3'</span><span style="color: #444;">&#41;</span><span style="color: #444;">&#93;</span>
        <span style="color: #069;">private</span> <span style="color: #39c; font-weight: bold;">var</span> hogeSound:<span style="color: #39c; font-weight: bold;">Class</span>;
&nbsp;
        <span style="color: #069;">public</span> <span style="color: #39c; font-weight: bold;">function</span> main<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>
        <span style="color: #444;">&#123;</span>
            <span style="color: #069; font-weight: bold;">if</span> <span style="color: #444;">&#40;</span><span style="color: #069;">stage</span><span style="color: #444;">&#41;</span> init<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
            <span style="color: #069; font-weight: bold;">else</span> addEventListener<span style="color: #444;">&#40;</span>Event.<span style="color: #444;">ADDED_TO_STAGE</span>, init<span style="color: #444;">&#41;</span>;
        <span style="color: #444;">&#125;</span>
&nbsp;
        <span style="color: #069;">public</span> <span style="color: #39c; font-weight: bold;">function</span> init<span style="color: #444;">&#40;</span><span style="color: #069;">e</span>:Event = <span style="color: #39c; font-weight: bold;">null</span><span style="color: #444;">&#41;</span>:<span style="color: #069;">void</span>
        <span style="color: #444;">&#123;</span>
            removeEventListener<span style="color: #444;">&#40;</span>Event.<span style="color: #444;">ADDED_TO_STAGE</span>, init<span style="color: #444;">&#41;</span>;
&nbsp;
            <span style="color: #069;">stage</span>.<span style="color: #444;">frameRate</span> = <span style="color: #444;">60</span>;
            <span style="color: #069;">stage</span>.<span style="color: #069;">scaleMode</span> = StageScaleMode.<span style="color: #444;">NO_SCALE</span>;
            <span style="color: #069;">stage</span>.<span style="color: #069;">align</span> = StageAlign.<span style="color: #444;">TOP_LEFT</span>;
            <span style="color: #069;">stage</span>.<span style="color: #069;">quality</span> = StageQuality.<span style="color: #444;">BEST</span>;
&nbsp;
            initSiON<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
        <span style="color: #444;">&#125;</span>
&nbsp;
        <span style="color: #069;">private</span> <span style="color: #39c; font-weight: bold;">function</span> initSiON<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>:<span style="color: #069;">void</span>
        <span style="color: #444;">&#123;</span>
            <span style="color: #699; font-family:Verdana;">//SiONDriverをスタンバイ</span>
            driver = <span style="color: #39c; font-weight: bold;">new</span> SiONDriver<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
            driver.<span style="color: #069;">play</span><span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
&nbsp;
            <span style="color: #699; font-family:Verdana;">//音色定義（PCMサウンド）</span>
            <span style="color: #39c; font-weight: bold;">var</span> hoge:<span style="color: #069;">Sound</span> = <span style="color: #39c; font-weight: bold;">new</span> hogeSound<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
            driver.<span style="color: #444;">setSamplerSound</span><span style="color: #444;">&#40;</span><span style="color: #444;">90</span>, hoge<span style="color: #444;">&#41;</span>;  <span style="color: #699; font-family:Verdana;">//ノート番号90番に、Embedしたmp3サウンドを割り当て</span>
            pcmsound = <span style="color: #39c; font-weight: bold;">new</span> SiONVoice<span style="color: #444;">&#40;</span><span style="color: #444;">10</span><span style="color: #444;">&#41;</span>;
&nbsp;
            <span style="color: #699; font-family:Verdana;">//UIを定義</span>
            <span style="color: #39c; font-weight: bold;">var</span> soundButton:Sprite = <span style="color: #39c; font-weight: bold;">new</span> Sprite<span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
            soundButton.<span style="color: #444;">graphics</span>.<span style="color: #069;">beginFill</span><span style="color: #444;">&#40;</span>0x0099cc<span style="color: #444;">&#41;</span>;
            soundButton.<span style="color: #444;">graphics</span>.<span style="color: #444;">drawRoundRect</span><span style="color: #444;">&#40;</span>0, 0, <span style="color: #444;">120</span>, <span style="color: #444;">120</span>, <span style="color: #444;">4</span>, <span style="color: #444;">4</span><span style="color: #444;">&#41;</span>;
            soundButton.<span style="color: #444;">graphics</span>.<span style="color: #069;">endFill</span><span style="color: #444;">&#40;</span><span style="color: #444;">&#41;</span>;
            addChild<span style="color: #444;">&#40;</span>soundButton<span style="color: #444;">&#41;</span>;
            soundButton.<span style="color: #444;">x</span> = <span style="color: #444;">20</span>, soundButton.<span style="color: #444;">y</span> = <span style="color: #444;">20</span>;
&nbsp;
            soundButton.<span style="color: #444;">addEventListener</span><span style="color: #444;">&#40;</span>MouseEvent.<span style="color: #444;">ROLL_OVER</span>, <span style="color: #069;">onrollover</span><span style="color: #444;">&#41;</span>;
            soundButton.<span style="color: #069;">useHandCursor</span> = <span style="color: #39c; font-weight: bold;">true</span>;
        <span style="color: #444;">&#125;</span>
&nbsp;
        <span style="color: #069;">public</span> <span style="color: #39c; font-weight: bold;">function</span> <span style="color: #069;">onrollover</span><span style="color: #444;">&#40;</span><span style="color: #069;">e</span>:MouseEvent<span style="color: #444;">&#41;</span>:<span style="color: #069;">void</span>
        <span style="color: #444;">&#123;</span>
            <span style="color: #699; font-family:Verdana;">//ノート番号90番（mp3サウンドを割り当てた場所）の音を鳴らす。</span>
            driver.<span style="color: #444;">noteOn</span><span style="color: #444;">&#40;</span><span style="color: #444;">90</span>, pcmsound, <span style="color: #444;">1</span>, 0<span style="color: #444;">&#41;</span>;
        <span style="color: #444;">&#125;</span>
    <span style="color: #444;">&#125;</span>
<span style="color: #444;">&#125;</span></pre></td></tr></table></div>

<p>setSamplerSoundは、通常0-127までのノート番号に任意のSoundを割り当て可能。さらにバンク切り替えで128-255まで定義しておくことができる。</p>
<p>また、driver.noteOn()の代わりに driver.sequenceOn() を使うことで、事前に定義したMMLを再生することも可能。</p>
<pre class="code">
driver = new SiONDriver();
var mml:SiONData = driver.compile("l16 o6 ffffre-rgrf2;l16 o6 c>bb-argrb-ra2;");
driver.play();

sinWave = new SiONVoice(5,0);
driver.sequenceOn(mml, sinWave, 0, 0, 1, 3);
</pre>
<p>driver.sequenceOn()は、別途演奏中のMMLシーケンスとタイミングを合わせて再生を乗せることができたりするあたりの仕様にニヤリとさせられた。</p>
<p>加えて、delay, reverb, chorus 等のエフェクトや、low/high pass filter等のフィルタも備えているため、かなり自由度の高い音作りをすることもできる（このエントリ冒頭のデモでは、reverbをon/offできるようにした）<br />
SiONで使えるエフェクトについては、<a href="http://mmltalks.appspot.com/document/siopm_mml_ref_05.html" target="_blank">SiON MMLリファレンス</a>「エフェクタ接続」の項を参照。</p>
<p>ということで、SiONはオッサンの懐古主義を満足させるためだけのものではなく（オレにとってはここも超重要なのだけど）、Flashによるコンテンツ制作におけるサウンド面の実装を容易に、表現力豊かにしてくれる、とても有り難いライブラリなのですな。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r3c7.net/?feed=rss2&amp;p=406</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>falcomネタその2</title>
		<link>http://blog.r3c7.net/?p=399</link>
		<comments>http://blog.r3c7.net/?p=399#comments</comments>
		<pubDate>Sun, 14 Jun 2009 17:13:26 +0000</pubDate>
		<dc:creator>rect</dc:creator>
				<category><![CDATA[try]]></category>
		<category><![CDATA[SiON]]></category>

		<guid isPermaLink="false">http://blog.r3c7.net/?p=399</guid>
		<description><![CDATA[週末はSiONの日。
pcmとFMを同時に鳴らすテスト。
最終的には、自作の.mdxを全部SiONに移植したいので、.pdxからpcmを取り出してmp3化する方法も併せて模索。
pdxをバラすのに、dos用mxdrvのp [...]]]></description>
			<content:encoded><![CDATA[<p>週末は<a href="http://www.libspark.org/wiki/keim/SiON" target="_blank">SiON</a>の日。</p>
<p>pcmとFMを同時に鳴らすテスト。<br />
最終的には、自作の.mdxを全部SiONに移植したいので、.pdxからpcmを取り出してmp3化する方法も併せて模索。</p>
<p>pdxをバラすのに、<a href="http://www.vector.co.jp/soft/dos/art/se003454.html" target="_blank">dos用mxdrv</a>のpdexを使用。取り出したpcmを<a href="http://rd.vector.co.jp/soft/dos/art/se010940.html" target="_blank">pcm2wav</a>で、wavファイルに変換後mp3化した。この辺はwindows環境でないとツールが全然無い。マカーにとっては寂しい限り。</p>
<p>ということで出来た。FM8ch + PCM3ch構成の「Palace」米光アレンジモドキ。</p>
<p id="ys06">
<script type="text/javascript">
var so = new SWFObject("/wp-content/uploads/sion/ys_06a/sip.swf", "monalisa", "320", "38", "10", "#000000");
so.addParam("base", "/wp-content/uploads/sion/ys_06a/");
so.write("ys06");
</script>
</p>
<p>（要：FlashPlayer10）</p>
<p>次はFM8ch+PCM8chなネタで、mxdrv+pcm8をFlashで復元だー。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r3c7.net/?feed=rss2&amp;p=399</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PV3D2.x] DisplayObject3D.lookAt problem</title>
		<link>http://blog.r3c7.net/?p=394</link>
		<comments>http://blog.r3c7.net/?p=394#comments</comments>
		<pubDate>Sat, 13 Jun 2009 16:24:28 +0000</pubDate>
		<dc:creator>rect</dc:creator>
				<category><![CDATA[try]]></category>
		<category><![CDATA[papervision3d2.0]]></category>

		<guid isPermaLink="false">http://blog.r3c7.net/?p=394</guid>
		<description><![CDATA[tkinjoさんが、wonderflに投稿されたコードを見て。
sceneの原点（0, 0, 0）にターゲット指定したカメラを x=0, y=1000, z=0 のように、ワールド座標のY軸線上に配置すると何も表示されな [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wonderfl.kayac.com/code/3affbb69d1ad490c7e5ba360ec894be9be251d68" target="_blank">tkinjoさんが、wonderflに投稿されたコード</a>を見て。</p>
<p>sceneの原点（0, 0, 0）にターゲット指定したカメラを x=0, y=1000, z=0 のように、ワールド座標のY軸線上に配置すると何も表示されなくなる。<br />
回避策として、tkinjoさんも採用している x, y座標を0にしないってのが一番ラクチン。<br />
x=0, y=1000, z=-0.1 とか x=0.01, y=1000, z=-0.05 とかを指定する方法。<br />
ただし、x軸、z軸のどっちを使ってY軸からずらすかによって結果が異なる。また数値の±によっても結果が異なる点に注意。大抵はz軸にマイナスの値を入れるといいんじゃないかと。</p>
<p>別の方法として、カメラのターゲット指定をせずに</p>
<pre class="code">
camera.target = null;
camera.x = 0;
camera.y = 1000;
camera.z = 0;
camera.rotationX = 90;
</pre>
<p>という設定で同じ状況にした場合も、問題を回避できる。</p>
<p>にしても、なんでなんだぜ？<br />
今まで何が原因なのかをちゃんと調べてなかったので、この機会に調べてみた。<br />
多分、<a href="http://blog.r3c7.net/?p=124">随分前に遭遇したこのトラブル</a>とも関連がありそう。</p>
<p>カメラにターゲット指定しなけりゃ問題ねーってことなんで、lookAt メソッドが怪しいと睨んで DisplayObject3D.lookAt の該当部分を見てみると、</p>
<p><strong>［1］</strong>まず、目標にカメラを向けた時のz軸ベクトルを、ターゲットの位置ベクトルからカメラの位置ベクトルから減算して正規化。</p>
<pre class="code">
_zAxis.copyFrom(_lookatTarget);
_zAxis.minusEq(_position);
_zAxis.normalize();
</pre>
<p><strong>［2］</strong>1で求めたカメラの正規化されたz軸ベクトルと、カメラのupperベクトル（通常は Number3D(0, 1, 0) ）との外積をとって、x軸ベクトルを求める。</p>
<pre class="code">
if( _zAxis.modulo > 0.1 )
    {
        _xAxis = Number3D.cross( _zAxis, upAxis || UP, _xAxis );
        _xAxis.normalize();
</pre>
<p><strong>［3］</strong>1で求めたz軸ベクトルと、2で求めたx軸ベクトルの外積をとって、y軸のベクトルを求める。</p>
<pre class="code">
        _yAxis = Number3D.cross( _zAxis, _xAxis, _yAxis );
        _yAxis.normalize();
</pre>
<p>こんな手順でカメラとターゲットとの位置関係を元に、カメラの姿勢を決めてる模様。</p>
<p>この方法だと、x=0, y=1000, z=0 にカメラがある場合、_zAxisが Number3D (0, 1, 0) になる。<br />
こうなると _xAxisを求める際に外積を取るための、カメラのupperベクトル：Number3D (0, 1, 0) と平行になる。平行なベクトルの外積の大きさはゼロなので、_xAxis は Number3D (0, 0, 0)。<br />
最後の_yAxis は _xAxis との外積だから、_yAxisも Number3D (0, 0, 0)。<br />
って感じでz軸以外がゼロベクトルになっちゃって、カメラの姿勢が定まらない。結果、何も表示されないということみたいだ。これっていわゆるジンバルロックなのか？<br />
むー。PV3Dサイドとしては、これは仕様だということにしてるんだろうか？</p>
<p>なんかアホっぽい方法で回避できそうな気がしたのでやってみた。<br />
DisplayObject3Dの1213行目辺りから</p>
<pre class="code">
            _zAxis.copyFrom(_lookatTarget);
            _zAxis.minusEq(_position);
            _zAxis.normalize();

            if( _zAxis.modulo > 0.1 )
            {
                _xAxis = Number3D.cross( _zAxis, upAxis || UP, _xAxis );
                _xAxis.normalize();

                _yAxis = Number3D.cross( _zAxis, _xAxis, _yAxis );
                _yAxis.normalize();
</pre>
<p>という部分を以下に書き換え。</p>
<pre class="code">
            _zAxis.copyFrom(_lookatTarget);
            _zAxis.minusEq(_position);
           _zAxis.normalize();

           if( _zAxis.modulo > 0.1 )
            {
                _xAxis = Number3D.cross( _zAxis, upAxis || UP, _xAxis );
                _xAxis.normalize();

                if(_xAxis.x == 0 &#038;&#038; _xAxis.y == 0 &#038;&#038; _xAxis.z == 0)
                {
                    _yAxis = Number3D.cross( _zAxis, RIGHT, _yAxis );
                    _yAxis.normalize();

                    var tempYAxis:Number3D = new Number3D(-_yAxis.x, -_yAxis.y, -_yAxis.z);
                    _xAxis = Number3D.cross( _zAxis, tempYAxis, _xAxis );
                    _xAxis.normalize();
                }
                else
                {
                    _yAxis = Number3D.cross( _zAxis, _xAxis, _yAxis );
                    _yAxis.normalize();
                }
</pre>
<p>特異点でlookAtする場合のみ、_yAxisを先に求めるようにしたので、カメラが x=0, y=1000, z=0に配置された場合もそれっぽく表示されるようになる。強制的にLEFTベクトルとの外積を取るようにしちゃったので、カメラがアニメーションしてる場合、おかしな挙動になるケースもあるかもしれない力業。<br />
それでも何にも表示されないよりはマシかなぁ。もうひとひねりしてクォータニオン使う方法も考えてみたい。</p>
<p><strong>09/06/15追記</strong>：tkinjoさんのご指摘を受けてコード修正。<br />
やっつけ気味なのは変わらず；</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r3c7.net/?feed=rss2&amp;p=394</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>[PV3D2.1] Papervision3D 2.1 animation classes</title>
		<link>http://blog.r3c7.net/?p=390</link>
		<comments>http://blog.r3c7.net/?p=390#comments</comments>
		<pubDate>Thu, 11 Jun 2009 07:51:33 +0000</pubDate>
		<dc:creator>rect</dc:creator>
				<category><![CDATA[try]]></category>
		<category><![CDATA[papervision3d2.0]]></category>

		<guid isPermaLink="false">http://blog.r3c7.net/?p=390</guid>
		<description><![CDATA[
daeAnimation（要：FlashPlayer9）
[↑] … 前進（move forward）
[←] [→] … 方向変える（turn left/right）
Papervision2.1 Alpha 公開で [...]]]></description>
			<content:encoded><![CDATA[<p class="photo"><a href="/wp-content/uploads/parsers/daeAnimation/main.swf" target="_blank"><img src="/wp-content/uploads/e_deaanimation.jpg" border="0" /></a></p>
<p><a href="/wp-content/uploads/parsers/daeAnimation/main.swf" target="_blank" class="ext-link">daeAnimation</a>（要：FlashPlayer9）</p>
<p>[↑] … 前進（move forward）<br />
[←] [→] … 方向変える（turn left/right）</p>
<p>Papervision2.1 Alpha 公開で、鬼門だったDAE周りが改善されたということで使ってみた。<br />
<a href="http://techblog.floorplanner.com/2009/05/26/papervision3d-21-alpha/" target="_blank" class="ext-link">http://techblog.floorplanner.com/2009/05/26/papervision3d-21-alpha/</a></p>
<p>BlenderでArmature使ったスキンメッシュをColladaでエクスポートしたものがようやく動くようになった。3dsMAXとかMaya使わない限り不可能かと思ってたけど、どうにか使えそう。Away3Dでもなんとか動いてたけど、ボーンのモーションにtranslateが含まれてると破綻したりして不完全な感じだったのが、PV3D2.1のほうが格段にマトモだ。</p>
<p>上のデモは、<a href="http://www.kyucon.com/blog/archives/000440.html" target="_blank">KYUCON*BLOGさんで紹介されているAnimationClip3Dを使う方法</a>で静止状態と、歩行中のアニメーションを切り替えて再生してる。スタート・エンドポイントの指定がフレーム単位でもできればいいのになぁ…なんか歩行モーションのループ部分がぎこちない。Blender上だと綺麗につながるんだけどな。</p>
<p>Colladaの仕様的には、animationChannelを定義できるはずなので、Blenderでアニメーションセットを複数定義した上で正常に書き出しができればもっと楽ができそうな、ほのかで甘酸っぱい期待を持ったんだけど、Blenderで複数のアニメーションセットを定義する方法がわかんなくて一旦保留。</p>
<p>こうなってくると、アニメーション切り替え時にモーションブレンドしたい。それは自前で実装するしかねーだろうなー。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r3c7.net/?feed=rss2&amp;p=390</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
