<?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>technical | ユガラボ</title>
	<atom:link href="https://yugalab.net/archives/category/4000_technical/feed" rel="self" type="application/rss+xml" />
	<link>https://yugalab.net</link>
	<description>pursue the beauty with yuga lab.</description>
	<lastBuildDate>Fri, 30 Sep 2022 10:15:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.7.7</generator>
	<item>
		<title>【VRChat】自作ワールド作りました！ いろいろメモ(作業手順、UdonSharp、軽量化など)</title>
		<link>https://yugalab.net/archives/46481</link>
					<comments>https://yugalab.net/archives/46481#respond</comments>
		
		<dc:creator><![CDATA[ユーリ]]></dc:creator>
		<pubDate>Fri, 30 Sep 2022 10:15:05 +0000</pubDate>
				<category><![CDATA[Blender]]></category>
		<category><![CDATA[technical]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[VRChat]]></category>
		<guid isPermaLink="false">https://yugalab.net/?p=46481</guid>

					<description><![CDATA[<p>こんにちは、ユーリです。最近VR端末のMeta Quest2を買いまして、VRにはまってます！特にVRChatが楽しくてアバター作ったり色々してたのですが、ついにワールドも作りました。大変だったところなどをまとめました。 [&#8230;]</p>
<p>The post <a href="https://yugalab.net/archives/46481">【VRChat】自作ワールド作りました！ いろいろメモ(作業手順、UdonSharp、軽量化など)</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ユーリです。最近VR端末のMeta Quest2を買いまして、VRにはまってます！<br />特にVRChatが楽しくてアバター作ったり色々してたのですが、ついにワールドも作りました。大変だったところなどをまとめました。<br /><span id="more-46481"></span><br /><div class="post_linker" data-href="0">VRChatの紹介(軽く)</div><div class="post_linker" data-href="1">ワールドの土台作成</div><div class="post_linker" data-href="2">家具と小物の配置</div><div class="post_linker" data-href="3">UdonSharp製ギミックをつくる</div><div class="post_linker" data-href="4">ギミックの同期問題</div><div class="post_linker" data-href="5">仕上げ(軽量化とライトベイク)</div><br /><h3 class="section_title putit_caption l_green">VRChatの紹介(軽く)</h3><br /><span class="under l_blue"><a href="https://hello.vrchat.com/">VRChat</a></span>とは、バーチャル空間上でアバターを着て他の方とおしゃべりできるツールです！<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_b02.jpg"><img loading="lazy" class="alignnone size-full wp-image-46645" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_b02.jpg" alt="" width="624" height="332" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_b02.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_b02-300x160.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />アバターは配布されているものもありますが、自作の3Dモデルをアップできるので非常に自由度が高く、人型はもちろんケモノでも触手でもなんにでもなれちゃうのがすごいところ。<br />楽しむために頭にかぶるようなVR機器が必要だと勘違いされがちですが、デスクトップPCでもモニタに映してプレイできます。(ただし没入感は得にくいです)<br /><br />自分オリジナルの場所として「ワールド」を作って思い通りの景色に降り立つこともできるし、スクリプトを書いてギミックを置いたりもできます。<br />ゲームというよりソーシャルプラットフォームに近いものですが、VRならではの臨場感からあたかもその場にいるような感覚があり、好きな見た目になって好きなところへ行けるが魅力。<br />近い未来、バーチャル空間で暮らせるようになったらこんな感じなのかも。ギミックが作り込まれているワールドではゲームっぽい遊びもできちゃう！<br /><br />ちなみにわたしはこのアバターをつかってます。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_d01.jpg"><img loading="lazy" class="alignnone size-full wp-image-46655" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_d01.jpg" alt="" width="624" height="332" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_d01.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_d01-300x160.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><span class="l_blue under"><a href="https://vroid.com/studio">VRoidStudio</a></span>というアバター制作ツール(無料)と、モデリングソフトの<span class="l_blue under"><a href="https://blender.jp/">Blender</a></span>(無料)による小物追加で自作しました！<br />わたしは3Dモデリングは得意なほうではありませんが、今は便利なツールがたくさんあるので専門的な技術がなくても比較的とっつきやすかったです！ もしVRで見かけたらお気軽に絡んでください。<br /><br /><h4 class="section_subtitle putit_caption">自作ワールド紹介</h4>そして今回わたしが自作したワールドはこちら！「Cafe &amp; Bar 宵星」です。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_a01.jpg"><img loading="lazy" class="alignnone size-full wp-image-46629" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_a01.jpg" alt="" width="624" height="331" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_a01.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_a01-300x159.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />後述しますが、弓矢を使って夜空に星を打ち上げ、星座を作って遊べるギミックがあります。これがこのワールドの目玉！<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_b04.gif"><img loading="lazy" class="alignnone size-full wp-image-46644" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_b04.gif" alt="" width="624" height="351" /></a><br /><br />たくさん星を打ち上げればカラフルになってにぎやかです。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_a02.jpg"><img loading="lazy" class="alignnone size-full wp-image-46630" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_a02.jpg" alt="" width="624" height="351" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_a02.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_a02-300x169.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />カフェスペースではスイーツが食べ放題です。くつろげるスペースも置いてみました。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_a05.jpg"><img loading="lazy" class="alignnone size-full wp-image-46631" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_a05.jpg" alt="" width="624" height="362" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_a05.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_a05-300x174.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />Barコーナーはいい感じのシーリングファンライトがまわってます。影で雰囲気をだしてる。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_a04.jpg"><img loading="lazy" class="alignnone size-full wp-image-46632" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_a04.jpg" alt="" width="624" height="351" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_a04.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_a04-300x169.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />最近話題の画像生成AIでつくったアートを飾ったりもしてます。こういうのを配置するだけでもなんとなく見栄えがよくなるから助かる。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_a03.jpg"><img loading="lazy" class="alignnone size-full wp-image-46633" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_a03.jpg" alt="" width="624" height="351" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_a03.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_a03-300x169.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />ご興味がある方はVRChatのアカウントがあれば<span class="under l_blue"><a href="https://vrchat.com/home/launch?worldId=wrld_e9432bb9-03d7-4f5b-808b-f58c510ec6e0">こちらのリンク</a></span>からワールドを開けますので是非あそんでみてください！QUESTも対応してます。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_a06.jpg"><img loading="lazy" class="alignnone size-full wp-image-46634" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_a06.jpg" alt="" width="624" height="370" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_a06.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_a06-300x178.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />以下、ワールド作成にあたり行った作業を紹介していきます。作業開始から2週間くらいでできたけど、めっちゃ楽しくて仕事と食事以外ずっとワールド作ってました。全作業合計で40~50時間くらいやった気がする。<br />※あくまでもわたしなりのやり方ですので参考までに！<br /><br /><h3 class="section_title putit_caption l_green">ワールドの土台作成</h3><br /><h4 class="section_subtitle putit_caption">Blenderで床や柱をつくる</h4>今回のワールドはおうち+庭的な構成にするつもりでしたが、細かいレイアウトはぜんぜん考えてなかったので作りながら雰囲気で組み立てました。<br />床と柱部分を作ってからUnity上で配置しながら作る方向で進めます。<br />まずBlenderでただの立方体を作り…、<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_c01.jpg"><img loading="lazy" class="alignnone size-full wp-image-46636" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_c01.jpg" alt="" width="624" height="317" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_c01.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_c01-300x152.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />ネット上で拾ってきたフリー素材のテクスチャを貼ります。(テクスチャの貼り方はググってください)そして縦サイズを縮めて平べったくつくれば「床」の完成です。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_c02.jpg"><img loading="lazy" class="alignnone size-full wp-image-46637" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_c02.jpg" alt="" width="624" height="336" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_c02.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_c02-300x162.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a>誰がなんと言おうと床タイルです。いいですね？<br /><br />同様に細長い立方体にテクスチャを貼れば柱の完成です。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_c03.jpg"><img loading="lazy" class="alignnone size-full wp-image-46638" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_c03.jpg" alt="" width="624" height="342" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_c03.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_c03-300x164.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />柱なんです。いいですね？ 完成です。<br />本当にただの立方体で頂点が8つしかないモデリングとも呼べないシロモノですが、テクスチャを貼れば見た目がそれっぽくなるので案外大丈夫です。<br /><br />ここで大事なのは縦横の寸法を1m x 1m などキリのよい数字で、座標xyzゼロで作ることです。こうすることでUnity上で座標を打って配置する時に隙間なくピッチリ置けるようになります。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_b01.jpg"><img loading="lazy" class="alignnone size-full wp-image-46646" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_b01.jpg" alt="" width="624" height="301" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_b01.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_b01-300x145.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />中途半端な寸法で作ると配置するときに重なったりうまく繋がらなかったりするのでご注意。<br /><br />書き出す時は、対象の立体(メッシュ)を選択してからfbx形式でエクスポート。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_g01.jpg"><img loading="lazy" class="alignnone size-full wp-image-46720" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_g01.jpg" alt="" width="624" height="297" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_g01.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_g01-300x143.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />「選択したオブジェクトのみ」、「メッシュのみ」で書き出します。パーツごとに1つ1つ書き出しましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_g02.jpg"><img loading="lazy" class="alignnone size-full wp-image-46721" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_g02.jpg" alt="" width="624" height="325" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_g02.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_g02-300x156.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />ついでにちょっと頑張って斜めの床も作ったりしました。ナナメパーツがあるとマイクラ的お豆腐建築から脱出でき、組み合わせバリエーションがグッと増えます。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_c04.jpg"><img loading="lazy" class="alignnone size-full wp-image-46639" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_c04.jpg" alt="" width="624" height="338" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_c04.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_c04-300x163.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /><h4 class="section_subtitle putit_caption">Unityで配置する</h4>それからUnity側の作業に移ります。VRChatに対応しているバージョンのUnityを入手してください。無料です。<br />ワールドを作り始める前の一番大事な作業はVRCWorldSDKをインポートすること。<br />インポートができたらAssets&gt;VRChat Examples&gt;Prefabsの中にあるVRCWorldをシーンに配置しましょう。これを入れることでVRChatのワールドとしてアップロードできるようになります。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_c05.jpg"><img loading="lazy" class="alignnone size-full wp-image-46640" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_c05.jpg" alt="" width="624" height="360" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_c05.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_c05-300x173.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />SDKなどの基本ファイルをインポートできたらいよいよ制作開始です。<br />まずお家の柱などを置く前に地面が欲しいので、3DオブジェクトのCubeを作成し基底の床(地面)をつくります。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_c06.jpg"><img loading="lazy" class="alignnone size-full wp-image-46641" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_c06.jpg" alt="" width="624" height="363" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_c06.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_c06-300x175.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />作ったcubeの縦横の寸法を100倍にすれば平べったい形状になります。もうこの上を立って歩けちゃいます！<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_c07.jpg"><img loading="lazy" class="alignnone size-full wp-image-46642" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_c07.jpg" alt="" width="624" height="360" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_c07.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_c07-300x173.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />真っ白な床のままだと味気ないですが、テクスチャを貼れば地面にも草原にでもサイバーパンクSFフィールドにもなります。テクスチャは万能です。<br />テクスチャを貼るためにはマテリアルが必要なので、画面下のファイルビューで右クリックし、作成→マテリアルを作りましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_h01.jpg"><img loading="lazy" class="alignnone size-full wp-image-46732" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_h01.jpg" alt="" width="624" height="353" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_h01.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_h01-300x170.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />次に作ったマテリアルを床にしたいCubeに割り当てます。Cubeを選択すると右インスペクタ内にCubeに対応する「Mesh Renderer」の設定ができます。これがCubeの描画を担当している部分です。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_h02.jpg"><img loading="lazy" class="alignnone size-full wp-image-46733" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_h02.jpg" alt="" width="624" height="436" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_h02.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_h02-300x210.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />MeshRendererはデフォルトでは真っ白なマテリアルが割り当てられていますが、編集するために新規作成したマテリアルをドラッグドロップして割り当てます。<br /><br />割り当てたら自由に編集できるようになるのでマテリアルを開き「アルベド」から床の見た目にしたいテクスチャを選択します。するとテクスチャ画像の模様が床に反映されます！<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_h03.jpg"><img loading="lazy" class="alignnone size-full wp-image-46734" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_h03.jpg" alt="" width="624" height="391" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_h03.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_h03-300x188.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />今回は草地にしました。テクスチャ画像についてはフリー素材を探してくるなりお絵かきソフトで作成するなり、AIで生成するなりしてください。<br /><br />それからBlenderで作成した床をUnityに取り込んでならべる作業です。<br />Blenderで書き出したfbxファイルをドラッグドロップでUnityのフォルダに放り込んでください。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_h04.jpg"><img loading="lazy" class="alignnone size-full wp-image-46735" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_h04.jpg" alt="" width="624" height="272" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_h04.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_h04-300x131.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />するとUnityプロジェクト内にモデリングした物体を取り込めるので、今度はそれをワールドに配置していきます。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_h05.jpg"><img loading="lazy" class="alignnone size-full wp-image-46736" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_h05.jpg" alt="" width="624" height="397" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_h05.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_h05-300x191.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />先程の手順でマテリアルとテクスチャを取り込めば見た目もBlenderで作った通りになります。ここまでくればもう後は楽しい作業しかありません。<br /><br />床をいい感じに配置して、柱をいい感じに立てます。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_b05.jpg"><img loading="lazy" class="alignnone size-full wp-image-46648" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_b05.jpg" alt="" width="624" height="380" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_b05.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_b05-300x183.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />ここはサクッとやったように見えますが1~2時間かかってます。<br /><br />次に柱の間を壁を構成する用の壁も作って、柱の間を壁で埋めたらもうそれっぽい感じがでてきます。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_b06.jpg"><img loading="lazy" class="alignnone size-full wp-image-46649" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_b06.jpg" alt="" width="624" height="383" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_b06.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_b06-300x184.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />壁部分をblenderで作ってテクスチャをさらに用意して、窓ありverも作って…といった作業でさらに2~3時間かかってます。でも一番たのしいのでやってればいつのまにか時間が過ぎちゃいます。<br /><br />床と壁ができたら、床部分をコピペして天井を作ればもう屋内化が完了。屋根をつけると真っ暗になるので、建物内に光源を置きましょう。右クリックしてライトを新規作成します。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_e01.jpg"><img loading="lazy" class="alignnone size-full wp-image-46688" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_e01.jpg" alt="" width="624" height="288" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_e01.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_e01-300x138.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />屋内用ならポイントライトなどがオススメ。<br />光源を置いたら勝手に雰囲気がでてきます。すごいですね。ここまで来たらもう勝ったようなもんです。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_b07.jpg"><img loading="lazy" class="alignnone size-full wp-image-46650" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_b07.jpg" alt="" width="624" height="383" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_b07.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_b07-300x184.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /><br /><h3 class="section_title putit_caption l_green">家具と小物の配置</h3><br />さて、建物のガワと床と壁は自前で用意しましたが、中にある家具や小物は自力で作ろうとすると大変です。<br />ですが！ VRChatのワールドを作りたい需要はけっこうあるためか、Boothなどで探すと無料で使える3Dデータがたくさんあります！ 高クオリティで有料のものも多数。<br />いろいろと置きたい小物を集めて配置しました。めちゃくちゃ良い感じになった！(これだけで10時間とかあっという間に過ぎます)<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_b08.jpg"><img loading="lazy" class="alignnone size-full wp-image-46651" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_b08.jpg" alt="" width="624" height="383" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_b08.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_b08-300x184.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />有料のも一部買いましたが、小物をひとつひとつ作るのにかかる時間を考えたら買ったほうが早いかなって…。金で解決。買ったら置くだけだから。<br />使わせていただいたものはワールド内のクレジットにぜんぶ書いてあります！ ありがとうございます！<br />家具と小物を置いたらこれは既に「家」じゃん…。という完成度となりました。こうなったらもう勝利は確定したようなもんです。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_b09.jpg"><img loading="lazy" class="alignnone size-full wp-image-46652" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_b09.jpg" alt="" width="624" height="347" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_b09.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_b09-300x167.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />が、これだけだと来た方はワールド内をひと通り見たら満足して帰っちゃうので、なにか面白いものを置きたいですよね。このような欲がでてきたらもう沼にはまっています。<br /><br /><h3 class="section_title putit_caption l_green">UdonSharp製ギミックをつくる</h3><br />VRChatのワールド作成は、コンセプトにもよりますがプログラミングスキルがなくても可能です。景観やデザインや雰囲気で魅せるなら光源やモノの配置センスだけで十分すばらしいものができあがります。<br />ですが、VRChatではユーザーが作ったプログラムの実行が制限付きながら許されているので、スクリプトが書けると手の込んだ仕掛けをワールドに配置することもできちゃいます！<br />わたしもプログラミングで食べているSEの端くれ。ここからが腕の見せ所！<br /><br />ここからはスクリプトを一部紹介。<br />このワールドのメインの見せ物は、入り口左手に置いてある「星の弓」です。<br />持ち運べるオブジェクトとしてワールドに配置してあります。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_d02.jpg"><img loading="lazy" class="alignnone size-full wp-image-46656" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_d02.jpg" alt="" width="624" height="339" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_d02.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_d02-300x163.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />この弓には大まかに5つのギミックが設定されています。<br />・弓を持つと矢を引けるようになる<br />・矢を引いて手を離すと矢を生成して飛ばす<br />・弓に付属のボタンを押すと矢を星として固定する<br />・固定した星を線で繋いで星座にする<br />・固定した星を順番に消す<br />ひとつずつ仕組みを解説します！<br />弓は持ち手(見た目は透明)の部分、弓の見た目部分、矢を持つ部分の3パーツで構成されており、持ち手←弓←矢の順で位置と回転を追従することで見かけを制御しています。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_e02.jpg"><img loading="lazy" class="alignnone size-full wp-image-46689" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_e02.jpg" alt="" width="624" height="306" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_e02.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_e02-300x147.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />最初は弓部分と矢の部分の2パーツだけだったのですが、矢を引いている時に弓の回転ができてしまうと系の表示がえらいことになるので、一時的に弓の回転を固定する必要がでてきました。しかしプレイヤーによるPickUpオブジェクトは回転の角度制限ができないため、弓の見た目部分と透明な持ち手部分を分離し、持ち手の回転をContraintで見た目部分に反映する方式にしました。<br />持ち手→弓見た目のConstraintは矢を引いている時だけスクリプトでOFFにします。すると矢を引いている時だけ弓の見た目部分が回転しなくなります。持ち手部分は実はプレイヤーの手の動きに合わせて回転しているのですが、透明なので見えません。<br /><br /><h4 class="section_subtitle putit_caption">弓を持つと矢を引けるようになる</h4>持ち手の部分にUdon BehaviourスクリプトとVRC PickUpコントローラーを付与しています。PickUpコンポーネントを付けることでそのオブジェクトは道具のようにユーザーが持って遊んだり操作できるようになります。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_e08.jpg"><img loading="lazy" class="alignnone wp-image-46699" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_e08.jpg" alt="" width="624" height="198" /></a><br />また、オブジェクトを持った時に紐づけられたUdon Behaviour側のOnPickUp、OnDropイベントが呼ばれます。<br />このスクリプトでは弓の持ち手部分を持ったら、矢の部分のPickUpをtrueにして矢を引けるようにしています。また、弓にくっついている制御用ボタンのアクティブ化も行っています。<br /><pre><code class="&#8221;language-cs&#8221;"><br /></p>
<div>
<div>public override void OnPickup(){ //グリップ部分を掴んだ時の処理</div>
<div>  //矢の部分を掴めるようにする</div>
<div>  ((VRC.SDK3.Components.VRCPickup)myArrow.GetComponent(typeof(VRC.SDK3.Components.VRCPickup))).pickupable = true;</div>
<div>  Networking.SetOwner(Networking.LocalPlayer, this.gameObject); //自分がこの弓のオーナーになる</div>
<div>  Networking.SetOwner(Networking.LocalPlayer, myArrow); //付属の矢もオーナーになる</div>
<div>  Networking.SetOwner(Networking.LocalPlayer, bowMesh); //弓本体見た目部分もオーナーになる</div>
<div>  //各種制御用コントローラーをアクティブに</div>
<div>  controllerUp.SetActive(true);</div>
<div>  controllerRight.SetActive(true);</div>
<div>  controllerLeft.SetActive(true);</div>
<div>}</div>
<br />
<div>//手を離した時の処理</div>
<div>public override void OnDrop(){</div>
<div>  //矢の部分を掴み許可を解除</div>
<div>  ((VRC.SDK3.Components.VRCPickup)myArrow.GetComponent(typeof(VRC.SDK3.Components.VRCPickup))).pickupable = false;</div>
<div>  //各種制御用コントローラーを隠す</div>
<div>  controllerUp.SetActive(false);</div>
<div>  controllerRight.SetActive(false);</div>
<div>  controllerLeft.SetActive(false);</div>
<div>}</div>
</div>
<p></code></pre><br /><h4 class="section_subtitle putit_caption">矢を引いて手を離すと矢を生成して飛ばす</h4>新しいオブジェクトをワールド内に動的に生成するには VRCInstantiate(GameObject) を利用します。<br />生成した後に位置や回転を渡すのを忘れないようにしましょう、<br />ソース内でpublic GameObject ~~~ と書くことで、Unity側でスクリプトで直接呼び出せるGameObjectやPrefabを登録できるようになりますので、使うオブジェクトは列挙して紐付けましょう！<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_e03.jpg"><img loading="lazy" class="alignnone size-full wp-image-46690" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_e03.jpg" alt="" width="624" height="258" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_e03.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_e03-300x124.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />矢の生成処理はワールド内にいる全員で行ってもらいので、SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, &#8220;(関数名)&#8221;); で呼び出します。 ついでに最後に打った矢を変数で保持しておきます。<br /><pre><code class="&#8221;language-cs&#8221;"><br /></p>
<div>
<div>public GameObject starlightArrowPrefab; //発射用の矢のPrefab<br />
<div>
<div>private GameObject lastShootingStar; //最後に射った流れ星</div>
</div>
</div>
<br />
<div>//矢から手を離した時の処理</div>
<div>public override void OnDrop()</div>
<div>{</div>
<div>  //ローカルで引き絞り距離を計算</div>
<div>  Vector3 arrow_transform = this.gameObject.transform.localPosition;</div>
<div>  varhikishibori_y = arrow_transform.y;</div>
<div>  if( hikishibori_y &gt; 0.15f ){ //一定以上矢をひいていれば</div>
<div>    SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, &#8220;Shot&#8221;); //矢を射つイベント(全員)</div>
<div>  }else{ //矢のひきしぼりが足りない</div>
<div>    SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, &#8220;NoShot&#8221;); //矢を射たないイベント</div>
<div>  }</div>
<div>}</div>
<br />
<div>//矢を打つ</div>
<div>public void Shot()</div>
<div>{</div>
<div>  myAnimator.SetTrigger(&#8220;PositionConstraintON&#8221;); //矢を元の位置に戻す</div>
<div> </div>
<div>  GameObject ArrowShoot = VRCInstantiate(starlightArrowPrefab); //Prefabから矢を生成</div>
<div>  ArrowShoot.transform.position = this.gameObject.transform.position; //矢の位置を決める</div>
<br />
<div>  var angles = bowMesh.transform.rotation.eulerAngles; //弓部分の角度を得る</div>
<div>  ArrowShoot.transform.rotation = Quaternion.Euler(angles); //角度をセット</div>
<br />
<div>  Rigidbody ArrowShootRigidbody = ArrowShoot.GetComponent&lt;Rigidbody&gt;(); //矢の「Rigidbody」を取得</div>
<div>  ArrowShootRigidbody.AddForce(bowMesh.transform.forward * shootPower); //Rigidbodyに前方向の推進力を伝える<br /><br />
<div>
<div>  lastShootingStar = ArrowShoot; //最後に射った星として記録</div>
</div>
</div>
<div>}</div>
</div>
<p><br /></code></pre><br /><h4 class="section_subtitle putit_caption">弓に付属のボタンを押すと矢を星として固定する</h4>弓に付属のボタンは別オブジェクト&amp;別スクリプトです。このオブジェクトをInteract(使用)するとグリップ側のイベントを呼ぶようにしました。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_e05.jpg"><img loading="lazy" class="alignnone size-full wp-image-46691" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_e05.jpg" alt="" width="624" height="261" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_e05.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_e05-300x125.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />SendCustomEventで、スクリプト内から別スクリプトの関数を呼び出せます。ただし引数は設定できません。<br /><pre><code class="&#8221;language-cs&#8221;"><br /></p>
<div>
<div>//星生成ボタン側のスクリプト<br />public class StarCreate : UdonSharpBehaviour{</div>
<div>  public GameObject myGrip; //グリップ部分</div>
<div>  private UdonBehaviour gripBehaviour; //グリップのうどん</div>
<br />
<div>  void Start(){</div>
<div>    gripBehaviour = (UdonBehaviour)myGrip.GetComponent(typeof(UdonBehaviour));</div>
<div>  }</div>
<div>  public override void Interact() { //オブジェクト使用時の処理</div>
<div>    gripBehaviour.SendCustomEvent(&#8220;StarCreate&#8221;); //グリップ側のイベント発火</div>
<div>  }</div>
<div>}</div>
</div>
<p><br /></code></pre><br />グリップ側のイベントで前述の発射処理で最後に射った矢を変数で保持しているものを使います。<br />物理情報はRigidbodyが持っているので、GetComponentから矢のRigidbodyを取得し、useGravityをfalse、isKinematicをtrueにするとその物体は物理演算をやめて停止します。<br /><pre><code class="&#8221;language-cs&#8221;"><br /></p>
<div>
<div>
<div>
<div>//持ち手ボタン側のスクリプト
<div>
<div>[SerializeField]private int myStarMaxLength = 12; //星を撒ける最大数</div>
<div>[UdonSynced]private int myStarsIndex = 0; //現在扱っている星</div>
</div>
<br />public void StarCreate(){</div>
<div>  if( lastShootingStar ){ //最後の矢が存在すれば</div>
<div>    SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, &#8220;Burst&#8221;);</div>
<div>  }</div>
<div>}</div>
</div>
<br />//矢を空中で固定し、その場にエフェクトを生成</div>
<div>public void Burst(){</div>
<div>  if( lastShootingStar ){</div>
<div>    Rigidbody lastShootRigidBody = lastShootingStar.GetComponent&lt;Rigidbody&gt;(); //矢のRegidBody取得</div>
<div>    lastShootRigidBody.useGravity = false; //重力無効化</div>
<div>    lastShootRigidBody.isKinematic = true; //その場に固定</div>
<br />
<div>    GameObject effect = VRCInstantiate(createEffect); //作成エフェクトを生成</div>
<div>    effect.transform.position = lastShootingStar.transform.position; //エフェクトの位置を決める</div>
<div>    if (stampSE) stampSE.PlayOneShot(stampSE.clip); //効果音を鳴らす</div>
<br />
<div>    Destroy(lastShootingStar, 3.0f); //矢は用済みなので3秒後に消す<br /><br />
<div>
<div>    myStarsIndex += 1; //星の管理番号を加算</div>
</div>
</div>
<div>  }</div>
<div>}</div>
</div>
<p></code></pre><br /><h4 class="section_subtitle putit_caption">固定した星を線で繋いで星座にする</h4>これは見た目上は複雑なことやってるように見えますが、実は簡単です。それぞれの星をLookAtで一つ前の星に向かせて、距離ぶんの大きさの線を生成しているだけです。生成するPrefabの大きさをデフォルトで横幅1にするのがポイントです。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_e04.jpg"><img loading="lazy" class="alignnone size-full wp-image-46692" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_e04.jpg" alt="" width="624" height="238" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_e04.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_e04-300x114.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />星は12個まで固定できる仕様で、0~11の番号で制御し GameObject配列で管理しています。<br /><pre><code class="&#8221;language-cs&#8221;"><br /></p>
<div>
<div>//星座をつくる(星座ボタンから呼ばれる)</div>
<div>public void DrawConstellation(){</div>
<div>  SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, &#8220;NetworkDrawConstellation&#8221;);</div>
<div>}</div>
<div>public void NetworkDrawConstellation(){</div>
<div>  //myStarsIndex : 現在空に固定済みの星の数</div>
<div>  for( int index = 0; index &lt; myStarsIndex; index++ ){ //手持ちの星すべて処理 index1から始めるので最初の星は処理しない</div>
<div>    GameObject currentStar = myStars[index];//最新の星</div>
<div>    GameObject backStar = myStars[index-1]; //一つ前の星</div>
<div>    if( currentStar &amp;&amp; backStar ){ //最新と前の星がちゃんとあれば</div>
<div>      float distance = Vector3.Distance(currentStar.transform.position,backStar.transform.position); //距離を算出</div>
<div>      GameObject stellaLineSky = VRCInstantiate(stellaLine); //星座の線を生成</div>
<div>      stellaLineSky.transform.position = currentStar.transform.position; //星の位置に移動</div>
<div>      stellaLineSky.transform.LookAt(backStar.transform); //星座の線を一つ前の星へ向ける</div>
<div>      Vector3 localScale = stellaLineSky.transform.localScale; //拡大率(ローカル)</div>
<div>      localScale.z = distance; //距離を拡大率に代入</div>
<div>      stellaLineSky.transform.localScale = localScale; //ローカル拡大率に反映</div>
<div>      stellaLineSky.transform.parent = currentStar.transform; //親を最新の星にする(親の星が消えれば線も消えるようになる)</div>
<div>    }</div>
<div>  }</div>
<div>}</div>
</div>
<p><br /></code></pre><br /><h4 class="section_subtitle putit_caption">固定した星を順番に消す</h4>こちらはもっと単純で、星を固定した後に加算する管理番号でGameObject配列から消したいオブジェクトを引っ張り出してDestroyしています。消したら管理番号の数も減算します。<br /><pre><code class="&#8221;language-cs&#8221;"><br /></p>
<div>
<div>//星を消すイベント(別ボタンから呼ばれる)</div>
<div>public void StarDestroy(){</div>
<div>  SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, &#8220;RefreshLastStar&#8221;);</div>
<div>}</div>
<br />
<div>//夜空に配置した星をひとつ消す</div>
<div>public void RefreshLastStar(){</div>
<div>  //myStarsIndex : 現在空に固定済みの星の数</div>
<div>  if( myStarsIndex &gt; 0 ){</div>
<div>    var lastStar = myStars[myStarsIndex-1];</div>
<div>    if( lastStar ){</div>
<div>      Destroy(lastStar, 0.0f); //星を即座に消す</div>
<div> </div>
<div>      GameObjecteffect = VRCInstantiate(destroyEffect); //削除エフェクトを生成</div>
<div>      effect.transform.position = lastStar.transform.position; //エフェクトの位置を決める</div>
<div>      Destroy(effect, 5.0f); //エフェクトは5秒後に消す</div>
<div>      myStarsIndex -= 1; //管理番号をひとつ戻す</div>
<div>    }</div>
<div>  }</div>
<div>}</div>
</div>
<p></code></pre><br />他にも細かい制御がありますが、大まかにはこんな感じです！<br /><br /><h4 class="section_subtitle putit_caption">おまけ:矢の衝突判定</h4>矢と星の処理とは直接関係ないのですが、矢がおうちまたはワールド内にあるターゲットに当たると消滅する処理をいれました。<br />おうちの中でくつろいでいる時に矢が部屋の中に飛んできたら落ち着かないだろうなと思ったためです。<br />最初は当たったオブジェクトのレイヤーで条件付けを試したのですが、何故かうまくいかなかったため最終的には当たったGameObjectの名前部分一致で処理を発火させるようにしました。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_e07.jpg"><img loading="lazy" class="alignnone wp-image-46696" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_e07.jpg" alt="" width="624" height="236" /></a><br />こちらではTargetと名のつくオブジェクトに紐づいたTriggerコライダーに当たった時に処理を行うようにし、おうち型の当たり判定を用意しています。<br /><pre><code class="&#8221;language-cs&#8221;"><br />//矢(Perfab生成)のスクリプト</p>
<div>
<div>//入ってはいけないところに矢が入った時またはTargetに当てた時に矢が消滅する</div>
<div>public void OnTriggerEnter(Collider other){ //トリガーに入った時</div>
<div>  triggerTarget(other);</div>
<div>}</div>
<div>public void OnTriggerStay(Collider other){ //トリガーの中にいる時</div>
<div>  triggerTarget(other);</div>
<div>}</div>
<div>public void triggerTarget(Collider other){ //実際の処理</div>
<div>  if( hit ){ return; } //private変数 既に何かに当たってたら処理しない</div>
<div>  if (other != null){ //コライダーのnullチェック(念の為)</div>
<div>    string otherAsString = ((object)other).ToString();</div>
<div>    if (otherAsString.Contains(&#8220;VRCPlayer&#8221;)){ //他のプレイヤーに当たった時</div>
<div>      //何も演出しないことにした</div>
<div>    }else if(otherAsString.Contains(&#8220;Target&#8221;)){ //名前にTargetが含まれている</div>
<div>      //自分オブジェクトその場で停止する</div>
<div>      Rigidbody myRigidBody = this.gameObject.GetComponent&lt;Rigidbody&gt;(); //自分のRegidBody取得</div>
<div>      myRigidBody.useGravity = false; //重力オフ</div>
<div>      myRigidBody.isKinematic = true; //その場に固定</div>
<div>      MeshRenderer myRenderer = this.gameObject.GetComponent&lt;MeshRenderer&gt;(); //メッシュレンダラ取得</div>
<div>      myRenderer.enabled = false; //矢の見た目だけオフにする(すぐ消すと軌跡が残らないため)</div>
<div>      Destroy(this.gameObject, 3.0f); //3秒後に破棄</div>
<div>      //エフェクト</div>
<div>      GameObject effect = VRCInstantiate(destroyEffect); //エフェクトを生成</div>
<div>      effect.transform.position = this.gameObject.transform.position; //エフェクトの位置を矢と同じにする</div>
<div>      Destroy(effect, 5.0f); //5秒後に破棄</div>
<div>      hit = true; //ヒットフラグON(2回目は処理しない)</div>
<div>    }</div>
<div>  }</div>
<div>}</div>
</div>
<p><br /></code></pre><br /><h4 class="section_subtitle putit_caption">おまけ:弓以外のギミック</h4>他、置いてあるスイーツとドリンクを飲み食いできる機能もUdonSharpで組みました。こちらはアニメーターで出し入れなど見かけを作って、UdonSharp側は簡単なフラグ管理とPickUpから取り上げるのと位置リセットのみ行ってます。<br />こちらはスイーツ食べるやつのソース(全文)<br /><pre><code class="&#8221;language-cs&#8221;"><br /></p>
<div> </div>
<p>using UdonSharp;</p>
<p><br />using UnityEngine;</p>
<p><br />using VRC.SDKBase;</p>
<p><br />using VRC.Udon;</p>
<p>&nbsp;</p>
<p>public class EatSweets : UdonSharpBehaviour</p>
<p><br />{</p>
<p><br />private Vector3 respawnPosition; //リポップする時の位置</p>
<p><br />private Quaternion respawnRotation; //リポップする時の回転</p>
<p><br />private float deltaTime = 0.0f; //経過時間</p>
<p><br />private bool eated = false; //食べました</p>
<p><br />[SerializeField] private Animator myAnimator; //アニメーター</p>
<p><br />[SerializeField] private AudioSource eatSE; //食べる音</p>
<p>&nbsp;</p>
<p><br />void Start(){</p>
<p><br /> //初期位置を保管</p>
<p><br /> respawnPosition = this.gameObject.transform.position;</p>
<p><br /> respawnRotation = this.gameObject.transform.rotation;</p>
<p><br />}</p>
<p>&nbsp;</p>
<p><br />private void Update()</p>
<p><br />{</p>
<p><br /> deltaTime += Time.deltaTime; //経過時間を足す</p>
<p><br /> if( eated &amp;&amp; deltaTime &gt; 1.5f ){ //一定時間たっていれば位置を戻す</p>
<p><br />  this.gameObject.transform.position = respawnPosition;</p>
<p><br />  this.gameObject.transform.rotation = respawnRotation;</p>
<p><br />  eated = false; //食べフラグ初期化</p>
<p><br /> }</p>
<p><br />}</p>
<p>&nbsp;</p>
<p><br />public override void OnPickupUseDown() { //このオブジェクトを持って使った時</p>
<p><br /> SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, &#8220;Eat&#8221;); //ワールド内全員にイベント通知</p>
<p><br />}</p>
<p>&nbsp;</p>
<p><br />//ワールド内全員に処理してもらう</p>
<p><br />public void Eat(){</p>
<p><br /> if (eatSE) eatSE.PlayOneShot(eatSE.clip); //食べる音</p>
<p><br /> myAnimator.SetTrigger(&#8220;Eat&#8221;); //アニメーター発火(縮小していくやつ)</p>
<p><br /> deltaTime = 0; //経過時間を初期化</p>
<p><br /> eated = true; //たべたフラグ</p>
<p>&nbsp;</p>
<p><br /><br /> //ピックアップから強制的に手を離す</p>
<p><br /> VRC_Pickup pickup = (VRC_Pickup)this.gameObject.GetComponent(typeof(VRC_Pickup));</p>
<p><br /> pickup.Drop();</p>
<p><br /> }</p>
<p><br />}</p>
<p></code></pre><br /><h3 class="section_title putit_caption l_green">ギミックの同期問題</h3><br />上記のギミックは一人で動かすぶんには何の問題もなかったのですが、いざ他人をワールドに呼んでテストしてみると色々と不具合が出ることが判明しました…。<br />ネットワークを介した挙動となると途端に気を遣う部分がたくさん出てきて大変になります！<br /><h4 class="section_subtitle putit_caption">同期の基本</h4>Udonには便利な「VRC Object Sync」というコンポーネントが用意されています。基本的にはこのコンポーネントを付与しておけば位置や状態が他のプレイヤーと同期されるようになります！<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_d04.jpg"><img loading="lazy" class="alignnone size-full wp-image-46658" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_d04.jpg" alt="" width="624" height="267" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_d04.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_d04-300x128.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />逆に言うと、このコンポーネントを付与していない物体は何も同期しません。基本はローカル動作で、グローバル化したい物には全て「VRC Object Sync」を付けなければなりません。<br /><br /><h4 class="section_subtitle putit_caption">うまく同期されないケース</h4>これが最大のワナだったのですが、Instantiateで<span class="bold">動的に生成したオブジェクトはVRC Object Syncを付与していても同期されません！</span><br />つまり、同期を行いたいオブジェクトは最初からワールドに配置した状態にしなければならなかったのです。<br />これでは矢から星を生成しても位置が完全には合わなくなるし、後からワールドに入ってきた人には生成済みの星が見えなくなります。これでは会話が噛み合わず遊んでいるひとが困っちゃいます。<br />そこで、やむをえず星として夜空に固定するオブジェクトはあらかじめワールドの下に埋めて隠しておく方式に変更しました。泥臭くてあまり美しくないやり方ですが仕方なし。この都合により星は最大12発しか固定できません。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_d03.jpg"><img loading="lazy" class="alignnone size-full wp-image-46657" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_d03.jpg" alt="" width="624" height="357" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_d03.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_d03-300x172.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />矢のほうはその場で生成しているので無限に打てます。ワールドに入っている人全員に矢の発射イベントを投げれば弓の現在位置と角度に基づいてだいたい合ってる感じで射出されます！<br /><br /><h4 class="section_subtitle putit_caption">その他、同期挙動の細かいところ</h4>VRC Object Syncは[Udon synced]を付与すればUdon Behaviourスクリプト内の変数も同期してくれます。射った矢の番号はこの仕組みで同期しています。<br />オブジェクト位置の同期は静止中は常にしているわけではなく、移動時のみ再判定されるとのことなので、矢を射ったり弓を持ったりといった動作をするたびに全ての固定済みの星を誤差ミリ程度にズラすことで念入りに位置同期するようにしました。<br />また、プレイヤーのワールド離脱時に誰のものでもなくなった弓は同期が怪しくなるため、自動的にオーナーになったプレイヤー側で明示的に位置合わせを行うようにしました。<br /><pre><code class="&#8221;language-cs&#8221;"><br /></p>
<div>
<div>private float deltaTime = 0.0f; //経過時間</div>
<div>private bool syncedToPlayerLeft = false; //プレイヤーいなくなった後に同期するフラグ</div>
<div>private float toggleStarPosition = -0.0001f; //同期するときに微妙に星をずらす時に足す座標(毎回反転する)</div>
<div> </div>
<div>public override voidOnPlayerJoined(VRCPlayerApi player){</div>
<div>  //プレイヤーが入ってきた時、自分がオーナーなら全ての星を再確認する</div>
<div>  if (Networking.IsOwner(this.gameObject) ){</div>
<div>    RefreshStarsCheck(); //全ての星を確認</div>
<div>  }</div>
<div>}</div>
<div>//プレイヤーがどっかいった時</div>
<div>public override void OnPlayerLeft(VRCPlayerApi player){</div>
<div>  deltaTime = 0;</div>
<div>  syncedToPlayerLeft = true; //同期用フラグON</div>
<div>}</div>
<br />
<div>private void Update(){</div>
<div>  deltaTime += Time.deltaTime; //経過時間を足す</div>
<div>  //プレイヤー離脱後、一定時間したら同期を行う</div>
<div>  if( syncedToPlayerLeft &amp;&amp; deltaTime &gt; 5.0f ){</div>
<div>    syncedToPlayerLeft = false;</div>
<div>    if (Networking.IsOwner(Networking.LocalPlayer, this.gameObject)){ //オーナーになってたら</div>
<div>      getAllPartsOwner(); //全てを相続する</div>
<div>    }</div>
<div>  }</div>
<div>}</div>
<div>//この弓に関連するすべてのパーツのオーナーを得る</div>
<div>public void getAllPartsOwner(){</div>
<div>  Networking.SetOwner(Networking.LocalPlayer, myAnimator.gameObject); //弓の一番親のオーナーになる</div>
<div>  Networking.SetOwner(Networking.LocalPlayer, this.gameObject); //自分がこの弓のオーナーになる</div>
<div>  Networking.SetOwner(Networking.LocalPlayer, myArrow); //付属の矢もオーナーになる</div>
<div>  Networking.SetOwner(Networking.LocalPlayer, bowMesh); //弓本体ビジュアルもオーナーになる</div>
<div>  for( int index = 0; index &lt; myStarMaxLength; index++ ){ //全ての星に実行</div>
<div>    var star = myStars[index];</div>
<div>    if( star ){</div>
<div>      Networking.SetOwner(Networking.LocalPlayer, star); //うちの子です</div>
<div>    }</div>
<div>  }</div>
<div>  RefreshStars(); //全ての星を確認</div>
<div>}</div>
<div>//すべての星を確認する(オーナー専用)</div>
<div>publicvoidRefreshStars(){</div>
<div>  toggleStarPosition *= -1;</div>
<div>  for( int index = 0; index &lt; myStarMaxLength; index++ ){ //全ての星に実行</div>
<div>    var star = myStars[index];</div>
<div>    if( star ){</div>
<div>      star.transform.position += newVector3(0,0 + toggleStarPosition ,0);</div>
<div>    }</div>
<div>  }</div>
<div>}</div>
</div>
<p></code></pre><br /><h3 class="section_title putit_caption l_green">仕上げ(軽量化とベイク)</h3><br />ここからはやらなくてもワールドが動作する部分ですが、光源やオブジェクトを置きすぎて重くなっていたので力を入れて取り組みました。<br />快適なワールド作りのためにはある意味いちばん大事なところかも。<br /><br /><h4 class="section_subtitle putit_caption">オブジェクトのStatic化</h4>まず、オブジェクトには動くモノと動かないモノがあります。ワールド内に置いてある弓や飲み物や本などは掴んで移動することができるので当然「動くモノ」です。<br />しかし家や木や山はその場から絶対に移動しません。移動しないなら影の計算や物理演算を一部省略することができるため「このオブジェクトは絶対動かしませんよ」と、あらかじめ登録しておくことで処理を軽くできるわけです！<br /><br />Static(静的オブジェクト)の登録はインスペクターの右上のチェックを行うことでできます。動かないものはどんどんstatic化しましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_d05.jpg"><img loading="lazy" class="alignnone size-full wp-image-46659" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_d05.jpg" alt="" width="624" height="253" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_d05.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_d05-300x122.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />諸々配置が終わったら、動く可能性のあるギミック系と、動かない建物と、建物の外のオブジェクトとで大まかにオブジェクトを親子関係にして分けました。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_g03.jpg"><img loading="lazy" class="alignnone size-full wp-image-46722" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_g03.jpg" alt="" width="624" height="269" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_g03.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_g03-300x129.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />こうすると一括でStatic化チェック管理ができて楽になります！<br /><br /><h4 class="section_subtitle putit_caption">インポート設定による容量圧縮</h4>ワールドに読み込むテクスチャや3Dモデルのインポート設定をいじると、見た目の影響を少なめに容量を削減できます。<br />まずはテクスチャ。最大サイズを下げることで画像を軽量化できます。ちょっとした手のひらサイズの小物程度であれば256や128でも見た目の影響はそんなに無かったりします。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_h06.jpg"><img loading="lazy" class="alignnone size-full wp-image-46738" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_h06.jpg" alt="" width="624" height="445" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_h06.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_h06-300x214.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />逆に、壁や床など面積が大きいものは解像度を低くするとぼんやりとしますので、512や1024などを選んでおいたほうが無難です。<br /><br />次に3Dモデル。メッシュ圧縮を設定すると容量を削減できます。見た目が大体あってればOK程度のオブジェクトはどんどん圧縮しましょう。中程度なら影響も少ないようです。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_h07.jpg"><img loading="lazy" class="alignnone size-full wp-image-46739" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_h07.jpg" alt="" width="624" height="416" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_h07.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_h07-300x200.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />また、後述のライトベイク対象として使う3Dモデルの場合は「ライトマップUV生成」をONに設定しておきましょう。この設定をしないとライトベイクが正しくできません。<br /><br /><h4 class="section_subtitle putit_caption">ライトベイク</h4>軽量化のための最重要作業。それがライトベイクです！ これは必ずおさえておきたい。<br />ライトベイクが何かというと、ひとことで言うと<span class="bold">光の当たり具合をテクスチャに焼き付ける</span>ことです。<br />光源がオブジェクトに当たって影を落とす計算は負荷が大きく、リアルタイムで行うと処理落ちします。光源をたくさん置いたり、影の計算対象のオブジェクトが増えれば増えるほど顕著になります。それを解決するのがライトベイク！<br />まず、こちらがライトベイク済みの室内です。特に違和感ないと思います。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_f01.jpg"><img loading="lazy" class="alignnone size-full wp-image-46705" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_f01.jpg" alt="" width="624" height="304" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_f01.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_f01-300x146.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />しかし、家具をどかしてみると…。床に家具の影がお化けみたいに焼き付いています。こわいね。影の計算はその場ではしていなくて、あらかじめ床に影の模様が描かれているのです。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_f02.jpg"><img loading="lazy" class="alignnone size-full wp-image-46706" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_f02.jpg" alt="" width="624" height="304" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_f02.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_f02-300x146.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />オブジェクトをStatic化して「絶対にその場所から動かない」とわかっているなら影が動くことはないのですから、リアルタイム計算する必要がなくなるためです。実はこれ、コンシューマゲームなどでもよく使われている手法だったりします。<br /><br />ライトベイクは、画面上にあるウィンドウ→レンダリング→ライティング設定 から行うことができます。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_f04.jpg"><img loading="lazy" class="alignnone size-full wp-image-46708" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_f04.jpg" alt="" width="624" height="366" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_f04.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_f04-300x176.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />設定は詳しく解説しているサイトさんを参考にしてください。解像度は高いほど綺麗になりますが、ワールド読み込み時のサイズが重くなります。一度ダウンロードしてワールドに入ってしまえば軽いのですが、ライトベイクするということはテクスチャが増えるので必然的にサイズが増えます。<br />あまりサイズを肥大化させたくない場合はベイクを行う対象を絞りましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_f06.jpg"><img loading="lazy" class="alignnone size-full wp-image-46711" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_f06.jpg" alt="" width="624" height="315" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_f06.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_f06-300x151.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />ライトベイクしたくないオブジェクトのMeshRendererのグローバルイルミネーションをOFFにすればベイク対象から外せます。<br /><br />いろいろ準備できたら「ライティングの生成」を押せばライトベイクが開始されます。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_f05.jpg"><img loading="lazy" class="alignnone size-full wp-image-46709" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_f05.jpg" alt="" width="624" height="326" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_f05.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_f05-300x157.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />CPUスペックにもよりますが、けっこう重い計算なので場合によっては数十分から数時間待たされることもあります。PCを長時間放置できるタイミングで行うようにしましょう。つよつよGPUがあるなら別ですが！<br /><br />他にもライトベイクに関連して「ライトプローブ」も配置しました。こちらはベイク済みのライトの影響を動的なオブジェクトに受けさせたい場合に役立つ仕組みです。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_f03.jpg"><img loading="lazy" class="alignnone size-full wp-image-46707" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_f03.jpg" alt="" width="624" height="315" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_f03.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_f03-300x151.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />ただ、ひとつひとつ配置するのが面倒だったので「Magic Light Probes」というアセット(有料)を使って自動配置しちゃいました。作業にかかる時間を考えたら買ったほうが早いかなって…。金で解決。<br /><br /><h4 class="section_subtitle putit_caption">メッシュベイク</h4>ライトベイクだけでも十分軽くなりますが、さらに軽さを追求したいのであればメッシュベイクでしょう。<br />これは同じような見た目のモノが複数置いてある時や、細々したオブジェクトがたくさん置いてある時に有効です。<br />下の画像のように雑多にモノが配置されている場合、ひとつひとつのオブジェクトに座標や回転などが設定され、別々に描画処理が走るのでモノを置くほど負荷が増えるのですが…。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_g04.jpg"><img loading="lazy" class="alignnone size-full wp-image-46728" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_g04.jpg" alt="" width="624" height="254" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_g04.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_g04-300x122.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />メッシュベイクすれば「小物がたくさん集まっている見た目の、一つのオブジェクト」として扱われるので、見た目に反して負荷がかからなくなります！<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_g05.jpg"><img loading="lazy" class="alignnone size-full wp-image-46729" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_g05.jpg" alt="" width="624" height="257" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_g05.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_g05-300x124.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />見かけ上はモノがいっぱい置いてあるように見えますが、全にして一なのです。ただし、その場から動かさないstatic化が条件。<br /><br />これはBlenderなどをうまく使えば人力でできなくもないのですが、基本はツールを使うことをオススメします。<br />わたしは「Mesh Combine Studio」というアセット(有料)を使ってボタン一つで結合/解除できるようにしちゃいました。作業にかかる時間を考えたら買ったほうが早いかなって…。金で解決。<br />このアセットはとても使いやすくてオススメです！ まとめたいGameObjectの親を放り込んでボタンを押せば全部やってくれます。建物の1階部分はこのアセットでくっつけてあります。ちゃんと結合後の見た目でライトベイクも考慮してくれます。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_g06.jpg"><img loading="lazy" class="alignnone size-full wp-image-46730" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_g06.jpg" alt="" width="624" height="252" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_g06.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_g06-300x121.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />マテリアルの結合はできないため、床や壁など同じマテリアルを使った構造物をまとめるのに適しています。<br /><br />無料の「Mesh Baker」というアセットも良いです！ こちらも併用しました。<br />こちらは一度ベイクしたものを元に戻す手順が若干面倒ですが、ぜんぶばっちり配置した後に最終的にベイクするのであれば問題なさそうです。<br /><br /><h4 class="section_subtitle putit_caption">オクルージョンカリング</h4>これも地味に重要。<br />ひとことで言うと「見えない場所は描画しない」という設定です。<br />ユーザーの視界に入っていない部分も常に描画していると負荷になりますから、描画を行わないようにします。これもあらかじめStatic設定しているオブジェクトが影響を受けます。明示的にONにする必要があるので忘れずに設定しましょう。<br />ウィンドウ→レンダリング→オクルージョンカリングから設定画面を開きます。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_f07.jpg"><img loading="lazy" class="alignnone size-full wp-image-46723" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_f07.jpg" alt="" width="624" height="410" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_f07.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_f07-300x197.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />ライトベイクと同じように「ベイク」を押す事でいまstatic化されているオブジェクトの位置を元にオクルージョンカリングの設定が行われます。static化オブジェクトが増減したら再度ベイクしましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_f08.jpg"><img loading="lazy" class="alignnone size-full wp-image-46724" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_f08.jpg" alt="" width="624" height="406" srcset="https://yugalab.net/wp-content/uploads/2022/09/20220915_f08.jpg 624w, https://yugalab.net/wp-content/uploads/2022/09/20220915_f08-300x195.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />「遮蔽物の最小値」は、この値より小さいサイズのものは非表示処理に含まれなくなります。<br />「最小の穴」は、カメラから見る事ができるワールド内の小さな隙間より小さく設定してください。うまく設定されていないと、モノとモノの隙間から景色を覗いた時などに視界内にあるのにオブジェクトが消えることがあります。<br /><br />設定が完了すると、カメラの視界から外れて見えない位置にあるモノがスッと消えるようになります。こわいね。<br /><a href="https://yugalab.net/wp-content/uploads/2022/09/20220915_f09.gif"><img loading="lazy" class="alignnone wp-image-46725" src="https://yugalab.net/wp-content/uploads/2022/09/20220915_f09.gif" alt="" width="624" height="406" /></a><br />現実も実は人間が観測していない場所は暗闇なのかもしれないですね。<br /><br />以上です！<br />VRChatは無料だしPCだけでもできますが、VR機器があるともっと楽しいです。MetaQuestなど購入した方は是非一度はやってみて！</p><p>The post <a href="https://yugalab.net/archives/46481">【VRChat】自作ワールド作りました！ いろいろメモ(作業手順、UdonSharp、軽量化など)</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://yugalab.net/archives/46481/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【WordPress】Google Calendar Events プラグインの導入方法</title>
		<link>https://yugalab.net/archives/4896</link>
					<comments>https://yugalab.net/archives/4896#comments</comments>
		
		<dc:creator><![CDATA[ユーリ]]></dc:creator>
		<pubDate>Fri, 22 Jan 2016 03:00:27 +0000</pubDate>
				<category><![CDATA[technical]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://yugalab.net/?p=4896</guid>

					<description><![CDATA[<p>そういえば私はWebクリエイターなんだった…お仕事関連のメモで、Google Calendar Events(Simple Calendar)のプラグイン導入方法です。Google Calendar EventsとはWo [&#8230;]</p>
<p>The post <a href="https://yugalab.net/archives/4896">【WordPress】Google Calendar Events プラグインの導入方法</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>そういえば私はWebクリエイターなんだった…<br />お仕事関連のメモで、Google Calendar Events(Simple Calendar)のプラグイン導入方法です。<br /><span id="more-4896"></span><br /><h3 class="section_title putit_caption l_green">Google Calendar Eventsとは</h3><br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_thumb.jpg"><img loading="lazy" class="alignnone size-full wp-image-4898" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_thumb.jpg" alt="20160122_thumb" width="300" height="185" /></a><br />WordPressのプラグインで、Googleアカウントのカレンダー機能で作成したイベントなどを、<br />WordPress上に取得・表示することができるプラグインです！<br /><br />WordPress上ではなく、Googleアカウントのカレンダーを編集するだけでページに反映されるので、管理画面が苦手なクライアントさんにも使い易いかもしれません。<br />Simple Calendarとも言うみたいです。どちらが正式名なんでしょうか。<br /><br />とても便利なプラグインなのですが、使えるようにする迄の手順がなかなか多い上、<br />英語なのでちょっとたいへんです。<br /><br />最近、仕様が変わった為、導入方法が大きく変わったようなので、日本語解説したいと思います！<br /><br />このプラグインの利用には、<br />カレンダーの取得を行う為の<span class="l_blue">「Google API Key」</span>と、<br />取得したいカレンダー固有の<span class="l_blue">「カレンダーID」</span>の二つが必要になります！<br />※利用にはGoogleのアカウントが必要ですので、持っていない方は予め作成してください。<br /><br /><span class="f_red">※この記事の情報は、2016年1月時点のものです。</span><br /><br /><h3 class="section_title putit_caption l_green">インストール</h3><br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_a01.jpg"><img loading="lazy" class="alignnone size-full wp-image-4900" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_a01.jpg" alt="20160122_a01" width="624" height="385" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_a01.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_a01-300x185.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />まずは落ち着いてプラグインをインストールしましょう。<br />新規追加から「Google Calendar Events」または「Simple Calendar」で検索します。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_a02.jpg"><img loading="lazy" class="alignnone size-full wp-image-4901" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_a02.jpg" alt="20160122_a02" width="483" height="205" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_a02.jpg 483w, https://yugalab.net/wp-content/uploads/2016/01/20160122_a02-300x127.jpg 300w" sizes="(max-width: 483px) 100vw, 483px" /></a><br /><br />検索で出てきた緑のカレンダーマークのプラグインを選択し、インストールおよび有効化してください。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_a03.jpg"><img loading="lazy" class="alignnone size-full wp-image-4902" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_a03.jpg" alt="20160122_a03" width="557" height="458" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_a03.jpg 557w, https://yugalab.net/wp-content/uploads/2016/01/20160122_a03-300x246.jpg 300w" sizes="(max-width: 557px) 100vw, 557px" /></a><br /><br /><br /><h3 class="section_title putit_caption l_green">API Keyの取得</h3><br />まずは必要なもののうちの一つ、API Keyの取得について。<br />ここが一番面倒ですが、頑張って下さい！<br /><br />プラグインの有効化でメニューに現れた「Calendar」から「Setting」を選択します。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b01.jpg"><img loading="lazy" class="alignnone size-full wp-image-4904" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b01.jpg" alt="20160122_b01" width="323" height="212" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b01.jpg 323w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b01-300x196.jpg 300w" sizes="(max-width: 323px) 100vw, 323px" /><br /></a><br />以下の画面に遷移します。<br />ここにGoogle API Keyを入力するのです。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b02.jpg"><img loading="lazy" class="alignnone size-full wp-image-4905" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b02.jpg" alt="20160122_b02" width="624" height="244" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b02.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b02-300x117.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /><br /></a>ご丁寧にAPI Keyを取得する為のGoogle Developers Consoleへのリンクが貼ってありますので、クリックしてGoogleの管理画面へ移動します。<br /><br />こちらがGoogleの管理画面です。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b03.jpg"><img loading="lazy" class="alignnone size-full wp-image-4906" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b03.jpg" alt="20160122_b03" width="624" height="358" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b03.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b03-300x172.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />プロジェクトを新しく選択します！<br /><br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b04.jpg"><img loading="lazy" class="alignnone size-full wp-image-4907" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b04.jpg" alt="20160122_b04" width="624" height="383" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b04.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b04-300x184.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />作成するプロジェクト名は、任意のもので適当につけてください。<br />利用規約に同意することで、作成ボタンが押せるようになります。<br /><br /><br />APIを作成したら、今度はAPIを有効状態にする必要があります。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b05.jpg"><img loading="lazy" class="alignnone size-full wp-image-4908" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b05.jpg" alt="20160122_b05" width="624" height="361" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b05.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b05-300x173.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /><br /></a>API管理画面に移動します。<br /><br /><br />管理画面では、有効にしたいAPIを選択します。<br />ここでは、Calendar APIを選択します。<a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b06.jpg"><img loading="lazy" class="alignnone size-full wp-image-4909" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b06.jpg" alt="20160122_b06" width="624" height="425" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b06.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b06-300x204.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /><br /><br /><br /></a>Calendar APIを選択したら、「APIを有効にする」をクリックし、有効にします！<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b07.jpg"><img loading="lazy" class="alignnone size-full wp-image-4910" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b07.jpg" alt="20160122_b07" width="624" height="297" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b07.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b07-300x142.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />もう少しです、頑張って！<br /><br /><br />今度は左メニューの認証情報を選択します。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b08.jpg"><img loading="lazy" class="alignnone size-full wp-image-4911" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b08.jpg" alt="20160122_b08" width="624" height="362" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b08.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b08-300x174.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /><br /></a>「新しい認証情報」を選択します。<br />APIとか認証とか面倒そうなことばが多いですが、おまじないだと思って我慢してください。<br /><br /><br />認証情報のうち「APIキー」を選択します。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b09.jpg"><img loading="lazy" class="alignnone size-full wp-image-4912" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b09.jpg" alt="20160122_b09" width="624" height="323" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b09.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b09-300x155.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /><br /><br /></a>APIキーの中からさらに「サーバキー」を選びます。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b10.jpg"><img loading="lazy" class="alignnone size-full wp-image-4913" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b10.jpg" alt="20160122_b10" width="624" height="190" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b10.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b10-300x91.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />名前はてきとうにつけてください。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b11.jpg"><img loading="lazy" class="alignnone size-full wp-image-4914" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b11.jpg" alt="20160122_b11" width="624" height="525" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b11.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b11-300x252.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />作成！<br /><br />すると…<br />なぞのはっしゅもじれつが生成されり！<br />これがAPI Keyです！<br /><span class="f120">これです！これが欲しかったのです！</span><br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b12.jpg"><img loading="lazy" class="alignnone size-full wp-image-4915" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b12.jpg" alt="20160122_b12" width="624" height="302" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b12.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b12-300x145.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /><br /></a>お疲れ様です！<br />これをすかさずコピーしまして、<br /><br />WordPress管理画面に戻り、<br />Calendar -&gt; Settingsの中のAPI Key入力部にペーストして、保存します。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_b13.jpg"><img loading="lazy" class="alignnone size-full wp-image-4916" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_b13.jpg" alt="20160122_b13" width="624" height="306" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_b13.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_b13-300x147.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /><br /><h3 class="section_title putit_caption l_green">カレンダーの作成</h3><br />こんどは、取得して表示する対象となる、カレンダーを作成します。<br />Googleのメニューからカレンダーを選択します。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_c01.jpg"><img loading="lazy" class="alignnone size-full wp-image-4918" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_c01.jpg" alt="20160122_c01" width="374" height="598" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_c01.jpg 374w, https://yugalab.net/wp-content/uploads/2016/01/20160122_c01-187x300.jpg 187w" sizes="(max-width: 374px) 100vw, 374px" /></a><br /><br />カレンダー編集画面に来たら、WordPressで取得を行う用の新しいカレンダーを作成します。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_c02.jpg"><img loading="lazy" class="alignnone size-full wp-image-4919" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_c02.jpg" alt="20160122_c02" width="624" height="413" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_c02.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_c02-300x198.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />ポイントは「このカレンダーを一般公開する」をONにすることです。<br />一般公開状態のカレンダーでないと、WordPressに表示することができません。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_c03.jpg"><img loading="lazy" class="alignnone size-full wp-image-4920" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_c03.jpg" alt="20160122_c03" width="624" height="290" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_c03.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_c03-300x139.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /><br /><br /></a>警告が出ますが、はいを選びます。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_c04.jpg"><img loading="lazy" class="alignnone size-full wp-image-4921" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_c04.jpg" alt="20160122_c04" width="624" height="156" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_c04.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_c04-300x75.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /><h4 class="section_subtitle putit_caption">カレンダーIDの確認</h4>カレンダーを作成できたら、カレンダーの設定画面を開きます。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_c05.jpg"><img loading="lazy" class="alignnone size-full wp-image-4922" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_c05.jpg" alt="20160122_c05" width="624" height="507" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_c05.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_c05-300x243.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />メニュー内の「カレンダーのアドレス」のところにカレンダーIDが表記されています。<br />これをコピーしましょう！<a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_c06.jpg"><img loading="lazy" class="alignnone size-full wp-image-4923" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_c06.jpg" alt="20160122_c06" width="624" height="378" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_c06.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_c06-300x181.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /><br /><br /></a><br />これで、取得に必要なAPI KeyとカレンダーIDが揃いました！<br />あとはWordPress側の調整だけです！<br /><br /><h3 class="section_title putit_caption l_green">カレンダーの設定(WordPress側)</h3><br />さっそく、WordPress管理画面に戻り、Calendarメニューから「Add New」を選択しましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_d01.jpg"><img loading="lazy" class="alignnone size-full wp-image-4925" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_d01.jpg" alt="20160122_d01" width="354" height="279" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_d01.jpg 354w, https://yugalab.net/wp-content/uploads/2016/01/20160122_d01-300x236.jpg 300w" sizes="(max-width: 354px) 100vw, 354px" /><br /><br /></a><br />新規作成画面の下の方に、Calendar設定部があります。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_d02.jpg"><img loading="lazy" class="alignnone size-full wp-image-4926" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_d02.jpg" alt="20160122_d02" width="624" height="342" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_d02.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_d02-300x164.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />その中の「Google Calendar」タブの中にCalendar IDを入力する部分があります。<br />ここに、先ほど作成したカレンダーのIDをコピペします。<br /><br />これで、WordPressでカレンダーを取得する準備が完了しました！<br /><br />あとは、画面右下に書いてあるショートコードを呼び出せば、<br />作成したカレンダーの情報が自動で取得されるようになります！<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_d02a.jpg"><img loading="lazy" class="alignnone size-full wp-image-4929" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_d02a.jpg" alt="20160122_d02a" width="531" height="306" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_d02a.jpg 531w, https://yugalab.net/wp-content/uploads/2016/01/20160122_d02a-300x172.jpg 300w" sizes="(max-width: 531px) 100vw, 531px" /><br /><br /></a>カレンダーを表示したい投稿内にショートコードを貼り付けてもいいですし、<br />テンプレートから直接カレンダーを呼び出したい場合は<br /><span class="f120"><br/><span class="f_red">&lt;?php</span> echo <span class="l_blue">do_shortcode(</span><span class="l_gray">&#8216;[calendar id=&#8221;92&#8243;]&#8217;</span><span class="l_blue">);</span> <span class="f_red">?&gt;</span><br/></span><br />とでも書いて、ショートコードを実行してあげてください。<br />※ショートコードの番号は適宜書き換えてください。<br /><br /><h4 class="section_subtitle putit_caption">動作確認</h4>WordPress上に取得したカレンダーは、初期状態ではこのように表示されます。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_d04.jpg"><img loading="lazy" class="alignnone size-full wp-image-4930" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_d04.jpg" alt="20160122_d04" width="624" height="519" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_d04.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_d04-300x249.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />試しに、取得元のカレンダーを編集してみます。<br />Googleのカレンダー管理画面に戻り、適当にイベントを追加してみます。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_d05.jpg"><img loading="lazy" class="alignnone size-full wp-image-4932" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_d05.jpg" alt="20160122_d05" width="624" height="423" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_d05.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_d05-300x203.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /><br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_d06.jpg"><img loading="lazy" class="alignnone size-full wp-image-4931" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_d06.jpg" alt="20160122_d06" width="624" height="427" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_d06.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_d06-300x205.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /><br /></a>追加が完了しました。<br /><br />WordPressのカレンダー表示ページに戻ってみると…<br />更新されて、たった今追加したイベントが表示されるようになりました。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_d07.jpg"><img loading="lazy" class="alignnone size-full wp-image-4933" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_d07.jpg" alt="20160122_d07" width="624" height="506" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_d07.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_d07-300x243.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><h3 class="section_title putit_caption l_green">カレンダーのカスタマイズ</h3><br />カレンダー設定画面の本文は、カレンダーのイベントをクリックした時に表示されるツールチップの中身と連動しています。<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_e01.jpg"><img loading="lazy" class="alignnone size-full wp-image-4934" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_e01.jpg" alt="20160122_e01" width="624" height="388" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_e01.jpg 624w, https://yugalab.net/wp-content/uploads/2016/01/20160122_e01-300x186.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />イベントをクリックすると表示されるコレです！<br /><a href="https://yugalab.net/wp-content/uploads/2016/01/20160122_e02.jpg"><img loading="lazy" class="alignnone size-full wp-image-4935" src="https://yugalab.net/wp-content/uploads/2016/01/20160122_e02.jpg" alt="20160122_e02" width="270" height="341" srcset="https://yugalab.net/wp-content/uploads/2016/01/20160122_e02.jpg 270w, https://yugalab.net/wp-content/uploads/2016/01/20160122_e02-237x300.jpg 237w" sizes="(max-width: 270px) 100vw, 270px" /></a><br /><br />これを編集したい場合は、以下のページを参考にテンプレートタグを書き換えてみてください！<br /><a href="http://docs.simplecalendar.io/event-template-tags/" target="_blank">http://docs.simplecalendar.io/event-template-tags/</a><br /><br />以上です！</p><p>The post <a href="https://yugalab.net/archives/4896">【WordPress】Google Calendar Events プラグインの導入方法</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://yugalab.net/archives/4896/feed</wfw:commentRss>
			<slash:comments>25</slash:comments>
		
		
			</item>
		<item>
		<title>【Swift】プロジェクト内に置いたpng画像をNSDataとして取り出す</title>
		<link>https://yugalab.net/archives/4288</link>
					<comments>https://yugalab.net/archives/4288#respond</comments>
		
		<dc:creator><![CDATA[ユーリ]]></dc:creator>
		<pubDate>Fri, 18 Dec 2015 03:00:55 +0000</pubDate>
				<category><![CDATA[swift]]></category>
		<category><![CDATA[technical]]></category>
		<category><![CDATA[xcode]]></category>
		<guid isPermaLink="false">http://yugalab.net/?p=4288</guid>

					<description><![CDATA[<p>こんにちは、ユーリです！お仕事でSwift使い始めたので、Swift関連の備忘録を書いていきます。 まずはpng画像を簡単に取り出す方法について。 メルストの記事じゃなくてゴメンナサ… 今回は、プロジェクトファイル内にリ [&#8230;]</p>
<p>The post <a href="https://yugalab.net/archives/4288">【Swift】プロジェクト内に置いたpng画像をNSDataとして取り出す</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>こんにちは、ユーリです！<br />お仕事でSwift使い始めたので、Swift関連の備忘録を書いていきます。<br /><br /> まずはpng画像を簡単に取り出す方法について。 <span class="f080 l_gray">メルストの記事じゃなくてゴメンナサ…</span><br /><div class="fold_post"><br /> 今回は、プロジェクトファイル内にリソース画像などを格納するbundleファイルを設置し、<br /> そこから画像を吸い出す方法で行きたいと思います。<br /> <br /> まずは、bundleの作成から。<br /> 以下の作業を行う前に、ファイルの拡張子を表示するモードにしておいてください。<br /> <br /><h3 class="section_title putit_caption l_green">bundleの作成</h3><br /> プロジェクトのフォルダをFinderで開き、おもむろに新規フォルダを作成します。<br /> <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_a01.jpg"><img loading="lazy" class="alignnone size-full wp-image-4294" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_a01.jpg" alt="20151218_a01" width="624" height="341" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_a01.jpg 624w, https://yugalab.net/wp-content/uploads/2015/12/20151218_a01-300x163.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /> <br /> フォルダができたら、名前を「***.bundle」に変更します。<br /> 今回は「resources.bundle」にしましょう！ <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_a02.jpg"><img loading="lazy" class="alignnone size-full wp-image-4295" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_a02.jpg" alt="20151218_a02" width="624" height="341" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_a02.jpg 624w, https://yugalab.net/wp-content/uploads/2015/12/20151218_a02-300x163.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /> すると「まじ？」と聞かれるので「あたぼうよ」と答えます。<br /> <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_a03.jpg"><img loading="lazy" class="alignnone size-full wp-image-4296" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_a03.jpg" alt="20151218_a03" width="624" height="341" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_a03.jpg 624w, https://yugalab.net/wp-content/uploads/2015/12/20151218_a03-300x163.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /> フォルダの拡張子がbundleに変わり、アイコンも変わりました。<br /> <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_a04.jpg"><img loading="lazy" class="alignnone size-full wp-image-4297" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_a04.jpg" alt="20151218_a04" width="624" height="341" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_a04.jpg 624w, https://yugalab.net/wp-content/uploads/2015/12/20151218_a04-300x163.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a> 空のbundleファイルができました！<br /> <br /> 今度は、bundleファイルをプロジェクトに追加します。<br /> Fileメニューから<span class="f_blue">「Add Files to &#8230;」</span>でプロジェクトにファイルを追加します。<br /> <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_b01.jpg"><img loading="lazy" class="alignnone size-full wp-image-4302" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_b01.jpg" alt="20151218_b01" width="624" height="464" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_b01.jpg 624w, https://yugalab.net/wp-content/uploads/2015/12/20151218_b01-300x223.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /> <br /> 先ほど作成したbundleファイルを選択します。<br /> <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_b02.jpg"><img loading="lazy" class="alignnone size-full wp-image-4303" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_b02.jpg" alt="20151218_b02" width="624" height="286" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_b02.jpg 624w, https://yugalab.net/wp-content/uploads/2015/12/20151218_b02-300x137.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /> プロジェクトにbundleファイルが追加されました！<br /> <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_b03.jpg"><img loading="lazy" class="alignnone size-full wp-image-4304" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_b03.jpg" alt="20151218_b03" width="624" height="286" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_b03.jpg 624w, https://yugalab.net/wp-content/uploads/2015/12/20151218_b03-300x137.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /> これ以降は、FinderからXcode内のbundleファイルに直接ドラッグ&amp;ドロップで、プロジェクト内で取り扱いたいpng画像を取り込むことができます。<br /><br /> 試しに、画像を一点ドラッグして追加してみます。<br /> こんな画像があったとして。<br /> <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_b04.jpg"><img loading="lazy" class="alignnone size-full wp-image-4305" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_b04.jpg" alt="20151218_b04" width="100" height="100" /></a><br /><br /> ドラッグすると、追加されます。 <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_b05.jpg"><img loading="lazy" class="alignnone size-full wp-image-4306" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_b05.jpg" alt="20151218_b05" width="624" height="439" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_b05.jpg 624w, https://yugalab.net/wp-content/uploads/2015/12/20151218_b05-300x211.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /> <br /> 次は、いよいよこの画像を呼んでみます。 <br /><h3 class="section_title putit_caption l_green">bundleからpng画像を呼ぶ</h3><br /> 先にソースを張ってしまいますが、png画像を呼ぶ為の関数はこちらです。</p>
<pre class="brush:swift" title="getResourceImage">/// リソース内からpng画像を取り出し、NSData形式で返却する
/// - parameter name : 画像の名前(パス)。拡張子[png]は省略。
/// - returns : NSData形式のpng画像 存在しなければnilを返す。
func getResourceImage(name:String)-&gt; NSData?{
    let bundlePath : String = NSBundle.mainBundle().pathForResource("resources", ofType: "bundle")!
    let bundle : NSBundle = NSBundle(path: bundlePath)!
    if let imagePath : String = bundle.pathForResource(name, ofType: "png"){
        let fileHandle : NSFileHandle = NSFileHandle(forReadingAtPath: imagePath)!
        let imageData : NSData = fileHandle.readDataToEndOfFile()
        return imageData
    }
    return nil
}</pre>
<p>この関数はどこに書いてもいいのですが、どこからでも呼べるように、 新しくUtil.swiftというファイルを作り、その中に置いてみます。<br /> <br /> <span class="f_blue">File &gt; New &gt; File</span>を選び、 <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_c01.jpg"><img loading="lazy" class="alignnone size-full wp-image-4307" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_c01.jpg" alt="20151218_c01" width="624" height="307" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_c01.jpg 624w, https://yugalab.net/wp-content/uploads/2015/12/20151218_c01-300x147.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /> Swiftファイルを選びます。 <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_c02.jpg"><img loading="lazy" class="alignnone size-full wp-image-4308" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_c02.jpg" alt="20151218_c02" width="624" height="443" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_c02.jpg 624w, https://yugalab.net/wp-content/uploads/2015/12/20151218_c02-300x212.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /> 名前をつけて、プロジェクトのグループ内に配置しましょう。 <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_c03.jpg"><img loading="lazy" class="alignnone size-full wp-image-4309" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_c03.jpg" alt="20151218_c03" width="624" height="582" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_c03.jpg 624w, https://yugalab.net/wp-content/uploads/2015/12/20151218_c03-300x279.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a> <br /><br /> 新しいSwiftファイルができたら、その中に先ほどのソースを貼り付けます。 <a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_c05.jpg"><img loading="lazy" class="alignnone size-full wp-image-4314" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_c05.jpg" alt="20151218_c05" width="624" height="402" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_c05.jpg 624w, https://yugalab.net/wp-content/uploads/2015/12/20151218_c05-300x193.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /> これで準備完了です！！ <br /><br /><h3 class="section_title putit_caption l_green">使い方</h3><br /> 以下のように、拡張子(png)を抜かしたファイル名で呼び出します。 画像が存在しない場合はnilが返るので、無かった場合の処理も考えておきましょう。<br /> こちらの例では、返ってきたNSDataを利用してUIImageを生成しています。
<pre class="brush:swift">let testData : NSData? = getResourceImage("test")
if testData != nil{
	let testImage : UIImage! = UIImage(data: testData! )

	// do something...

}</pre>
<br /> また、以下のようにbundle内にフォルダを作って、その中の画像を呼び出したい場合は、スラッシュを挟めば大丈夫です！<br/><a href="https://yugalab.net/wp-content/uploads/2015/12/20151218_d01.jpg"><img loading="lazy" class="alignnone size-full wp-image-4315" src="https://yugalab.net/wp-content/uploads/2015/12/20151218_d01.jpg" alt="20151218_d01" width="300" height="383" srcset="https://yugalab.net/wp-content/uploads/2015/12/20151218_d01.jpg 300w, https://yugalab.net/wp-content/uploads/2015/12/20151218_d01-234x300.jpg 234w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<pre class="brush:swift">let testData : NSData? = getResourceImage("images/test2")</pre>
<br/>
<br /><h4 class="section_subtitle putit_caption">解説</h4>
<pre class="brush:swift first-line:5">
let bundlePath : String = NSBundle.mainBundle().pathForResource("resources", ofType: "bundle")!
</pre>
まず、こちらの行はプロジェクト内から「resources」という名前をbundleのパスを生成しています。<br />
プロジェクト内にresourcesというbundleが無いと大変なことになります。
<pre class="brush:swift first-line:6">
let bundle : NSBundle = NSBundle(path: bundlePath)!
</pre>
次に、bundleのパスからbundleのインスタンスを得ます。<br />
<pre class="brush:swift first-line:7">
if let imagePath : String = bundle.pathForResource(name, ofType: "png"){
</pre>
そして、bundle内に指定した名前のpng画像があるかどうか調べています。<br/>
<pre class="brush:swift first-line:8">
    let fileHandle : NSFileHandle = NSFileHandle(forReadingAtPath: imagePath)!
    let imageData : NSData = fileHandle.readDataToEndOfFile()
    return imageData
</pre>
そして、画像があった場合は読み込んで、NSDataとして返します。
</div>
</p><p>The post <a href="https://yugalab.net/archives/4288">【Swift】プロジェクト内に置いたpng画像をNSDataとして取り出す</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://yugalab.net/archives/4288/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【css/備忘録】何をどうしてもテキスト選択してほしくない時の対処法</title>
		<link>https://yugalab.net/archives/3054</link>
					<comments>https://yugalab.net/archives/3054#comments</comments>
		
		<dc:creator><![CDATA[ユーリ]]></dc:creator>
		<pubDate>Wed, 14 Oct 2015 03:00:43 +0000</pubDate>
				<category><![CDATA[html/css]]></category>
		<category><![CDATA[technical]]></category>
		<category><![CDATA[css]]></category>
		<guid isPermaLink="false">http://yugalab.net/?p=3054</guid>

					<description><![CDATA[<p>お仕事で詰まった案件の備忘録。cssやwebview関連で… 先日、webアプリの制作案件のうち一部の作業を担当しまして、こういうご注文がありました。 「ブラウザ内での選択機能を制限したい。」 webアプリの場合、ブラウ [&#8230;]</p>
<p>The post <a href="https://yugalab.net/archives/3054">【css/備忘録】何をどうしてもテキスト選択してほしくない時の対処法</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>お仕事で詰まった案件の備忘録。<br />cssやwebview関連で…<br />
<div class="fold_post">
<style type="text/css">
.button_sample_20151014{
	box-shadow	: -2px -2px 2px #999 inset;
	border:1px solid black;
	border-radius:8px;
	padding		: 16px;
}
.button_sample_20151014:active{
	box-shadow	:2px 2px 2px #999 inset;
	color		:transparent;
	text-shadow	:2px 2px 0px #666;
}
</style>

<br />先日、webアプリの制作案件のうち一部の作業を担当しまして、<br />こういうご注文がありました。<br />
「ブラウザ内での選択機能を制限したい。」<br />
<br />webアプリの場合、ブラウザ内であたかもネイティブアプリの如く、<br />機能やレイアウトを実装します。主にcssとjavascriptで。<br />また、アプリ風のページを作って、<br />ネイティブアプリ内の機能の一部としてwebviewでページを呼び出すこともあります。<br />イメージ的にはこんなかんじ。<br /><a href="https://yugalab.net/wp-content/uploads/2015/10/20151015_a01.jpg"><img loading="lazy" class="alignnone size-full wp-image-3230" src="https://yugalab.net/wp-content/uploads/2015/10/20151015_a01.jpg" alt="20151015_a01" width="400" height="640" srcset="https://yugalab.net/wp-content/uploads/2015/10/20151015_a01.jpg 400w, https://yugalab.net/wp-content/uploads/2015/10/20151015_a01-187x300.jpg 187w" sizes="(max-width: 400px) 100vw, 400px" /></a><br />その際、ブラウザの標準機能である「選択操作」ができてしまうと、こんなふうにページ内のDOMを選択できてしまいます。<br />
<a href="https://yugalab.net/wp-content/uploads/2015/10/20151015_a02.jpg"><img loading="lazy" src="https://yugalab.net/wp-content/uploads/2015/10/20151015_a02.jpg" alt="20151015_a02" width="400" height="640" class="alignnone size-full wp-image-3233" srcset="https://yugalab.net/wp-content/uploads/2015/10/20151015_a02.jpg 400w, https://yugalab.net/wp-content/uploads/2015/10/20151015_a02-187x300.jpg 187w" sizes="(max-width: 400px) 100vw, 400px" /></a><br />こういうことができると機能的に不便というわけではありませんが、<br />「見た目上よくない」「スタイリッシュじゃない」という声があがります。<br />ごもっともです。<br />なんとかしましょう。<br />

<br /><h3 class="section_title putit_caption l_green">対処1:cssで選択を制限</h3><br />まず、最初の対処はこちら。<br />大体の場合はこれで済みます。<br />
<pre class="brush:css">
*:not(input){
    -moz-user-select: none;
    -webkit-user-select: none;
    -ms-user-select: none;
    user-select: none;
}
</pre>
<span class="f_blue">user-select : none;</span>とは、「この部分の選択を禁止する」という意味のcssプロパティです。<br />
ほとんどのブラウザは対応しているハズなので、これで効けば一件落着。
<br /><h4 class="section_subtitle putit_caption">サンプル</h4>
<div style="border:1px solid black;margin:8px 0;text-align:center;font-size:80%;">
	<div class="button_sample_20151014" style="margin:35px 10% 20px 10%;
				background-color:#CCF;">user select指定なし(選択可)</div>
	<div style="-moz-user-select: none;
				-webkit-user-select: none;
				-ms-user-select: none;
				user-select: none;">
		<div class="button_sample_20151014" style="margin:20px 10%;background-color:#FCC;">user select指定あり(選択不可)</div>
				<div class="height:1px;overflow:hidden;">　</div>
	</div>
	
</div>
しかし、webviewや一部のAndroid系ブラウザでは、user-selectが効かないことがあります…<br />
その場合は次の対処。<br />


<br /><h3 class="section_title putit_caption l_green">対処2:選択状態カラーを透明にしてしまう</h3><br />
デフォルトでは選択を行うと、選択部分が青くなりますが、<br>
実は、その「選択したら青」といった色を変えることができちゃいます。
<pre class="brush:css">
*{
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
</pre>
選択色を透明にしてしまえば、仮に選択状態にできてしまったとしても、選択していることがわからなくなります！！(いささか乱暴ですが)<br />
しかし、これも効かないことがあります。そんな手強いブラウザには次の対処。<br />

<br /><h3 class="section_title putit_caption l_green">対処3:touchstartのイベントをキャンセルする</h3><br />
これはもういろいろ犠牲になる最終手段ですが、preventDefault()でイベント自体を発生させないようにします。
この方法を使う場合は、個別にclick時の挙動などを書かなければならないので注意しましょう。
<pre class="brush:js">
$(function(){
	$(".target-button").on("touchstart mousedown",function(e){
		 e.preventDefault();
	});
});
</pre>
<h4 class="section_subtitle putit_caption">サンプル</h4>
<div style="border:1px solid black;margin:8px 0;text-align:center;font-size:80%;">
	<div class="button_sample_20151014" style="margin:20px 10% 20px 10%;
				background-color:#CCF;">preventDefaultなし</div>
	<div style="-moz-user-select: none;
				-webkit-user-select: none;
				-ms-user-select: none;
				user-select: none;">
	<div class="button_sample_20151014 button_sample_20151014_2" style="margin:20px 10%;background-color:#FCC;">preventDefaultあり</div>
	</div>
</div>
<script>
$(function(){
	$(".button_sample_20151014_2").on("touchstart mousedown",function(e){
		 e.preventDefault();
	});
});
</script>
今回はこんな感じですみません。
以上です！

</div>
</p><p>The post <a href="https://yugalab.net/archives/3054">【css/備忘録】何をどうしてもテキスト選択してほしくない時の対処法</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://yugalab.net/archives/3054/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>【Blender】ボーンを動かしてアニメーションを作成する</title>
		<link>https://yugalab.net/archives/2570</link>
					<comments>https://yugalab.net/archives/2570#comments</comments>
		
		<dc:creator><![CDATA[ユーリ]]></dc:creator>
		<pubDate>Fri, 18 Sep 2015 03:00:08 +0000</pubDate>
				<category><![CDATA[Blender]]></category>
		<category><![CDATA[technical]]></category>
		<category><![CDATA[(フラグ)ランダム非表示]]></category>
		<category><![CDATA[3D]]></category>
		<guid isPermaLink="false">http://yugalab.net/?p=2570</guid>

					<description><![CDATA[<p>お仕事関連のメモがてら、3Dソフトのtipsをお送りいたします。その３　 前回の記事はこちらです↓今回は、ボーンの位置、回転などの状態をひとつひとつ登録していき、登録したものを繋げてアニメーションさせる、という作業を行い [&#8230;]</p>
<p>The post <a href="https://yugalab.net/archives/2570">【Blender】ボーンを動かしてアニメーションを作成する</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>お仕事関連のメモがてら、3Dソフトのtipsをお送りいたします。その３　 <br /><span id="more-2570"></span><br />前回の記事はこちらです↓<br /><a href="https://yugalab.net/archives/2446" target="_blank" class="bg_technical minipost_link_wrap hover_fade clearfix"><div class="minipost_link_img"><img width="300" height="185" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_d01.gif" class="minipost_link_img_inner" alt="" loading="lazy" /></div><div class="minipost_link_title"><span class="l_gray f080">ユガラボ | 2015/09/11</span><br />【Blender】メッシュにボーン(Armature)を入れてポーズ変更できるようにする</div></a><br /><br />今回は、ボーンの位置、回転などの状態をひとつひとつ登録していき、<br />登録したものを繋げてアニメーションさせる、という作業を行います！<br /><br /><h3 class="section_title putit_caption l_green">マスターボーンを追加する。</h3><br />前回までの記事の手順通り、<br />メッシュにボーンをいれてペアリングまでが完了しているものとします。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_a01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2620" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_a01.jpg" alt="20150918_a01" width="300" height="376" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_a01.jpg 300w, https://yugalab.net/wp-content/uploads/2015/09/20150918_a01-239x300.jpg 239w" sizes="(max-width: 300px) 100vw, 300px" /></a><br /><br />このままだと、背骨の下部分と腰の付け根部分がまだ繋がっていません。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_a02.gif"><img loading="lazy" class="alignnone size-full wp-image-2621" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_a02.gif" alt="20150918_a02" width="200" height="226" /></a><br />アニメーションさせる際も、このままでは不便なので<br />「マスターボーン」を追加する作業を行います。<br /><br />マスターボーンは、全てのボーンの親となるボーンで、<br />マスターボーンを動かせば子になっている全てのボーンを動かしたり回転させたりできます。<br /><br />まず、編集モードに入り背骨の真ん中あたりのボーンのTipを選択します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_a03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2622" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_a03.jpg" alt="20150918_a03" width="300" height="345" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_a03.jpg 300w, https://yugalab.net/wp-content/uploads/2015/09/20150918_a03-260x300.jpg 260w" sizes="(max-width: 300px) 100vw, 300px" /></a> <br />そこから後ろに向かってボーンを押し出します。(ホントはどこから押し出してもいいのですが、位置的にわかりやすいので)<br />視点を平行視点<span class="bold">(テンキー5)</span>の真横から<span class="bold">(テンキー3)</span>にするとやりやすいです。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_a04.jpg"><img loading="lazy" class="alignnone size-full wp-image-2623" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_a04.jpg" alt="20150918_a04" width="300" height="282" /></a><br /><span class="bold">Eキー</span>の押し出しを押してから、<span class="bold">Yキー</span>を押せば移動座標軸がY軸に固定されます。<br />この操作をすると、背骨のボーンの子としてボーンが作られますが、まずはそれで大丈夫です。<br /><br />新しく押し出したボーンの名前を「Master」とします。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_a05.jpg"><img loading="lazy" class="alignnone size-full wp-image-2624" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_a05.jpg" alt="20150918_a05" width="177" height="106" /></a><br />編集モードで画面右のアウトライナーからこのボーンのプロパティを開き、<br />「親」のボーン関連付けを解除し、このボーンを独立したボーンにします。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_a06.jpg"><img loading="lazy" class="alignnone size-full wp-image-2625" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_a06.jpg" alt="20150918_a06" width="400" height="548" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_a06.jpg 400w, https://yugalab.net/wp-content/uploads/2015/09/20150918_a06-218x300.jpg 218w" sizes="(max-width: 400px) 100vw, 400px" /></a><br />今度は逆に、すでにある背骨、右足の付け根、左足の付け根の３つの親ボーンを設定します。<br />「親:」からMasterボーンを選ぶことで、Masterボーンの子となります。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_a07.gif"><img loading="lazy" class="alignnone size-full wp-image-2626" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_a07.gif" alt="20150918_a07" width="250" height="549" /></a><br /><br />これで、すべてのボーンをMasterボーンの子としてまとめることができました。<br /><br />マスターボーンは、ペアリング後に追加したボーンなので、曲げたり伸ばしたりしても、<br />メッシュの形が変わらないようになっています。<br /><br /><h3 class="section_title putit_caption l_green">アニメーション登録前の準備</h3><br />ここまででボーンの作成が完了したので、<br />アニメーション編集の際に見やすくなるよう、表示状態を変更します。<br /><br />アウトライナーのアーマチュアプロパティを選び、表示を<span class="l_blue">「八面体」</span>から<span class="l_blue">「スティック」</span>に変更しましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_b01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2627" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_b01.jpg" alt="20150918_b01" width="300" height="468" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_b01.jpg 300w, https://yugalab.net/wp-content/uploads/2015/09/20150918_b01-192x300.jpg 192w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />これでメッシュが見やすくなりました。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_b02.jpg"><img loading="lazy" class="alignnone size-full wp-image-2628" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_b02.jpg" alt="20150918_b02" width="300" height="382" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_b02.jpg 300w, https://yugalab.net/wp-content/uploads/2015/09/20150918_b02-235x300.jpg 235w" sizes="(max-width: 300px) 100vw, 300px" /></a><br /><br />次に、画面下のエディターを「ドープシート」に変更します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_b03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2629" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_b03.jpg" alt="20150918_b03" width="300" height="473" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_b03.jpg 300w, https://yugalab.net/wp-content/uploads/2015/09/20150918_b03-190x300.jpg 190w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />このシートにポーズを一つ一つ登録していくことで、アニメーションを作成することができます。<br />ドープシートメニューのアクションモードを使用します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_b04.jpg"><img loading="lazy" class="alignnone size-full wp-image-2630" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_b04.jpg" alt="20150918_b04" width="500" height="142" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_b04.jpg 500w, https://yugalab.net/wp-content/uploads/2015/09/20150918_b04-300x85.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br /><br /><h3 class="section_title putit_caption l_green">モーション作成！</h3><br />歩行モーションを作ってみましょう。<br />「新規」をクリックして新しいアニメーションを登録します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_c01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2631" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_c01.jpg" alt="20150918_c01" width="500" height="98" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_c01.jpg 500w, https://yugalab.net/wp-content/uploads/2015/09/20150918_c01-300x58.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />アニメーション名は「walk(loop)」としました。<br />名前を決めたら右にある<span class="bold">「F」</span>のボタンを押しておいてください。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_c02.jpg"><img loading="lazy" class="alignnone size-full wp-image-2632" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_c02.jpg" alt="20150918_c02" width="415" height="136" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_c02.jpg 415w, https://yugalab.net/wp-content/uploads/2015/09/20150918_c02-300x98.jpg 300w" sizes="(max-width: 415px) 100vw, 415px" /></a><br />これを押さないと作ったモーションが保存されません！<br />また、フレームを1コマ目に合わせておいてください。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_c03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2633" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_c03.jpg" alt="20150918_c03" width="259" height="225" /></a><br /><br />歩行モーションですから、<br />「足を前に出す」<br />「足に合わせて腕を降る」<br />「腰、背中を歩く姿勢に合わせて軽く曲げる」などの動作になります。<br />まずは、1コマ目の動作として右足を前に出す動作を登録します。<br /><br />まずは、「右足を前に出すポーズ」を作ります。<br /><span class="bold">右クリック</span>で曲げたいボーンを選択し、<span class="bold">rキー</span>で角度調節を行っていきます。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_c04.gif"><img loading="lazy" class="alignnone size-full wp-image-2638" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_c04.gif" alt="20150918_c04" width="300" height="263" /></a><br />ひとつひとつのボーンを調整し、納得するポーズになったら「キーフレーム」を登録します。<br />3Dビュー上で<span class="bold">Iキー</span>を押し、キーフレーム挿入メニューを開いて「位置/回転」をクリックします。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_c05.jpg"><img loading="lazy" class="alignnone size-full wp-image-2639" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_c05.jpg" alt="20150918_c05" width="400" height="359" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_c05.jpg 400w, https://yugalab.net/wp-content/uploads/2015/09/20150918_c05-300x269.jpg 300w" sizes="(max-width: 400px) 100vw, 400px" /></a><br />これで、いま作成したポーズが登録されました。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_c06.jpg"><img loading="lazy" class="alignnone size-full wp-image-2640" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_c06.jpg" alt="20150918_c06" width="400" height="258" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_c06.jpg 400w, https://yugalab.net/wp-content/uploads/2015/09/20150918_c06-300x193.jpg 300w" sizes="(max-width: 400px) 100vw, 400px" /></a><br />このポーズは右足を前に出していますが、これを左右判定して左足を前に出したポーズにします。<br />ドープシート上でキーフレームの一番上の「ドーブシート概要」の列を<span class="bold">右クリック</span>で選択します。これでこのフレームの全てのボーンの位置状態を選択できます。<br /><span class="bold">Ctrl + C</span>でポーズごとコピーします。<br />そして、21フレーム目あたりをクリックして<span class="bold">Shift + Ctrl + V</span>で「左右反転ペースト」を行います。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_c07.jpg"><img loading="lazy" class="alignnone size-full wp-image-2641" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_c07.jpg" alt="20150918_c07" width="535" height="575" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_c07.jpg 535w, https://yugalab.net/wp-content/uploads/2015/09/20150918_c07-279x300.jpg 279w" sizes="(max-width: 535px) 100vw, 535px" /></a><br />左足を前に出したポーズが生成されました。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_c08.jpg"><img loading="lazy" class="alignnone size-full wp-image-2642" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_c08.jpg" alt="20150918_c08" width="245" height="327" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_c08.jpg 245w, https://yugalab.net/wp-content/uploads/2015/09/20150918_c08-224x300.jpg 224w" sizes="(max-width: 245px) 100vw, 245px" /></a><br />次に、41フレーム目あたりに最初に作った右足を前に出したポーズを左右反転せずそのままペーストします。<br />ポーズのペーストは<span class="bold">Ctrl + V</span>で大丈夫です。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_c09.jpg"><img loading="lazy" class="alignnone size-full wp-image-2643" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_c09.jpg" alt="20150918_c09" width="535" height="551" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_c09.jpg 535w, https://yugalab.net/wp-content/uploads/2015/09/20150918_c09-291x300.jpg 291w" sizes="(max-width: 535px) 100vw, 535px" /></a><br />これで1~41フレームにかけて<br />「右足を前に出したポーズ」<br />「左足を前に出したポーズ」<br />「右足を前に出したポーズ」<br />の3つが登録されました。<br />一旦、この状態でアニメーションさせてみましょう。<br />左下のビューを「タイムライン」に切り替えます。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_c10.jpg"><img loading="lazy" class="alignnone size-full wp-image-2644" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_c10.jpg" alt="20150918_c10" width="346" height="198" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_c10.jpg 346w, https://yugalab.net/wp-content/uploads/2015/09/20150918_c10-300x171.jpg 300w" sizes="(max-width: 346px) 100vw, 346px" /></a> <br />ここでアニメーション開始フレームと終了フレームを設定することができます。<br />開始を「1」、終了を「41」に設定しましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_d01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2645" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_d01.jpg" alt="20150918_d01" width="400" height="158" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_d01.jpg 400w, https://yugalab.net/wp-content/uploads/2015/09/20150918_d01-300x118.jpg 300w" sizes="(max-width: 400px) 100vw, 400px" /></a><br /><br />設定したら<span class="bold">alt + A</span>で再生ができます！<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_d02.gif"><img loading="lazy" class="alignnone size-full wp-image-2646" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_d02.gif" alt="20150918_d02" width="300" height="351" /></a><br />おお！？うーん。<br />いちおう手足を前後に振って動いてくれましたが、まだ躍動感が足りません。<br />こんなときは中間フレームを登録して動きを補間しましょう。<br />1フレーム目の「右足を前に出したポーズ」と<br />21フレーム目の「左足を前に出したポーズ」の中間に位置する<br />11フレーム目を選択します。ここのポーズを調整します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_d03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2647" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_d03.jpg" alt="20150918_d03" width="400" height="497" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_d03.jpg 400w, https://yugalab.net/wp-content/uploads/2015/09/20150918_d03-241x300.jpg 241w" sizes="(max-width: 400px) 100vw, 400px" /></a><br />いまのままだと、宙に浮いているようなポーズになっています。<br />人間はふつう、歩行中にこんなポーズにはならないハズです。<br />足の角度を調節して、地に足がついたカンジにしました。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_d04.jpg"><img loading="lazy" class="alignnone size-full wp-image-2648" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_d04.jpg" alt="20150918_d04" width="400" height="518" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_d04.jpg 400w, https://yugalab.net/wp-content/uploads/2015/09/20150918_d04-231x300.jpg 231w" sizes="(max-width: 400px) 100vw, 400px" /></a><br />また全体の座標を少し前寄りにし、肩と腕の角度も少し変えました。<br />補間用のポーズができたら、最初と同じように3Dビュー上でIキーを押し、<br />「位置/回転」を登録します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_d05.jpg"><img loading="lazy" class="alignnone size-full wp-image-2649" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_d05.jpg" alt="20150918_d05" width="400" height="231" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_d05.jpg 400w, https://yugalab.net/wp-content/uploads/2015/09/20150918_d05-300x173.jpg 300w" sizes="(max-width: 400px) 100vw, 400px" /></a><br />1〜21の間の11フレーム目に一歩目の補間ポーズができたので、<br />同様に21〜41フレーム目の二歩目の部分も補間ポーズを登録します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_d06.jpg"><img loading="lazy" class="alignnone size-full wp-image-2650" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_d06.jpg" alt="20150918_d06" width="535" height="521" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_d06.jpg 535w, https://yugalab.net/wp-content/uploads/2015/09/20150918_d06-300x292.jpg 300w" sizes="(max-width: 535px) 100vw, 535px" /></a><br />31フレーム目には、いま作った補間用ポーズを左右判定したものを貼り付けましょう。<br /><br />もう一度再生してみると…前よりよくなりました！<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_d07.gif"><img loading="lazy" class="alignnone size-full wp-image-2651" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_d07.gif" alt="20150918_d07" width="300" height="380" /></a><br />このように、さらに細かい調整をしていき、こきみよいモーションになるまで試行錯誤することになります！<br /><br /><h3 class="section_title putit_caption l_green">別のモーションを作る場合</h3><br />次は歩行以外のモーションを作りたい！という場合は、<br />ポーズ名の右の「×」ボタンを押してそのポーズの編集を解除します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_e01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2668" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_e01.jpg" alt="20150918_e01" width="316" height="82" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_e01.jpg 316w, https://yugalab.net/wp-content/uploads/2015/09/20150918_e01-300x77.jpg 300w" sizes="(max-width: 316px) 100vw, 316px" /></a><br />もう一度「新規」を押して別のモーションの作成に入ることができます。<br />別のモーションを作る際は、フレーム番号が他のモーションとかぶらないように注意してください。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150918_e021.jpg"><img loading="lazy" class="alignnone size-full wp-image-2670" src="https://yugalab.net/wp-content/uploads/2015/09/20150918_e021.jpg" alt="20150918_e02" width="624" height="317" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150918_e021.jpg 624w, https://yugalab.net/wp-content/uploads/2015/09/20150918_e021-300x152.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />今回はこんな感じでした。<br />お読みいただき、ありがとうございました！</p><p>The post <a href="https://yugalab.net/archives/2570">【Blender】ボーンを動かしてアニメーションを作成する</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://yugalab.net/archives/2570/feed</wfw:commentRss>
			<slash:comments>26</slash:comments>
		
		
			</item>
		<item>
		<title>【Blender】メッシュにボーン(Armature)を入れてポーズ変更できるようにする</title>
		<link>https://yugalab.net/archives/2446</link>
					<comments>https://yugalab.net/archives/2446#comments</comments>
		
		<dc:creator><![CDATA[ユーリ]]></dc:creator>
		<pubDate>Fri, 11 Sep 2015 03:00:35 +0000</pubDate>
				<category><![CDATA[Blender]]></category>
		<category><![CDATA[technical]]></category>
		<category><![CDATA[(フラグ)ランダム非表示]]></category>
		<category><![CDATA[3D]]></category>
		<guid isPermaLink="false">http://yugalab.net/?p=2446</guid>

					<description><![CDATA[<p>お仕事関連のメモがてら、3Dソフトのtipsをお送りいたします。その２前回の記事はこちら↓です！今回は、Blenderにメッシュを取り込んで大きさと位置合わせまで完了しているものとし、前回の続きからお伝えします！今回は、 [&#8230;]</p>
<p>The post <a href="https://yugalab.net/archives/2446">【Blender】メッシュにボーン(Armature)を入れてポーズ変更できるようにする</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>お仕事関連のメモがてら、3Dソフトのtipsをお送りいたします。その２<br /><span id="more-2446"></span><br />前回の記事はこちら↓です！<br /><a href="https://yugalab.net/archives/2395" target="_blank" class="bg_technical minipost_link_wrap hover_fade clearfix"><div class="minipost_link_img"><img width="300" height="185" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_thumb.jpg" class="minipost_link_img_inner" alt="" loading="lazy" /></div><div class="minipost_link_title"><span class="l_gray f080">ユガラボ | 2015/09/04</span><br />【Blender】Sculptrisで作成したモデルをBlenderへインポートする</div></a><br />今回は、Blenderにメッシュを取り込んで大きさと位置合わせまで完了しているものとし、<br />前回の続きからお伝えします！<br /><br />今回は、Blenderに取り込んだメッシュに骨格(ボーン、アーマチュア等と呼称します)を入れて、<br />3Dモデルのポーズを自由自在に変更できるようにいたします。<br /><br /><h3 class="section_title putit_caption l_green">最初のボーンを追加する</h3><br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_a01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2517" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_a01.jpg" alt="20150910_a01" width="300" height="232" /></a><br />まずは、メッシュの基底部分(足の裏的な部分)がゼロ座標に合わさっていることを確認します。<br /><br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_a02.jpg"><img loading="lazy" class="alignnone size-full wp-image-2518" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_a02.jpg" alt="20150910_a02" width="300" height="311" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_a02.jpg 300w, https://yugalab.net/wp-content/uploads/2015/09/20150910_a02-289x300.jpg 289w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />正面から見るとピッタリ合っていますね。<br />ピッタリ正面から見たい場合は、<span class="bold">テンキーの5</span>で平行投影に切り替え、<br /><span class="bold">テンキーの1</span>で正面視点にしてください。<br /><br />そして、3Dビューにマウスが乗った状態で<span class="bold">Shift + Aキー</span>を押してください。<br />オブジェクトの追加メニューが表示されます。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_a03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2519" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_a03.jpg" alt="20150910_a03" width="500" height="358" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_a03.jpg 500w, https://yugalab.net/wp-content/uploads/2015/09/20150910_a03-300x214.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />この中から、アーマチュア(Armature) &gt; 一つのボーン(Single Bone)を選択します。<br />ボーンが追加されました。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_a04.jpg"><img loading="lazy" class="alignnone size-full wp-image-2520" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_a04.jpg" alt="20150910_a04" width="300" height="251" /></a><br />この、最初に追加されたボーンは一番基本となる骨である背骨として利用します。<br /><br />まずは、ボーンの位置を合わせます。ボーンを選択した状態で画面右のアウトライナーからオブジェクトプロパティから座標を選択し、X、Y、Zすべて0を入力してください。<br />(アウトライナーとは、画面上に素材するオブジェクトのリストと、その情報が表示されるビューです。)<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_a05.jpg"><img loading="lazy" class="alignnone size-full wp-image-2521" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_a05.jpg" alt="20150910_a05" width="382" height="502" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_a05.jpg 382w, https://yugalab.net/wp-content/uploads/2015/09/20150910_a05-228x300.jpg 228w" sizes="(max-width: 382px) 100vw, 382px" /></a><br /><br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_a06.gif"><img loading="lazy" class="alignnone size-full wp-image-2522" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_a06.gif" alt="20150910_a06" width="400" height="276" /><br /></a><br />ボーンが中心点に移動しました。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_a07.jpg"><img loading="lazy" class="alignnone size-full wp-image-2523" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_a07.jpg" alt="20150910_a07" width="300" height="379" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_a07.jpg 300w, https://yugalab.net/wp-content/uploads/2015/09/20150910_a07-237x300.jpg 237w" sizes="(max-width: 300px) 100vw, 300px" /></a><br /><br />このままでは、ボーンが他のオブジェクトと重なった時に、メリ込んで見えなくなってしまいますので、アウトライナーでアーマチュアを選択し、アーマチュアプロパティのオプションから「レントゲン」をONにします。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_a08.jpg"><img loading="lazy" class="alignnone size-full wp-image-2524" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_a08.jpg" alt="20150910_a08" width="624" height="399" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_a08.jpg 624w, https://yugalab.net/wp-content/uploads/2015/09/20150910_a08-300x191.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_a09.jpg"><img loading="lazy" class="alignnone size-full wp-image-2525" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_a09.jpg" alt="20150910_a09" width="290" height="604" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_a09.jpg 290w, https://yugalab.net/wp-content/uploads/2015/09/20150910_a09-144x300.jpg 144w" sizes="(max-width: 290px) 100vw, 290px" /></a><br />この設定を行うことで、ボーンがメッシュに対してどのように重なっていても、ボーン全体が優先表示されるようになります。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_a10.gif"><img loading="lazy" class="alignnone size-full wp-image-2526" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_a10.gif" alt="20150910_a10" width="400" height="258" /></a><br /><br /><h3 class="section_title putit_caption l_green">メッシュの形状に合わせてボーンを生やす</h3><br />こちらはかなり重要な作業です！と同時に面白い部分でもあります。<br />現実に存在する生物の骨格を参考に作ると、かなりそれっぽい動きになりますよ！<br /><br />まずは、ボーンを構成する部位について覚えてください。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_b01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2527" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_b01.jpg" alt="20150910_b01" width="150" height="216" /></a><br />初期設定の八面体表示のボーンを例にします。<br />ボーンの上部分(尖ったほう)をTip、下部分(太いほう)をRootと呼びます。<br /><br />まずは、編集モードに移動します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_b02.jpg"><img loading="lazy" class="alignnone size-full wp-image-2528" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_b02.jpg" alt="20150910_b02" width="500" height="188" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_b02.jpg 500w, https://yugalab.net/wp-content/uploads/2015/09/20150910_b02-300x112.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />画面左側のオプションから、アーマチュアオプションの<span class="bold">「X軸ミラー」をONに</span>してください。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_b03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2529" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_b03.jpg" alt="20150910_b03" width="500" height="251" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_b03.jpg 500w, https://yugalab.net/wp-content/uploads/2015/09/20150910_b03-300x150.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />オプションが画面に出ていない場合は<span class="bold">Tキー</span>で表示されます。<br /><br />ボーンを選択するには、<span class="bold">右クリック</span>を使用します。<br />ボーンの真ん中部分を<span class="bold">右クリック</span>して、ボーン全体を選択し、<br />最初のボーンを背骨にあたる位置まで移動しましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_b04.jpg"><img loading="lazy" class="alignnone size-full wp-image-2530" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_b04.jpg" alt="20150910_b04" width="350" height="393" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_b04.jpg 350w, https://yugalab.net/wp-content/uploads/2015/09/20150910_b04-267x300.jpg 267w" sizes="(max-width: 350px) 100vw, 350px" /></a><br />ボーンのTip部分が上に大きくはみ出してしまっている場合、<br />Tip部分を<span class="bold">右クリック</span>で選択し、青軸の矢印(Z軸)をひっぱって下に移動します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_b05.jpg"><img loading="lazy" class="alignnone size-full wp-image-2531" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_b05.jpg" alt="20150910_b05" width="350" height="290" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_b05.jpg 350w, https://yugalab.net/wp-content/uploads/2015/09/20150910_b05-300x248.jpg 300w" sizes="(max-width: 350px) 100vw, 350px" /></a><br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_b06.jpg"><img loading="lazy" class="alignnone size-full wp-image-2532" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_b06.jpg" alt="20150910_b06" width="400" height="345" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_b06.jpg 400w, https://yugalab.net/wp-content/uploads/2015/09/20150910_b06-300x258.jpg 300w" sizes="(max-width: 400px) 100vw, 400px" /></a><br /><br /><br />斜めから見るとこんな感じです。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_b07.jpg"><img loading="lazy" class="alignnone size-full wp-image-2533" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_b07.jpg" alt="20150910_b07" width="500" height="369" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_b07.jpg 500w, https://yugalab.net/wp-content/uploads/2015/09/20150910_b07-300x221.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br /><br />次に、2本目、3本目…とボーンを生やして繋げていく作業です。<br />これを「ボーンの押し出し」と呼びます。<br />ボーンを生やしたい部位のTip部分かRoot部分を右クリックで選択します。<br />選択したら<span class="bold">Eキー→マウスドラッグ</span>で次のボーンが生えてきます。<br />今回はZ軸方向に固定して伸ばしたいので、ボーンを生やしてから<span class="bold">Zキー</span>を押して、<br />移動軸を限定させましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_b08.gif"><img loading="lazy" class="alignnone size-full wp-image-2534" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_b08.gif" alt="20150910_b08" width="400" height="342" /></a><br /><br />そのままZ軸固定の押し出しを続け、首、頭のボーンも追加します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_b09.jpg"><img loading="lazy" class="alignnone size-full wp-image-2535" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_b09.jpg" alt="20150910_b09" width="500" height="482" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_b09.jpg 500w, https://yugalab.net/wp-content/uploads/2015/09/20150910_b09-300x289.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br /><br /><h4 class="section_subtitle putit_caption">左右対象のボーン</h4>両腕、両足などは左右おなじように作る必要があります。<br />通常の押し出しは<span class="bold">Eキー</span>ですが、<br /><span class="bold">Shift + Eキー</span>を押すことで左右対象にボーンを生やすことができます。<br />(オプションのX軸ミラーをONにしておいてください。)<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_c01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2536" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_c01.jpg" alt="20150910_c01" width="497" height="394" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_c01.jpg 497w, https://yugalab.net/wp-content/uploads/2015/09/20150910_c01-300x237.jpg 300w" sizes="(max-width: 497px) 100vw, 497px" /></a><br /><br />背骨あたりから肩に相当するボーンを伸ばします。<br />肩から下のボーンは普通に<span class="bold">Eキー</span>の押し出しで大丈夫です。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_c02.jpg"><img loading="lazy" class="alignnone size-full wp-image-2537" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_c02.jpg" alt="20150910_c02" width="495" height="401" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_c02.jpg 495w, https://yugalab.net/wp-content/uploads/2015/09/20150910_c02-300x243.jpg 300w" sizes="(max-width: 495px) 100vw, 495px" /></a><br /><br />腰から下のボーンは、最初に置いた背骨ボーンのRootから伸ばします。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_c03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2538" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_c03.jpg" alt="20150910_c03" width="622" height="175" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_c03.jpg 622w, https://yugalab.net/wp-content/uploads/2015/09/20150910_c03-300x84.jpg 300w" sizes="(max-width: 622px) 100vw, 622px" /></a><br /><br />足のボーンは、カメラを正面ではなく真横<span class="bold">(テンキー3)</span>に向けて押し出すとよいです。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_c04.jpg"><img loading="lazy" class="alignnone size-full wp-image-2539" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_c04.jpg" alt="20150910_c04" width="398" height="341" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_c04.jpg 398w, https://yugalab.net/wp-content/uploads/2015/09/20150910_c04-300x257.jpg 300w" sizes="(max-width: 398px) 100vw, 398px" /></a><br /><br />これで、大雑把ですが身体全体分ボーンを作製できました。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_c05.jpg"><img loading="lazy" class="alignnone size-full wp-image-2540" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_c05.jpg" alt="20150910_c05" width="249" height="427" /></a><br /><br /><h4 class="section_subtitle putit_caption">動かしたい部位の数だけボーンが必要です</h4>これは別のモデルになりますが、<br />ポーズを変更する場合、ボーンを動かすことになる関係上、複雑な動きをさせたい場合はその分だけボーンが必要になります。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_d01.gif"><img loading="lazy" class="alignnone size-full wp-image-2541" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_d01.gif" alt="20150910_d01" width="300" height="185" /></a><br />こちらの例の場合は、くちばしの上部分と下部分にボーンを入れ、くちばしの開閉ができるようにしています。<br />人間のモデルの場合、こだわるなら指の一本一本、関節まで考慮してボーンを入れ込むなど。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_d02.jpg"><img loading="lazy" class="alignnone size-full wp-image-2542" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_d02.jpg" alt="20150910_d02" width="400" height="292" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_d02.jpg 400w, https://yugalab.net/wp-content/uploads/2015/09/20150910_d02-300x219.jpg 300w" sizes="(max-width: 400px) 100vw, 400px" /></a><br />そうすれば指を一本一本自由に動かせるので、ピースさせたり、ぐわしさせたりできますが、その分処理も重くなります。<br /><br />ゲームなどで動作させる場合は、ボーンの数が多くなればなるほど処理も重くなるので、その点を考慮しながらボーンの配置を行いましょう。<br /><br /><h3 class="section_title putit_caption l_green">ボーンの命名</h3><br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_e01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2543" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_e01.jpg" alt="20150910_e01" width="500" height="368" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_e01.jpg 500w, https://yugalab.net/wp-content/uploads/2015/09/20150910_e01-300x220.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />このままだとどれがどこの骨かわからないので、名前をつけましょう。<br /><br />アウトライナーでボーンの名前部分をクリックすると名前を変えることができます。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_e02.jpg"><img loading="lazy" class="alignnone size-full wp-image-2544" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_e02.jpg" alt="20150910_e02" width="300" height="76" /></a><br /><br />左右二つあるボーンの場合は、末尾に「 _R」、「_L」を付けて区別しましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_e03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2545" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_e03.jpg" alt="20150910_e03" width="500" height="368" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_e03.jpg 500w, https://yugalab.net/wp-content/uploads/2015/09/20150910_e03-300x220.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br /><br />今回の例ではこのようにつけました。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_e04.jpg"><img loading="lazy" class="alignnone size-full wp-image-2546" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_e04.jpg" alt="20150910_e04" width="624" height="677" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_e04.jpg 624w, https://yugalab.net/wp-content/uploads/2015/09/20150910_e04-276x300.jpg 276w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /><h3 class="section_title putit_caption l_green">メッシュとアーマチュアのペアリング</h3><br />このままでは、メッシュとアーマチュア(骨格)はそれぞれ独立したオブジェクトでしかありません。<br />このふたつを関連付ける操作をします。<br /><br />オブジェクトモードで、アウトライナーで<span class="bold">Shift + クリック</span>で<span class="l_blue">メッシュとアーマチュアを両方同時に選択</span>します。<br />両方選択した状態で <span class="bold">Ctrl + P</span>を押すと<span class="l_blue">「メッシュとボーンのペアリング」</span>を行うことができます。<a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_f01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2547" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_f01.jpg" alt="20150910_f01" width="624" height="422" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_f01.jpg 624w, https://yugalab.net/wp-content/uploads/2015/09/20150910_f01-300x202.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />今回は「自動のウェイトで」を選択します！なんと！これだけでメッシュがボーンに従って大体は動いてくれるようになります！すばらしい。<br /><br />ペアリングが済んだら、ポーズモードに移行しましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_f02.jpg"><img loading="lazy" class="alignnone size-full wp-image-2548" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_f02.jpg" alt="20150910_f02" width="400" height="228" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_f02.jpg 400w, https://yugalab.net/wp-content/uploads/2015/09/20150910_f02-300x171.jpg 300w" sizes="(max-width: 400px) 100vw, 400px" /></a><br />ポーズモードではボーンを曲げたり移動させたりしても、「ポーズ編集している」とみなされ、<br />ボーンのデフォルト位置や角度が変わるわけではありません。<br /><br />ポーズモードでボーンを回転させてみると…<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_f03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2549" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_f03.jpg" alt="20150910_f03" width="300" height="364" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_f03.jpg 300w, https://yugalab.net/wp-content/uploads/2015/09/20150910_f03-247x300.jpg 247w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />メッシュもいっしょに曲がりました！<br /><br />ボーンを初期位置に戻したい場合は、<br />3Dビュー上で<span class="bold">aキー</span>で全ボーンを選択し、<br /><span class="bold">alt + g</span> で位置、<span class="bold">alt + r</span> で回転、<span class="bold">alt + s</span>で拡縮を元に戻すことができます。<br /><br />ポーズモード(ボーンを選択すると水色になる状態)で、ボーンを回転させたりして、<br />動きを確認してみましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_f04.jpg"><img loading="lazy" class="alignnone size-full wp-image-2550" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_f04.jpg" alt="20150910_f04" width="500" height="286" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150910_f04.jpg 500w, https://yugalab.net/wp-content/uploads/2015/09/20150910_f04-300x171.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />いろんなポーズができちゃいます！楽しい！<br /><br />この次は、ボーンの動きの状態を登録したものを繋げて作る「アニメーション」についてお伝えしたいと思います。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150910_next.gif"><img loading="lazy" class="alignnone size-full wp-image-2551" src="https://yugalab.net/wp-content/uploads/2015/09/20150910_next.gif" alt="20150910_next" width="205" height="306" /></a></p><p>The post <a href="https://yugalab.net/archives/2446">【Blender】メッシュにボーン(Armature)を入れてポーズ変更できるようにする</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://yugalab.net/archives/2446/feed</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>【Blender】Sculptrisで作成したモデルをBlenderへインポートする</title>
		<link>https://yugalab.net/archives/2395</link>
					<comments>https://yugalab.net/archives/2395#comments</comments>
		
		<dc:creator><![CDATA[ユーリ]]></dc:creator>
		<pubDate>Fri, 04 Sep 2015 03:00:17 +0000</pubDate>
				<category><![CDATA[Blender]]></category>
		<category><![CDATA[technical]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[Sculptris]]></category>
		<guid isPermaLink="false">http://yugalab.net/?p=2395</guid>

					<description><![CDATA[<p>お仕事関連のメモがてら、3Dソフトのtipsをお送りいたします。Suclptrisとは、粘土をこねるように3Dモデリングが簡単にできるモデリングソフトです！フリーソフトですので、ご興味のある方は、是非触れてみてください！ [&#8230;]</p>
<p>The post <a href="https://yugalab.net/archives/2395">【Blender】Sculptrisで作成したモデルをBlenderへインポートする</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>お仕事関連のメモがてら、3Dソフトのtipsをお送りいたします。<br /><span id="more-2395"></span><br />Suclptrisとは、粘土をこねるように3Dモデリングが簡単にできるモデリングソフトです！<br /><a href="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_a01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2134" src="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_a01.jpg" alt="2015_3Dpresent_a01" width="300" height="203" /></a><br />フリーソフトですので、ご興味のある方は、是非触れてみてください！<br /><br />モデリング操作方法の簡単な解説は、こちら↓の記事で触れていますので今回は割愛します。<br /><a href="https://yugalab.net/archives/1651" target="_blank" class="bg_pleasure minipost_link_wrap hover_fade clearfix"><div class="minipost_link_img"><img width="300" height="185" src="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_thumb.jpg" class="minipost_link_img_inner" alt="" loading="lazy" /></div><div class="minipost_link_title"><span class="l_gray f080">ユガラボ | 2015/08/19</span><br />3Dプリンターで誕生日プレゼントを作った話</div></a><br /><h3 class="section_title putit_caption l_green">Sculptrisでモデル作製</h3><br /><span class="f120">まずは、モデリングをはじめます。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_a01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2413" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_a01.jpg" alt="20150904_a01" width="624" height="435" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_a01.jpg 624w, https://yugalab.net/wp-content/uploads/2015/09/20150904_a01-300x209.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />よいしょっ<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_a02.jpg"><img loading="lazy" class="alignnone size-full wp-image-2414" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_a02.jpg" alt="20150904_a02" width="624" height="371" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_a02.jpg 624w, https://yugalab.net/wp-content/uploads/2015/09/20150904_a02-300x178.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />できました。</span><br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_a03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2415" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_a03.jpg" alt="20150904_a03" width="624" height="555" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_a03.jpg 624w, https://yugalab.net/wp-content/uploads/2015/09/20150904_a03-300x266.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /><br />Sculptrisで色も塗ってしまう場合は、画面右上のPAINTボタンを押して、ペイント画面へ。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_a04.jpg"><img loading="lazy" class="alignnone size-full wp-image-2416" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_a04.jpg" alt="20150904_a04" width="500" height="179" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_a04.jpg 500w, https://yugalab.net/wp-content/uploads/2015/09/20150904_a04-300x107.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />(ペイント画面へ進むと、モデリングへ戻れないのでご注意ください。)<br /><br /><span class="f120">塗りました。</span><br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_a05.jpg"><img loading="lazy" class="alignnone size-full wp-image-2417" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_a05.jpg" alt="20150904_a05" width="624" height="421" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_a05.jpg 624w, https://yugalab.net/wp-content/uploads/2015/09/20150904_a05-300x202.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />Blenderへモデルを持っていく為に、エクスポートの作業を行います。<br />Show advencedツールをクリックし、<br />SAVE TEXMAPを選択します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_a06.jpg"><img loading="lazy" class="alignnone size-full wp-image-2418" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_a06.jpg" alt="20150904_a06" width="509" height="282" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_a06.jpg 509w, https://yugalab.net/wp-content/uploads/2015/09/20150904_a06-300x166.jpg 300w" sizes="(max-width: 509px) 100vw, 509px" /></a><br />この操作で、テクスチャの書き出しができます。<br />***.pngという拡張子pmgのファイルを保存します。<br /><br />EXPORTを選択し、3Dモデルの書き出しを行います。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_a07.jpg"><img loading="lazy" class="alignnone size-full wp-image-2419" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_a07.jpg" alt="20150904_a07" width="331" height="229" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_a07.jpg 331w, https://yugalab.net/wp-content/uploads/2015/09/20150904_a07-300x207.jpg 300w" sizes="(max-width: 331px) 100vw, 331px" /></a><br />***.objという拡張子objのファイルを保存します。<br /><br />元ファイル1つと書き出したファイル2つが生成できました。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_a08.jpg"><img loading="lazy" class="alignnone size-full wp-image-2420" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_a08.jpg" alt="20150904_a08" width="294" height="173" /></a><br />なお、Sculptrisから<span class="f_red">ファイルを保存するときは、ファイル名は必ず半角にしてください。</span><br />ファイル名に全角文字が含まれていた場合、フリーズするようです。<br /><br /><h3 class="section_title putit_caption l_green">Blenderへインポート</h3><br />Blenderを開き、ファイルからインポート &gt; Wavefront(.obj)を選択し、Sculptrisでエクスポートしたobjファイルを選びます。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_b01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2423" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_b01.jpg" alt="20150904_b01" width="500" height="462" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_b01.jpg 500w, https://yugalab.net/wp-content/uploads/2015/09/20150904_b01-300x277.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />読み込みが完了すると、3Dモデルが画面上に生成されます。<br />3Dモデルは、点と線の集まりで、網目のように見えることから「メッシュ」と呼称します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_b02.jpg"><img loading="lazy" class="alignnone size-full wp-image-2424" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_b02.jpg" alt="20150904_b02" width="300" height="239" /></a><br /><br /><h3 class="section_title putit_caption l_green">座標と縮尺を合わせる</h3><br />読み込んだ直後は、このように座標上の地面よりも下までメッシュがめり込んでしまっています。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_b03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2425" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_b03.jpg" alt="20150904_b03" width="624" height="355" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_b03.jpg 624w, https://yugalab.net/wp-content/uploads/2015/09/20150904_b03-300x170.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />また、サイズもかなり大きめになっているかと思いますので、縮尺も調整しましょう。<br /><h4 class="section_subtitle putit_caption">縮尺合わせ</h4>先に縮尺を合わせます。<br />画面左のツールから「拡大・縮小」を選択するか、もしくはsキーで拡大縮小を行うことができます。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_b04.gif"><img loading="lazy" class="alignnone size-full wp-image-2426" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_b04.gif" alt="20150904_b04" width="300" height="201" /></a><br />キャラクターの場合、デフォルトで生成できる立法体に対してこのくらいの大きさにするといいあんばいだと思います。(アバウトでごめんなさい)<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_b05.jpg"><img loading="lazy" class="alignnone size-full wp-image-2427" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_b05.jpg" alt="20150904_b05" width="450" height="311" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_b05.jpg 450w, https://yugalab.net/wp-content/uploads/2015/09/20150904_b05-300x207.jpg 300w" sizes="(max-width: 450px) 100vw, 450px" /></a><br /><br /><h4 class="section_subtitle putit_caption">位置合わせ</h4>縮尺を合わせたら、位置を合わせます。<br />画面中央下あたりの「グローバル」という座標表記の左にあるテトラなボタンを押すと、<br />オブジェクトの上に赤、青、緑の矢印が表示されますので、矢印を引っ張ることで位置移動ができます。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_add1.gif"><img loading="lazy" class="alignnone size-full wp-image-2464" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_add1.gif" alt="20150904_add1" width="300" height="315" /></a><br />このさい、X方向の中心軸(赤い矢印)はSculptrisからインポートした時点で合っているはずなので、動かさないでください。<br />調整するのはY方向とZ方向です。<br /><br />キャラクターやオブジェクトの基底部分(キャラクターの場合なら足の裏)が<br />中心座標(0,0,0)の上に乗るように移動させましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_c01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2428" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_c01.jpg" alt="20150904_c01" width="624" height="255" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_c01.jpg 624w, https://yugalab.net/wp-content/uploads/2015/09/20150904_c01-300x122.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />位置あわせの際は、テンキーでのカメラ移動を利用しましょう。<br />テンキーの5で透視投影と平行投影とを切り替えることができますが、<br />メッシュが歪まない平行投影での作業がオススメです。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_c02.gif"><img loading="lazy" class="alignnone size-full wp-image-2429" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_c02.gif" alt="20150904_c02" width="300" height="251" /></a><br />位置と縮尺を合わせると、オブジェクト情報の「位置」、「回転」、「拡大縮小」の値が読み込み時のデフォルト値から変化した状態になっています。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_c03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2430" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_c03.jpg" alt="20150904_c03" width="453" height="413" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_c03.jpg 453w, https://yugalab.net/wp-content/uploads/2015/09/20150904_c03-300x273.jpg 300w" sizes="(max-width: 453px) 100vw, 453px" /></a><br />このままだと回転や移動をすると合わせた位置が元に戻ってしまう為、<br />補正後の位置・縮尺状態をデフォルト値として登録しなおす必要があります。<br /><br />メッシュを選択した状態のオブジェクトモードから、<br />オブジェクト &gt; 適用 &gt; 位置、<br />オブジェクト &gt; 適用 &gt; 回転、<br />オブジェクト &gt; 適用 &gt; 拡大縮小<br />をそれぞれ選択してください。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_c04_2.gif"><img loading="lazy" class="alignnone size-full wp-image-2444" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_c04_2.gif" alt="20150904_c04_2" width="400" height="259" /></a><br /><br />これで、合わせた位置と拡大縮小値がデフォルト状態として適用されました。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_c05.jpg"><img loading="lazy" class="alignnone size-full wp-image-2432" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_c05.jpg" alt="20150904_c05" width="453" height="291" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_c05.jpg 453w, https://yugalab.net/wp-content/uploads/2015/09/20150904_c05-300x192.jpg 300w" sizes="(max-width: 453px) 100vw, 453px" /></a><br /><br /><h3 class="section_title putit_caption l_green">テクスチャの適用</h3><br />こちらは、前回記事からの引用になります。<br /><h4 class="section_subtitle putit_caption">テクスチャを持ってくる</h4><span style="color: #66c; background-color: #dadafa; display: block;">Sculptrisのペイントで作ったテクスチャは別データなので、読み込むための操作を行います。<br /><br />画面右側のアウトライナー内で対象オブジェクトを選択(1)し、<br />テクスチャメニュー(2)を選んで、新規(3)から新しいテクスチャを作成します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b05.jpg"><img loading="lazy" class="alignnone size-full wp-image-2152" src="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b05.jpg" alt="2015_3Dpresent_b05" width="624" height="493" srcset="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b05.jpg 624w, https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b05-300x237.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br />新しいテクスチャで出来たら少し下にある「開く」を選んで、Sculptrisで書き出したテクスチャ(png)を取りに行きましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b06.jpg"><img loading="lazy" class="alignnone size-full wp-image-2153" src="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b06.jpg" alt="2015_3Dpresent_b06" width="295" height="638" /></a><br /><br />テクスチャを読み込みましたが、まだ反映はされません。<br /><br />次はビューメニューから「UV Editing」を選択し、UV(テクスチャ)編集用画面に移ります。<br /><a href="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b07.jpg"><img loading="lazy" class="alignnone size-full wp-image-2154" src="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b07.jpg" alt="2015_3Dpresent_b07" width="350" height="303" srcset="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b07.jpg 350w, https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b07-300x259.jpg 300w" sizes="(max-width: 350px) 100vw, 350px" /></a><br /><br /><br />UV Editingモードはこのような二画面構成になります。<br /><a href="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b08.jpg"><img loading="lazy" class="alignnone size-full wp-image-2155" src="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b08.jpg" alt="2015_3Dpresent_b08" width="500" height="403" srcset="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b08.jpg 500w, https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b08-300x241.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />右画面の下の方にある「オブジェクトモード」を「編集モード」に切り替えます。<br /><br /><a href="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b09.jpg"><img loading="lazy" class="alignnone size-full wp-image-2156" src="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b09.jpg" alt="2015_3Dpresent_b09" width="350" height="191" srcset="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b09.jpg 350w, https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b09-300x163.jpg 300w" sizes="(max-width: 350px) 100vw, 350px" /></a><br />編集モードになったら「メッシュ」→「UV展開…」→「展開」を選択します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b10.jpg"><img loading="lazy" class="alignnone size-full wp-image-2157" src="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b10.jpg" alt="2015_3Dpresent_b10" width="500" height="434" srcset="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b10.jpg 500w, https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b10-300x260.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br /><br />ここまででテクスチャを反映する準備ができましたので、今度は左画面の下にある「開く…」を選んで、再びSculptrisで書き出した(.png)のテクスチャファイルを読み込みましょう。<br /><a href="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b11.jpg"><img loading="lazy" class="alignnone size-full wp-image-2159" src="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b11.jpg" alt="2015_3Dpresent_b11" width="350" height="138" srcset="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b11.jpg 350w, https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_b11-300x118.jpg 300w" sizes="(max-width: 350px) 100vw, 350px" /></a><br /><br />そして再びビューメニューを「UV Editing」から「Default」にもどします。<br />シェーダーから「マテリアル」を選択すると…<br /><a href="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_c01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2158" src="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_c01.jpg" alt="2015_3Dpresent_c01" width="350" height="122" srcset="https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_c01.jpg 350w, https://yugalab.net/wp-content/uploads/2015/08/2015_3Dpresent_c01-300x104.jpg 300w" sizes="(max-width: 350px) 100vw, 350px" /></a><br /><br />お見事！やっとテクスチャが反映されました。</span><h4 class="section_subtitle putit_caption">テクスチャ反映後</h4>この時点で影が濃すぎてよくわからない場合は、マテリアルメニューから<br />シェーディングを調整しましょう。<br />「放射」の値を増やすと見やすくなると思います。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_d01.jpg"><img loading="lazy" class="alignnone size-full wp-image-2433" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_d01.jpg" alt="20150904_d01" width="274" height="408" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_d01.jpg 274w, https://yugalab.net/wp-content/uploads/2015/09/20150904_d01-201x300.jpg 201w" sizes="(max-width: 274px) 100vw, 274px" /></a><br /><br />Blenderに持ってきたメッシュに対して、テクスチャを反映することができました。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_d02.jpg"><img loading="lazy" class="alignnone size-full wp-image-2434" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_d02.jpg" alt="20150904_d02" width="624" height="435" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_d02.jpg 624w, https://yugalab.net/wp-content/uploads/2015/09/20150904_d02-300x209.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br /><br /><br />今回はここまでです。<br />次は、アーマチュアを使用したポーズ変更について書きたいと思います。<br /><a href="https://yugalab.net/wp-content/uploads/2015/09/20150904_d03.jpg"><img loading="lazy" class="alignnone size-full wp-image-2435" src="https://yugalab.net/wp-content/uploads/2015/09/20150904_d03.jpg" alt="20150904_d03" width="624" height="394" srcset="https://yugalab.net/wp-content/uploads/2015/09/20150904_d03.jpg 624w, https://yugalab.net/wp-content/uploads/2015/09/20150904_d03-300x189.jpg 300w" sizes="(max-width: 624px) 100vw, 624px" /></a><br />メッシュに骨組みをいれて、メッシュを動かす作業です。</p><p>The post <a href="https://yugalab.net/archives/2395">【Blender】Sculptrisで作成したモデルをBlenderへインポートする</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://yugalab.net/archives/2395/feed</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>【SVG】raphael.jsを使ったらすんごい色々捗った</title>
		<link>https://yugalab.net/archives/1374</link>
					<comments>https://yugalab.net/archives/1374#comments</comments>
		
		<dc:creator><![CDATA[ユーリ]]></dc:creator>
		<pubDate>Thu, 16 Apr 2015 10:00:53 +0000</pubDate>
				<category><![CDATA[svg]]></category>
		<category><![CDATA[technical]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">http://yugalab.net/?p=1374</guid>

					<description><![CDATA[<p>こんにちは、ユーリです！ 少し前、SVGでアニメーションを行う記事を書きましたが、 その後の開発でブラウザ間の挙動の違いや、古いブラウザでうまく動かなかったりと色々と苦労いたしました。 うおー、やはり一定数の古い環境は切 [&#8230;]</p>
<p>The post <a href="https://yugalab.net/archives/1374">【SVG】raphael.jsを使ったらすんごい色々捗った</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></description>
										<content:encoded><![CDATA[<script src="/demo/js/raphael-min.js"></script>
<p>
こんにちは、ユーリです！<br>
少し前、<a href="http://yugalab.net/archives/1154" title="【備忘録】SVGのpathをJavaScriptでぬるぬる動かしたかった"><u>SVGでアニメーションを行う記事</u></a>を書きましたが、<br/>
その後の開発でブラウザ間の挙動の違いや、古いブラウザでうまく動かなかったりと色々と苦労いたしました。<br/>
<br>
<span class="l_green">うおー、やはり一定数の古い環境は切り捨てるしかないのかッ…！対応コードを書けば書くほど煩雑になってゆく！</span><br/>
<br/>
そこに現れた救世主！！<br />
SVG制御用ライブラリ…　<a href="http://raphaeljs.com/" target="_blank"><span class="f_red f150 under" style="background:#DADADA;">Raphael.js</span></a>　っ！！　
<span class="l_blue">↓さんぷる</span>
<div id="post20150415_example_1" style="width:100%;height:200px;" class="sample_run" rel="SVGraphaeljs-Rainbow">
	
</div>
<div class="fold_post">
自前のコードだけでの対応に限界を感じ、ライブラリを使用してめんどくさいところは全部吸収してもらうことにしました。<br/>
まさにうってつけのライブラリが見つかりました！<br/>
それが<span class="f_red bold">raphael.js</span>でございます。<br/><br/>
<br /><h3 class="section_title putit_caption l_green">raphael.jsのココがスゴイ！</h3><br />
<span class="f120 l_blue">■IEやsafqriの古いバージョンでも動作</span><br />
特に何も意識せずとも、raphael.jsからの処理を使ってSVGを操作すれば、古いブラウザでもしっかり表示され、animateも問題なく動作してくれます！<br />
svg要素を直接うごかしていたら、animateが動作しなかったり、変な位置に表示されたりしてしまい、たいへん苦労いたしました。<br />
<span class="f120 l_blue">■jQueryライクな記述で、直感的に要素や値を操作できる</span><br />
jQueryのような値の指定やメソッドチェーンが利用できます。<br/>
jQueryに慣れている方であればすんなり飲み込めるのではないでしょうか。<br/>
<span class="f120 l_blue">■基本的なeventをサポート</span><br />
マウスオーバーやクリックのような処理も、svgの要素単位で実装ができます。<br/>
svg要素はマウス判定の範囲に複雑な形状を利用できるため、リッチな動作を実現できます。<br/>
<br /><h3 class="section_title putit_caption l_green">サンプルコード</h3><br /><h4 class="section_subtitle putit_caption">SVG要素を作成し、図形を描画する</h4>
SVG要素の大きさを指定する方法はいろいろありますが、いろいろ試した結果、<br/>
<span class="under l_blue">divなどのブロック要素で任意の大きさを指定し、その中にsvgをwidth:100%、height:100%で配置する</span>のがいちばん安定しました。<br>
この方法の場合、あとからdiv要素の大きさが変わっても、中身のSVG要素もあわせて伸び縮みしてくれます。<br/>
viewboxでサイズ指定するとさらに堅牢です。<br/>
PCで閲覧している方は、このページを表示しているウィンドウ自体のサイズを変えてみていただけると伸び縮みに対応していることを確認できるハズです。<br/>
<pre class="brush:js highlight:[5,6,7]" title="svgの描画">
<div id="svg_wrap" style="width:100%;height:200px;">
</div>&lt;!--svg配置用のdiv要素--&gt;
&lt;script&gt;
$(function(){
	var paper = Raphael("svg_wrap","100%","100%");	//Raphael()でSVG要素を生成する
					//引数1:生成する対象要素のid　引数2:width 引数3:height
	paper.setViewBox(0,0,600,200,true);	//viewBoxの大きさを指定
	paper.add([		//図形を追加する
		{
			type	: "rect" ,	//四角形を追加
			x		: 10 ,		//X座標
			y		: 70 ,		//Y座標
			width	: 240 ,		//width
			height	: 120 ,		//height
			fill	: "#6E6" ,	//fill = 塗りつぶしの色
			stroke	: "#C33" ,	//stroke = 線の色
			"stroke-width": 5,	//線の太さ
		},
		{
			type	: "circle" ,//円を追加
			cx		: 280 ,		//X座標(circle)
			cy		: 40 ,		//Y座標(circle)
			r		: 80 ,		//半径
			fill	: "#AAF" ,	//fill = 塗りつぶしの色
			stroke	: "#66E" ,	//stroke = 線の色
			"stroke-width": 5,	//線の太さ
		}
	]);
	var tri = paper.path("M350,10 L350,170 L 530,90 Z");	//パスを追加する(三角形)
	tri.attr({	//パス(三角形)のプロパティを変更
		fill	: "#C77" ,
		stroke	: "#F33" ,
		opacity	: 0.80	,	//透明度
		"stroke-width" : 10, //線の太さ
	});
});
&lt;/script&gt;
</pre>
<br />
上記のコードで、このように表示されます。
<div id="post20150415_example_2" style="width:100%;height:200px;">
</div>
<br /><h4 class="section_subtitle putit_caption">クリックやマウスオーバーなど、イベントの処理を書く</h4>
SVGを表示できたらぐにぐに動かしたいですよね！<br/>
先ほどようにSVGを生成してから、その要素に対して<span class="l_blue">click、mouseover、mouseout</span>の処理を定義してみます。<br>
SVG要素が複雑な形をしていても、その形の通りに当たり判定が適応されます。<br/>
<pre class="brush:js highlight:[9,18,24]" title="イベント処理部分">
	var paper = Raphael("svg_wrap","100%","100%");
	paper.setViewBox(0,0,600,200,true);	//viewBoxの大きさを指定
	var path = paper.path("M548,95v8H349C347,130,326,150,300,150c-19,0-36-11-45-28c-8,16-25,28-45,28s-36-11-45-28c-8,16-25,28-45,28c-26,0-47-20-49.8-45H50v-8h20C72,70,93,50,120,50c19,0,36,11,45,28c8-16,25-28,45-28s36,11,45,28c8-16,25-28,45-28c26,0,47,20,49,45H548z"); //パスを追加する
	path.attr({	//パスのプロパティを変更
		fill	: "#AAA" ,
		stroke	: "#666" ,
		"stroke-width" : 3, //線の太さ
	});
	path.click(function(){	//クリック時の処理
		var r = Math.floor(Math.random () * 256);	//赤ランダム
		var g = Math.floor(Math.random () * 256);	//緑ランダム
		var b = Math.floor(Math.random () * 256);	//青ランダム
		var color = "rgb("+r+","+g+","+b+")";		//ランダム色生成
		path.attr({	//パスのプロパティを変更
			fill  : color,	//塗りつぶしの色を変える
		});
	});
	path.mouseover(function(){	//マウスオーバー時の処理
		path.attr({	//パスのプロパティを変更
			"stroke-width"  : 8,	//線の太さを変える
			opacity			: 0.8	//透明度を変える
		});
	});
	path.mouseout(function(){	//マウスアウト時の処理
		path.attr({	//パスのプロパティを変更
			"stroke-width"  : 3,	//線の太さを戻す
			opacity			: 1.0	//透明度を戻す
		});
	});
</pre>
上記のコードで、このように表示されます。マウスイベントに対応しています！
<div id="post20150415_example_3" style="width:100%;height:200px;" class="sample_run" rel="SVGraphaeljs-ODANGO-colors">
</div>
<br /><h4 class="section_subtitle putit_caption">アニメーションを行う</h4>
前回のSVGの記事で苦労してアニメーション処理を書きましたが、<span class="f_red">raphael.js</span>にかかれば、非常に簡単にアニメーション処理ができてしまいます；；<br/>
記述方法は<span class="l_blue">jQueryのanimate</span>とほぼ同じで、アニメーションさせるプロパティにsvg要素の色や座標を指定すればOKです。<br/>
<pre class="brush:js highlight:[2,5]" title="イベント処理部分">
	path.mouseover(function(){	//マウスオーバー時の処理
		path.animate({path:"M548,95v8H349c-54,7-23,2-49,2c-19.8,0-18,2-45,2c-25,2-25-1-45-1s-19,3-45-1c-27,5-25-1-45-1c-26,0-13,5-49-0.6H50v-8h20c31-2,23-1,49-1c19,0,17-11,45-0.8c25-3,25-3,45-3s22-3,45,3c29-4,25-1.2,45-1c26,0,27-0.7,49,3H548z"},250);	//パスの形を変更
	});
	path.mouseout(function(){	//マウスアウト時の処理
		path.animate({path:"M548,95v8H349C347,130,326,150,300,150c-19,0-36-11-45-28c-8,16-25,28-45,28s-36-11-45-28c-8,16-25,28-45,28c-26,0-47-20-49-45H50v-8h20C72,70,93,50,120,50c19,0,36,11,45,28c8-16,25-28,45-28s36,11,45,28c8-16,25-28,45-28c26,0,47,20,49,45H548z"},100);	//パスの形を戻す
	});
</pre>
マウスオーバーでアニメーションします！
<div id="post20150415_example_4" style="width:100%;height:200px;" class="sample_run" rel="SVGraphaeljs-ODANGO-eat">
</div>
この前の苦労はなんだったのか…。<br/>
<br /><h4 class="section_subtitle putit_caption">集合要素に対して処理を行う</h4>
要素をたくさん並べて処理をしたい場合、<span class="l_blue f120">set</span>という配列のようなクラスを使用して、<span class="l_blue">forEach</span>でそれぞれの要素に対してまとめて処理を行うことができます。<br/>
<pre class="brush:js highlight:[9]" title="forEachでまとめて処理">
	var paper = Raphael("svg_wrap","100%","100%");
	paper.setViewBox(0,0,600,200,true);	//viewBoxの大きさを指定
	var rectarray = paper.set();		//svg要素の集合を格納する"set"を作成
	for( var i = 0, j = 20; i < j ; i++ ){	//20回繰り返す
		rectarray.push(						//setに対してsvg要素を追加する
			paper.rect(i*(j+10),100,20,80)	//paperの中に四角形を作成(x,y,w,h)
		);
	}
	rectarray.forEach(function(e,i){		//setの中身の要素それぞれに対して処理(element,index)
		e.attr({	//プロパティを変更
			fill	: "#8CC" ,	//塗りつぶしの色
		});
		e.mouseover(function(){	//マウスオーバー時の処理
			if( e.attr("y") == 0 ){	//yの値が0の場合
				e.animate({y:100,fill:"#88C"},200,"<>");	//下に移動するアニメーション
			}else{					//yの値が0でない場合
				e.animate({y:0,fill:"#C88"},200,"<>");	//上に移動するアニメーション
			}
		});
	});
</pre>
マウスオーバーでアニメーションします！
<div id="post20150415_example_5" style="width:100%;height:200px;" class="sample_run" rel="SVGraphaeljs-DOMINO">
</div>
やっぱりSVGはなめらかでたのしい！<br/>
これくらい手軽に扱えれば、どんどん夢が広がっていきます！<br/>

</div>
<script>
var post20150415_example_1_svg,post20150415_example_1_children;
var post20150415_example_width = 624;
var post20150415_example_height = 150;
var post20150415_example_funcount = 0;
$(function(){
	post20150415_example_1_svg = Raphael("post20150415_example_1","100%","100%");
	post20150415_example_1_svg.setViewBox(0,0,post20150415_example_width,post20150415_example_height,true);
	post20150415_example_1_children = post20150415_example_1_svg.set();
	for( var i = 0, j = 100; i < j ; i++ ){
		var rect_w = post20150415_example_width / j;
		var rect_h = post20150415_example_height / 2;
		post20150415_example_1_children.push(
			post20150415_example_1_svg.rect(rect_w*i,rect_h/2,rect_w,rect_h)
		);
	}
	post20150415_paintset(post20150415_example_1_children);
	$(window).load(function(){
		post20150415_animateset(post20150415_example_1_children);
		post20150415_eventset(post20150415_example_1_children);
		$(window).bind("focus",function(){
			post20150415_example_1_children.forEach(function(e,i){
				var rect_w = post20150415_example_width / 100;
				var rect_h = post20150415_example_height / 2;
				e.stop();
				e.attr({x:rect_w*i,y:rect_h*0.5,width:rect_w,height:rect_h});
			});
			post20150415_animateset(post20150415_example_1_children);
			post20150415_example_funcount = 0;
		});
		post20150415_example1();	//サンプル1を起動
		post20150415_example2();	//サンプル2を起動
		post20150415_example3();	//サンプル3を起動
		post20150415_example4();	//サンプル4を起動
	});
	
	
});

function post20150415_example1(){
	var paper = Raphael("post20150415_example_2","100%","100%");	//Raphael()でSVG要素を生成する
					//引数1:生成する対象要素のid　引数2:width 引数3:height
	paper.setViewBox(0,0,600,200,true);	//viewBoxの大きさを指定
	paper.add([		//図形を追加する
		{
			type	: "rect" ,	//四角形を追加
			x		: 10 ,		//X座標
			y		: 70 ,		//Y座標
			width	: 240 ,		//width
			height	: 120 ,		//height
			fill	: "#6E6" ,	//fill = 塗りつぶしの色
			stroke	: "#C33" ,	//stroke = 線の色
			"stroke-width": 5,	//線の太さ
		},
		{
			type	: "circle" ,//円を追加
			cx		: 280 ,		//X座標(circle)
			cy		: 40 ,		//Y座標(circle)
			r		: 80 ,		//半径
			fill	: "#AAF" ,	//fill = 塗りつぶしの色
			stroke	: "#66E" ,	//stroke = 線の色
			"stroke-width": 5,	//線の太さ
		}
	]);
	var tri = paper.path("M350,10 L350,170 L 530,90 Z");	//パスを追加する(三角形)
	tri.attr({	//パス(三角形)のプロパティを変更
		fill	: "#C77" ,
		stroke	: "#F33" ,
		opacity	: 0.80	,	//透明度
		"stroke-width" : 10, //線の太さ
	});
}
function post20150415_example2(){
	var paper = Raphael("post20150415_example_3","100%","100%");
	paper.setViewBox(0,0,600,200,true);	//viewBoxの大きさを指定
	var path = paper.path("M548,95v8H349C347,130,326,150,300,150c-19,0-36-11-45-28c-8,16-25,28-45,28s-36-11-45-28c-8,16-25,28-45,28c-26,0-47-20-49-45H50v-8h20C72,70,93,50,120,50c19,0,36,11,45,28c8-16,25-28,45-28s36,11,45,28c8-16,25-28,45-28c26,0,47,20,49,45H548z"); //パスを追加する
	path.attr({	//パスのプロパティを変更
		fill	: "#AAA" ,
		stroke	: "#666" ,
		"stroke-width" : 3, //線の太さ
	});
	path.click(function(){	//クリック時の処理
		var r = Math.floor(Math.random () * 256);	//赤ランダム
		var g = Math.floor(Math.random () * 256);	//緑ランダム
		var b = Math.floor(Math.random () * 256);	//青ランダム
		var color = "rgb("+r+","+g+","+b+")";		//ランダム色生成
		path.attr({	//パスのプロパティを変更
			fill  : color,	//塗りつぶしの色を変える
		});
	});
	path.mouseover(function(){	//マウスオーバー時の処理
		path.attr({	//パスのプロパティを変更
			"stroke-width"  : 8,	//線の太さを変える
			opacity			: 0.8	//透明度を変える
		});
	});
	path.mouseout(function(){	//マウスアウト時の処理
		path.attr({	//パスのプロパティを変更
			"stroke-width"  : 3,	//線の太さを戻す
			opacity			: 1.0	//透明度を戻す
		});
	});
}
function post20150415_example3(){
	var paper = Raphael("post20150415_example_4","100%","100%");
	paper.setViewBox(0,0,600,200,true);	//viewBoxの大きさを指定
	var path = paper.path("M548,95v8H349C347,130,326,150,300,150c-19,0-36-11-45-28c-8,16-25,28-45,28s-36-11-45-28c-8,16-25,28-45,28c-26,0-47-20-49-45H50v-8h20C72,70,93,50,120,50c19,0,36,11,45,28c8-16,25-28,45-28s36,11,45,28c8-16,25-28,45-28c26,0,47,20,49,45H548z"); //パスを追加する
	path.attr({	//パスのプロパティを変更
		fill	: "#ED842E" ,
		stroke	: "#321C00" ,
		"stroke-width" : 3, //線の太さ
	});
	path.mouseover(function(){	//マウスオーバー時の処理
		path.animate({path:"M548,95v8H349c-54,7-23,2-49,2c-19.8,0-18,2-45,2c-25,2-25-1-45-1s-19,3-45-1c-27,5-25-1-45-1c-26,0-13,5-49-0.6H50v-8h20c31-2,23-1,49-1c19,0,17-11,45-0.8c25-3,25-3,45-3s22-3,45,3c29-4,25-1.2,45-1c26,0,27-0.7,49,3H548z"},250);	//パスの形を変更
	});
	path.mouseout(function(){	//マウスアウト時の処理
		path.animate({path:"M548,95v8H349C347,130,326,150,300,150c-19,0-36-11-45-28c-8,16-25,28-45,28s-36-11-45-28c-8,16-25,28-45,28c-26,0-47-20-49-45H50v-8h20C72,70,93,50,120,50c19,0,36,11,45,28c8-16,25-28,45-28s36,11,45,28c8-16,25-28,45-28c26,0,47,20,49,45H548z"},100);	//パスの形を戻す
	});
}
function post20150415_example4(){
	var paper = Raphael("post20150415_example_5","100%","100%");
	paper.setViewBox(0,0,600,200,true);	//viewBoxの大きさを指定
	var rectarray = paper.set();		//svg要素の集合を格納する"set"を作成
	for( var i = 0, j = 20; i < j ; i++ ){	//20回繰り返す
		rectarray.push(						//setに対してsvg要素を追加する
			paper.rect(i*(j+10),100,20,80)	//paperの中に四角形を作成(x,y,w,h)
		);
	}
	rectarray.forEach(function(e,i){		//setの中身の要素それぞれに対して処理(element,index)
		e.attr({	//プロパティを変更
			fill	: "#8CC" ,	//塗りつぶしの色
		});
		e.mouseover(function(){	//マウスオーバー時の処理
			if( e.attr("y") == 0 ){	//yの値が0の場合
				e.animate({y:100,fill:"#88C"},200,"<>");	//下に移動するアニメーション
			}else{					//yの値が0でない場合
				e.animate({y:0,fill:"#C88"},200,"<>");		//上に移動するアニメーション
			}
		});
	});
}

function post20150415_paintset(set){
	var r = 240;
	var g = 90;
	var b = 80;
	var cnt = -1;
	set.forEach(function(e,i){
		cnt ++;
		if( cnt <= 15 ){		b+= 10;	
		}else if( cnt <= 30 ){	r-= 10;
		}else if( cnt <= 45 ){	g+= 10;
		}else if( cnt <= 60 ){	b-= 10;
		}else if( cnt <= 75 ){	r+= 10;
		}else{	g-= 10;
		}if( cnt >= 90 ){	cnt = -1;	}
		var color = "rgb("+r+","+g+","+b+")";	//れいんぼーー！
		e.attr({
			stroke	: color	,
			fill	: color ,
			opacity	: 0.85	,
			"stroke-width" : 1,
		});
		e.node.setAttribute('class','post20150415_rect');
	});
	$(".post20150415_rect").css("cursor","pointer");
}
function post20150415_animateset(set){
	set.forEach(function(e,i){
		var updn = function(){
			if( post20150415_example_funcount != 0 ){return false};
			if( e.attr("y") == 0 ){
				e.animate({y:50},3000,"<>",updn);
			}else{
				e.animate({y:0},3000,"<>",updn);
			}
		};
		setTimeout(updn,i*35);
	});
}
function post20150415_eventset(set){
	set.forEach(function(e,i){
		e.mouseover(function(){
			if(post20150415_example_funcount!=2){e.toFront();}
			e.animate({ "stroke-width" : 30 , opacity : 1.0}, 30);
		}).mouseout(function(){
			if(post20150415_example_funcount!=2){e.toBack();}
			e.animate({ "stroke-width" : 1  , opacity : 0.85}, 500);
		}).click(post20150415_rainbow);
	});
}
function post20150415_rainbow(){
	switch(post20150415_example_funcount){
		case 0:
			post20150415_example_1_children.forEach(function(e,i){
				var move = function(){
					e.stop().toFront();
					e.animate({ x : (i%10*62.4), 
								y : Math.floor(i*0.1)*15 ,
								width : 62.4 , height : 15,
								"stroke-width" : 1
								},250);
				};
				setTimeout(move,i*15);
			});
		break;
		case 1:
			post20150415_example_1_children.forEach(function(e,i){
				var move = function(){
					e.stop().toFront();
					e.animate({ x : 0, 
								y : i*1.5 ,
								width : 624 , height : 1.5,
								opacity	: 0.85, "stroke-width" : 1
								},250);
				};
				setTimeout(move,i*15);
			});
		break;
		case 2:
			post20150415_example_1_children.forEach(function(e,i){
				var move = function(){
					e.stop().toFront();
					e.animate({ x : (i*6.24%124.8)*5, 
								y : Math.floor(i*0.05)*30 ,
								width : 31.2 , height : 30,
								opacity	: 0.85, "stroke-width" : 1
								},250);
				};
				setTimeout(move,i*15);
			});
		break;
		case 3:
		default:
			post20150415_example_1_children.forEach(function(e,i){
				var rect_w = post20150415_example_width * 0.01;
				var rect_h = post20150415_example_height * 0.5;
				e.stop();
				var move = function(){
					e.stop().toFront();
					e.animate({ x : i*6.24, 
								y : 50 ,
								width : 6.24 , height : 75,
								opacity	: 0.85, "stroke-width" : 1
								},250,function(){
									if( i == 99 ){
										post20150415_example_funcount = 0;
										post20150415_animateset(post20150415_example_1_children);
									}
					});
				};
				setTimeout(move,i*15);
			});
		break;
	}
	post20150415_example_funcount++;
}
</script>
</p><p>The post <a href="https://yugalab.net/archives/1374">【SVG】raphael.jsを使ったらすんごい色々捗った</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://yugalab.net/archives/1374/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>【備忘録】SVGのpathをJavaScriptでぬるぬる動かしたかった</title>
		<link>https://yugalab.net/archives/1154</link>
					<comments>https://yugalab.net/archives/1154#respond</comments>
		
		<dc:creator><![CDATA[ユーリ]]></dc:creator>
		<pubDate>Wed, 18 Mar 2015 08:10:45 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[svg]]></category>
		<category><![CDATA[technical]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">http://yugalab.net/?p=1154</guid>

					<description><![CDATA[<p>ぬるんぬるん！ぐねんぐねん！ こちらは、最近流行りのSVG！gif画像ではありません。クリックして色を変えるなどの処理がリアルタイムで行えます。 IEやsafariなど一部のブラウザではうまく動作しないかもしれません。ゴ [&#8230;]</p>
<p>The post <a href="https://yugalab.net/archives/1154">【備忘録】SVGのpathをJavaScriptでぬるぬる動かしたかった</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>
ぬるんぬるん！ぐねんぐねん！<br />
<div style="max-width:624px;max-height:200px;">
<svg version="1.1" id="svg_20150312_1" class="svg_20150312"  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 624 200" enable-background="new 0 0 624 200" xml:space="preserve">
<path fill="#8FC31F" d="M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s22.1-49.3,49.3-49.3S152.7,101.4,152.7,128.7z" onclick="this.style.fill=this.style.fill=='rgb(243, 207, 215)'?'#8FC31F':'#F3CFD7';" class="sample_run" rel="SVGぐにぐにTOP">
<animate dur="2.4s" attributeName="d" values="M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s22.1-49.3,49.3-49.3S152.7,101.4,152.7,128.7z;
M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s22.1-49.3,49.3-49.3S152.7,101.4,152.7,128.7z;
M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s72.1-49.3,99.3-49.3S152.7,101.4,152.7,128.7z;
M202.7,128.7c0,27.2-72.1,49.4-99.3,49.4s0.7-22.2,0.7-49.4s72.1-49.3,99.3-49.3S202.7,101.4,202.7,128.7z;
M222.7,158.7c0,27.2-52.1,19.4-79.3,19.4s-19.3-52.2-19.3-79.4s52.1-19.3,79.3-19.3S222.7,131.4,222.7,158.7z;
M316.7,65c0,27.2-132.1,109.4-159.3,109.4s10.7-62.2,10.7-89.4s82.1-59.3,109.3-59.3S316.7,37.7,316.7,65z;
M392.7,85c0,27.2-132.1,29.4-159.3,29.4s32.7-36.2,32.7-63.4s50.1-25.3,77.3-25.3S392.7,57.7,392.7,85z;
M447.7,84c0,27.2-94.1,13.4-121.3,13.4s-27.2-15.3-15.3-57.4s50.1-25.3,77.3-25.3S447.7,57.3,447.7,84.6z;
M498.7,78.6c0,27.2-24.1,63.4-51.3,63.4s-27.2-30.2-65.3-57.4s0.1-45.3,27.3-45.3 S498.7,51.3,498.7,78.6z;
M534.7,96.9c0,27.2-4.1,78.4-31.3,78.4s-27.2-32.2-67.3-59.4s-5.9-53.3,21.3-53.3 S534.7,69.7,534.7,96.9z;
M558.7,130.6c0,27.2-25.1,47.4-52.3,47.4s-55.3-15.2-55.3-42.4s4.1-47.3,31.3-47.3 S558.7,103.3,558.7,130.6z;
M559.7,130.6c0,27.2-25.1,47.4-52.3,47.4s-52.3-20.2-52.3-47.4s24.1-49.3,51.3-49.3 S559.7,103.3,559.7,130.6z;
M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s22.1-49.3,49.3-49.3S152.7,101.4,152.7,128.7z"  repeatCount="indefinite" />
</path>
</svg>
</div>
こちらは、最近流行りのSVG！gif画像ではありません。<br />クリックして色を変えるなどの処理がリアルタイムで行えます。<br />
<span class="f080 f_red">IEやsafariなど一部のブラウザではうまく動作しないかもしれません。ゴメンナサイ。</span><br/>
これをjavascriptで制御しようとしたところ、いろいろ大変だった話。<br />

<div class="fold_post">
	<br />
	<span class="f_red f080">※この記事は、SVGが動作する環境の方へ向けて書いています。動かない方はゴメンナサイ。</span><br />
	<br />
	SVGは、ドットの集まりではなく、<span class="f_red">パス(点と線)</span>の集まりである為、解像度は無限大です！<br/>
	また、パスの値は数値で書かれていて、ページが表示されてからでも、パスの値を調節すれば、見た目をぐにぐに変えちゃったりもできます！<br/>
	ただし、現時点ではブラウザによって対応していない環境があったり、大きさの指定がややこしかったりと、いろいろ課題もございます。<br/>
	<br/>
	今回は、どうしてもSVGをぬるぬる動かしたい！という案件がございまして、工数はかかりましたが、なんとか要件を満たすことができました。<br/>
	拙いやり方でしたが、とりあえず備忘録として書いておきます。<br/>
	<br/>
	今回は、こちらのSVGを例にご説明いたします。<br/>
	<div style="max-width:180px;max-height:180px;">
	<svg version="1.1" class="svg_20150312" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
	 y="0px" viewBox="0 0 180 180" enable-background="new 0 0 180 180" xml:space="preserve">
	<path fill="#8ABA29" d="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z"/>
	</svg>
	</div>
	このSVGのソースはこちらになります。<br/>
	<pre class="brush:html" title="SVGソース・緑円(パス)">
	&lt;svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
	 y="0px" viewBox="0 0 180 180" enable-background="new 0 0 180 180" xml:space="preserve"&gt;
		&lt;path fill="#88BB33" d="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z" &gt;
		&lt;/path&gt;
	&lt;/svg&gt;
	</pre>
	これを別のhtmlページにコピペすると、上に表示されている緑色の円がそっくりそのまま表示されるはずです。<br/>
	とてもシンプルな構造ですよね！<br/>
	<br/>
	このソースの中には、図形を表すための<span class="l_blue">図形の頂点の位置</span>、<span class="l_blue">図形の線の太さや塗りつぶしの色</span>、などが書かれています。<br/>
<a href="https://yugalab.net/wp-content/uploads/2015/03/20150313_1.jpg"><img loading="lazy" src="https://yugalab.net/wp-content/uploads/2015/03/20150313_1.jpg" alt="20150313_1" width="280" height="180" class="alignnone size-full wp-image-1195" /></a><br/>
	ブラウザはこれを読んで描画を行うわけです。<br/>
	例えば、この例の場合、<span class="l_blue">円の形(点と線の集まり)</span>を表しているのはこの部分です。↓<br/>
	<span class="l_blue f080">d=&#8221;M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z&#8221;</span><br/>
	そして、この中に書かれている点の位置を書きかえてしまえば、その場で表示を変えることができる、という寸法です。<br/>
	<br /><h3 class="section_title putit_caption l_green">ここまで前置き。詳しい説明に移ります。</h3><br /><br />
	SVG要素を動的に変更したい場合は、<span class="l_blue">animateタグを</span>使用する、もしくは<span class="l_blue">JavaScriptで直接値を打ち込む</span>、などの方法がございます。<br/>
	まずは、animateタグについて。<br/>
	animateタグの中身には、変更したい<span class="l_blue">要素名</span>と、<span class="l_blue">値</span>、<span class="l_blue">動作スピード</span>、<span class="l_blue">動作条件</span>などを記載します。<br/>
	<pre class="brush:html" title="animateタグの例">
		&lt;animate attributeName="fill" 
					values="#88BB33;#CC6699"
					dur="2.0s"
					repeatCount="indefinite" &gt;
	</pre>
	上記の例では、<br />
	<span class="l_blue">[attributeName]…「fill」</span>という<span class="l_red">要素</span>、この場合<span class="l_red">fill</span>なので<span class="l_red">塗りつぶしの色</span>を、<br />
	<span class="l_blue">[values]…「#88BB33;#CC6699」</span>すなわち<span class="l_red">#88BB33から#CC6699</span>に、<br />
	<span class="l_blue">[dur]…「2.0s」</span><span class="l_red">2秒間かけて変化</span>させる。という命令が書いてあります。<br/>
	また、繰り返し回数<span class="l_blue">[repeatCount]…「indefinite」</span>で、<span class="l_red">アニメーションを無限に繰り返す</span>という指定をしました。<br/>
	<br/>
	このタグをどこに書くかというと、アニメーションさせたいSVG要素の内側に書きます。<br/>
	こんな感じ。
	<pre class="brush:html highlight:[4,5,6,7]" title="animateタグ(fillの変化)">
	&lt;svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
	 y="0px" viewBox="0 0 180 180" enable-background="new 0 0 180 180" xml:space="preserve"&gt;
		&lt;path fill="#88BB33" d="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z" &gt;
			&lt;animate attributeName="fill" 
					values="#88BB33;#CC6699"
					dur="2.0s"
					repeatCount="indefinite" &gt;
		&lt;/path&gt;
	&lt;/svg&gt;
	</pre>
	<br/>
	これを実際に実行したものがこちら。
	<div style="max-width:180px;max-height:180px;">
	<svg version="1.1" class="svg_20150312" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
	 y="0px" viewBox="0 0 180 180" enable-background="new 0 0 180 180" xml:space="preserve">
	<path fill="#8ABA29" d="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z">
		<animate attributeName="fill" values="#88BB33;#CC6699" dur="2.0s" repeatCount="indefinite">
	</path>
	</svg>
	</div>
	色が緑から赤にだんだんと変わっています。<br/>
	延々と変わっています。<br/>
	<br/>
	これくらいなら簡単な変化でありますが、この<span class="l_blue">animateタグは、pathの形状の変化にも使えてしまう</span>のです。<br/>
	<br />
	そのためには、pathについて<span class="l_blue">「動作前の状態」</span>と<span class="l_blue">「動作後の状態」</span>を用意する必要があるわけです。<br/>
	ということで<span class="l_blue">Adobe Illustrator</span>にてパス形状を編集する画面を例にいたします。<br/>
	<span class="l_gray">(SVGを書き出せるソフトウェアでしたら、他のものでも構いません。)</span><br/>
	こちらが、<span class="l_blue">動作前の状態</span>とします。<br />
<a href="https://yugalab.net/wp-content/uploads/2015/03/20150313_2.jpg"><img loading="lazy" src="https://yugalab.net/wp-content/uploads/2015/03/20150313_2.jpg" alt="20150313_2" width="423" height="261" class="alignnone size-full wp-image-1196" srcset="https://yugalab.net/wp-content/uploads/2015/03/20150313_2.jpg 423w, https://yugalab.net/wp-content/uploads/2015/03/20150313_2-300x185.jpg 300w" sizes="(max-width: 423px) 100vw, 423px" /></a><br/>
	次が、<span class="l_blue">動作後の状態</span>とします。<br />
<a href="https://yugalab.net/wp-content/uploads/2015/03/20150313_3.jpg"><img loading="lazy" src="https://yugalab.net/wp-content/uploads/2015/03/20150313_3.jpg" alt="20150313_3" width="423" height="261" class="alignnone size-full wp-image-1197" srcset="https://yugalab.net/wp-content/uploads/2015/03/20150313_3.jpg 423w, https://yugalab.net/wp-content/uploads/2015/03/20150313_3-300x185.jpg 300w" sizes="(max-width: 423px) 100vw, 423px" /></a><br/>
	それぞれ、<span class="l_blue">別名で保存</span>から<span class="l_blue">svgとして保存</span>します。<br />
<a href="https://yugalab.net/wp-content/uploads/2015/03/20150313_4.jpg"><img loading="lazy" src="https://yugalab.net/wp-content/uploads/2015/03/20150313_4.jpg" alt="20150313_4" width="423" height="261" class="alignnone size-full wp-image-1198" srcset="https://yugalab.net/wp-content/uploads/2015/03/20150313_4.jpg 423w, https://yugalab.net/wp-content/uploads/2015/03/20150313_4-300x185.jpg 300w" sizes="(max-width: 423px) 100vw, 423px" /></a><br/>
	そして、保存したSVGファイルをテキストエディタで開きます。<br />
	図形の形状を表すpathの中の<span class="l_blue">&#8220;d&#8221;の値</span>がそれぞれ違うことが確認できます。<br />
<a href="https://yugalab.net/wp-content/uploads/2015/03/20150313_5.jpg"><img loading="lazy" src="https://yugalab.net/wp-content/uploads/2015/03/20150313_5.jpg" alt="20150313_5" width="578" height="129" class="alignnone size-full wp-image-1199" srcset="https://yugalab.net/wp-content/uploads/2015/03/20150313_5.jpg 578w, https://yugalab.net/wp-content/uploads/2015/03/20150313_5-300x66.jpg 300w" sizes="(max-width: 578px) 100vw, 578px" /></a>
<br/>
	<span class="l_blue">動作前の&#8221;d&#8221;:<br/>
	<span class="f080">M<span class='f_red'>124</span>,89c0,27-<span class='f_red'>22</span>,49-<span class='f_red'>49</span>,49s-49-22-49-49S47,40,75,40.6S<span class='f_red'>124</span>,62,<span class='f_red'>124</span>,89z</span></span><br/>
	<span class="l_blue">動作後の&#8221;d&#8221;:<br/>
	<span class="f080">M<span class='f_red'>154</span>,89c0,27-<span class='f_red'>52</span>,49-<span class='f_red'>79</span>,49s-49-22-49-49S47,40,75,40.6S<span class='f_red'>154</span>,62,<span class='f_red'>154</span>,89z</span></span><br/>
	この&#8221;d&#8221;の中身の値を抽出して、animateタグに打ち込めば良いわけです！<br />
	animateタグの<span class="l_blue">[attributeName]</span>の中身を、図形の形状を表す<span class="l_blue">&#8220;d&#8221;</span>に変更し、<br/>
	実際に変化する値である、<span class="l_blue">[values]</span>の中身に動作前、動作後の<span class="l_blue">パス形状</span>を&#8221;;&#8221;セミコロンで区切って入力。<br/>
	こんなタグになりました。<br />
	<pre class="brush:html highlight:[4,5]" title="animateタグ(path / d の変化)">
	&lt;svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
	 y="0px" viewBox="0 0 180 180" enable-background="new 0 0 180 180" xml:space="preserve"&gt;
		&lt;path fill="#88BB33" d="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z" &gt;
			&lt;animate attributeName="d" 
					values="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z;
							M154,89c0,27-52,49-79,49s-49-22-49-49S47,40,75,40.6S154,62,154,89z"
					dur="1.2s"
					repeatCount="indefinite" &gt;
		&lt;/path&gt;
	&lt;/svg&gt;
	</pre>
	動作させてみます。<br/>
	ぬるっと動きました！<br/>
	<div style="max-width:180px;max-height:180px;">
		<svg version="1.1" class="svg_20150312" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
 y="0px" viewBox="0 0 180 180" enable-background="new 0 0 180 180" xml:space="preserve">
    <path fill="#88BB33" d="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z" >
        <animate attributeName="d"
                values="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z;M154,89c0,27-52,49-79,49s-49-22-49-49S47,40,75,40.6S154,62,154,89z"
                dur="1.2s"
                repeatCount="indefinite" >
		</path>
		</svg>
	</div>
	しかし、このままでは延々とアニメーションしてしまいます。<br />
	そこで、アニメーションの動作を制御する<span class="l_blue">begin</span>要素を追加します。<br />
	<span class="l_blue">begin=&#8221;indefinite&#8221;</span>とすることで、animateの<span class="l_blue">動作タイミングをJavaScriptで制御</span>できます。<br />
	さらに繰り返し回数<span class="l_blue">[repeatCount]…「1」</span>と設定することで、動作回数を1度だけとします。<br/>
	そしてこのanimateタグにidを付与します。<br />
	また、この後の動作のためにpathのタグにもidを付与しておきます。<br />
	<pre class="brush:html highlight:[3,8,9,10]" title="animateタグ(path / d の変化)">
	&lt;svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
	 y="0px" viewBox="0 0 180 180" enable-background="new 0 0 180 180" xml:space="preserve"&gt;
		&lt;path id="circle_path" 
			fill="#88BB33" d="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z" &gt;
			&lt;animate attributeName="d" 
					values="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z;M154,89c0,27-52,49-79,49s-49-22-49-49S47,40,75,40.6S154,62,154,89z"
					dur="1.2s"
					repeatCount="1" 
					begin="indefinite" 
					id="circle_animate" &gt;
		&lt;/path&gt;
	&lt;/svg&gt;
	</pre>
	そして、JavaScriptからidをもとにanimateタグをゲットし、<br />
	<span class="l_blue">beginElement();</span>を呼ぶことで、アニメーションを動作させることができます！<br />
	<pre class="brush:js" title="animateタグ(path / d の変化):JavaScript側">
		//アニメを動作させる
		var animate = document.getElementById('circle_animate');
		animate.beginElement();
	</pre>
	ボタンクリックで、<span class="l_blue">beginElement();</span>を呼ぶようにしてみました。<br/>
	<div style="max-width:180px;max-height:180px;">
		<svg version="1.1" class="svg_20150312" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
 y="0px" viewBox="0 0 180 180" enable-background="new 0 0 180 180" xml:space="preserve">
    <path fill="#88BB33" d="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z" >
        <animate attributeName="d"
                values="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z;M154,89c0,27-52,49-79,49s-49-22-49-49S47,40,75,40.6S154,62,154,89z"
                dur="1.2s"
                repeatCount="1"
				begin="indefinite" 
				id="post20150313_circle_animate">
		</path>
		</svg>
	</div>
	<div style="text-align:center;width:30%;">
		<span class="exsample_20150313_button sample_run" style="cursor:pointer;" onclick="document.getElementById('post20150313_circle_animate').beginElement();" rel="SVGぐにぐにボタンアニメ">
			クリック！
		</span>
	</div>
	<br/>
	クリックでアニメを動かすことに成功！ひとつ前に進んだ！<br/>
	<br />
	ただし、このままではアニメーションしても元に戻ってしまいます。<br />
	何故かというと、表示されている<span class="l_blue">SVGの形状は、pathの場合&#8221;d&#8221;の中身</span>で決まっていて、<br/>
	<span class="l_blue">アニメーションした後はその値による表示に戻ってしまう</span>ためです。<br/>
	そこで今度は、アニメーションしたあとに<span class="l_blue">path要素自体の&#8221;d&#8221;の値をJavaScriptで書き換えてしまう</span>ようにします。<br/>
	<pre class="brush:js highlight:[5,6]" title="animateタグ(path / d の変化):JavaScript側">
		//アニメを動作させる
		var animate = document.getElementById('circle_animate');
		animate.beginElement();
		//pathそのものの形状を変化させる
		var path = document.getElementById('circle_path');
		path.setAttribute('d','M154,89c0,27-52,49-79,49s-49-22-49-49S47,40,75,40.6S154,62,154,89z');
	</pre>
	<div style="max-width:180px;max-height:180px;">
		<svg version="1.1" class="svg_20150312" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
 y="0px" viewBox="0 0 180 180" enable-background="new 0 0 180 180" xml:space="preserve">
    <path id="post20150313_circle_path" fill="#88BB33" d="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z" >
        <animate attributeName="d"
                values="M124,89c0,27-22,49-49,49s-49-22-49-49S47,40,75,40.6S124,62,124,89z;M154,89c0,27-52,49-79,49s-49-22-49-49S47,40,75,40.6S154,62,154,89z"
                dur="1.2s"
                repeatCount="1"
				begin="indefinite" 
				id="post20150313_circle_animate_2">
		</path>
		</svg>
	</div>
	<div style="text-align:center;width:30%;">
		<span class="exsample_20150313_button sample_run" style="cursor:pointer;" onclick="document.getElementById('post20150313_circle_animate_2').beginElement();document.getElementById('post20150313_circle_path').setAttribute('d','M154,89c0,27-52,49-79,49s-49-22-49-49S47,40,75,40.6S154,62,154,89z');" rel="SVGぐにぐにボタンアニメその２">
			むくり！
		</span>
	</div>
	<br/>
	アニメ後も、要素の形状がそのままになりました！<br/>
	<br />
	ここで、疑問が生まれます。
	動作前と後で、<span class="l_blue">どんなパスを入れてもちゃんとアニメーションしてくれるのか？</span>という問題です。<br />
	ためしに、単純なパスと複雑なパスをanimateタグで繋げてみます。<br/>
	<a href="https://yugalab.net/wp-content/uploads/2015/03/20150313_6.jpg"><img loading="lazy" src="https://yugalab.net/wp-content/uploads/2015/03/20150313_6.jpg" alt="20150313_6" width="500" height="200" class="alignnone size-full wp-image-1200" srcset="https://yugalab.net/wp-content/uploads/2015/03/20150313_6.jpg 500w, https://yugalab.net/wp-content/uploads/2015/03/20150313_6-300x120.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br/><a href="https://yugalab.net/wp-content/uploads/2015/03/20150313_7.jpg"><img loading="lazy" src="https://yugalab.net/wp-content/uploads/2015/03/20150313_7.jpg" alt="20150313_7" width="500" height="200" class="alignnone size-full wp-image-1201" srcset="https://yugalab.net/wp-content/uploads/2015/03/20150313_7.jpg 500w, https://yugalab.net/wp-content/uploads/2015/03/20150313_7-300x120.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br/>
	<pre class="brush:html highlight:[5]" title="animateタグ(path / d の変化テスト・複雑パス)">
	&lt;svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
	 y="0px" viewBox="0 0 180 180" enable-background="new 0 0 180 180" xml:space="preserve"&gt;
		&lt;path fill="#88BB33" d="M150.8,93l-58,62.2L29.2,95.8C44,79,69.1,51.3,87.2,33.6L150.8,93z" &gt;
			&lt;animate attributeName="d" 
				values="M150.8,93l-58,62.2L29.2,95.8C44,79,69.1,51.3,87.2,33.6L150.8,93z;
						M112.9,90.5l16.5,32.3l-35.7-6.5L68.2,142l-4.9-36L30.9,89.6c13.9-5.7,19.4-9.5,32.7-15.7L69.2,38l25.1,26.3l35.8-5.8L112.9,90.5z"
                dur="1.2s"
                repeatCount="indefinite"" &gt;
		&lt;/path&gt;
	&lt;/svg&gt;
	</pre>
	<div style="max-width:180px;max-height:180px;">
		<svg version="1.1" class="svg_20150312" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
 y="0px" viewBox="0 0 180 180" enable-background="new 0 0 180 180" xml:space="preserve">
    <path fill="#88BB33" d="M150.8,93l-58,62.2L29.2,95.8C44,79,69.1,51.3,87.2,33.6L150.8,93z" >
        <animate attributeName="d"
                values="M150.8,93l-58,62.2L29.2,95.8C44,79,69.1,51.3,87.2,33.6L150.8,93z;M112.9,90.5l16.5,32.3l-35.7-6.5L68.2,142l-4.9-36L30.9,89.6c13.9-5.7,19.4-9.5,32.7-15.7L69.2,38l25.1,26.3
	l35.8-5.8L112.9,90.5z"
                dur="1.2s"
                repeatCount="indefinite" >
		</path>
		</svg>
	</div>
	
	あれ。ぬるぬるしない。<br />
	調査の結果、どうやら動作前と後で、<span class="l_blue">「パスを表す構成」が同じでなければうまく動いてくれない</span>ようです。<br />
	具体的には、<span class="l_blue">点の数</span>が変わったり、<span class="l_blue">座標の指定方法</span>が変わったりすると、ダメみたいです。<br />
	たとえば頂点が4つしか無い四角形から、頂点が5つある五角形に変形、ということはできないようです。<br />
	ただし、「頂点が5つだけど最初だけ四角形に見えるパス」などを用意すれば、その限りではありません。<br />
<a href="https://yugalab.net/wp-content/uploads/2015/03/20150313_8.jpg"><img loading="lazy" src="https://yugalab.net/wp-content/uploads/2015/03/20150313_8.jpg" alt="20150313_8" width="460" height="215" class="alignnone size-full wp-image-1206" srcset="https://yugalab.net/wp-content/uploads/2015/03/20150313_8.jpg 460w, https://yugalab.net/wp-content/uploads/2015/03/20150313_8-300x140.jpg 300w" sizes="(max-width: 460px) 100vw, 460px" /></a><br/>
	<br />
	さて、脱線しましたが、animateタグは「動作前」と「動作後」だけでなく、<span class="l_blue">一つのタグでいくつも動作をつなげる</span>ことができます。<br />
	変化させたいパスを<span class="l_blue">&#8220;;&#8221;</span>セミコロンでどんどん繋げていけば、こんな動きもできちゃうわけです！<br />
	<div style="max-width:624px;max-height:200px;">
<svg version="1.1" id="svg_20150312_1" class="svg_20150312"  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 624 200" enable-background="new 0 0 624 200" xml:space="preserve">
<path fill="#8FC31F" d="M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s22.1-49.3,49.3-49.3S152.7,101.4,152.7,128.7z" onclick="this.style.fill=this.style.fill=='rgb(243, 207, 215)'?'#8FC31F':'#F3CFD7';" class="sample_run" rel="SVGぐにぐにフッタ">
<animate dur="2.4s" attributeName="d" values="M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s22.1-49.3,49.3-49.3S152.7,101.4,152.7,128.7z;
M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s22.1-49.3,49.3-49.3S152.7,101.4,152.7,128.7z;
M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s72.1-49.3,99.3-49.3S152.7,101.4,152.7,128.7z;
M202.7,128.7c0,27.2-72.1,49.4-99.3,49.4s0.7-22.2,0.7-49.4s72.1-49.3,99.3-49.3S202.7,101.4,202.7,128.7z;
M222.7,158.7c0,27.2-52.1,19.4-79.3,19.4s-19.3-52.2-19.3-79.4s52.1-19.3,79.3-19.3S222.7,131.4,222.7,158.7z;
M316.7,65c0,27.2-132.1,109.4-159.3,109.4s10.7-62.2,10.7-89.4s82.1-59.3,109.3-59.3S316.7,37.7,316.7,65z;
M392.7,85c0,27.2-132.1,29.4-159.3,29.4s32.7-36.2,32.7-63.4s50.1-25.3,77.3-25.3S392.7,57.7,392.7,85z;
M447.7,84c0,27.2-94.1,13.4-121.3,13.4s-27.2-15.3-15.3-57.4s50.1-25.3,77.3-25.3S447.7,57.3,447.7,84.6z;
M498.7,78.6c0,27.2-24.1,63.4-51.3,63.4s-27.2-30.2-65.3-57.4s0.1-45.3,27.3-45.3 S498.7,51.3,498.7,78.6z;
M534.7,96.9c0,27.2-4.1,78.4-31.3,78.4s-27.2-32.2-67.3-59.4s-5.9-53.3,21.3-53.3 S534.7,69.7,534.7,96.9z;
M558.7,130.6c0,27.2-25.1,47.4-52.3,47.4s-55.3-15.2-55.3-42.4s4.1-47.3,31.3-47.3 S558.7,103.3,558.7,130.6z;
M559.7,130.6c0,27.2-25.1,47.4-52.3,47.4s-52.3-20.2-52.3-47.4s24.1-49.3,51.3-49.3 S559.7,103.3,559.7,130.6z;
M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s22.1-49.3,49.3-49.3S152.7,101.4,152.7,128.7z"  repeatCount="indefinite" />
</path>
</svg>
</div>
	<span class="f080 l_gray">↑クリックすると色が変わります(笑)</span><br />
	<pre class="brush:html" title="animateタグ(ながい)">
&lt;animate dur="2.4s" attributeName="d" 
values="M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s22.1-49.3,49.3-49.3S152.7,101.4,152.7,128.7z;
M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s22.1-49.3,49.3-49.3S152.7,101.4,152.7,128.7z;
M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s72.1-49.3,99.3-49.3S152.7,101.4,152.7,128.7z;
M202.7,128.7c0,27.2-72.1,49.4-99.3,49.4s0.7-22.2,0.7-49.4s72.1-49.3,99.3-49.3S202.7,101.4,202.7,128.7z;
M222.7,158.7c0,27.2-52.1,19.4-79.3,19.4s-19.3-52.2-19.3-79.4s52.1-19.3,79.3-19.3S222.7,131.4,222.7,158.7z;
M316.7,65c0,27.2-132.1,109.4-159.3,109.4s10.7-62.2,10.7-89.4s82.1-59.3,109.3-59.3S316.7,37.7,316.7,65z;
M392.7,85c0,27.2-132.1,29.4-159.3,29.4s32.7-36.2,32.7-63.4s50.1-25.3,77.3-25.3S392.7,57.7,392.7,85z;
M447.7,84c0,27.2-94.1,13.4-121.3,13.4s-27.2-15.3-15.3-57.4s50.1-25.3,77.3-25.3S447.7,57.3,447.7,84.6z;
M498.7,78.6c0,27.2-24.1,63.4-51.3,63.4s-27.2-30.2-65.3-57.4s0.1-45.3,27.3-45.3 S498.7,51.3,498.7,78.6z;
M534.7,96.9c0,27.2-4.1,78.4-31.3,78.4s-27.2-32.2-67.3-59.4s-5.9-53.3,21.3-53.3 S534.7,69.7,534.7,96.9z;
M558.7,130.6c0,27.2-25.1,47.4-52.3,47.4s-55.3-15.2-55.3-42.4s4.1-47.3,31.3-47.3 S558.7,103.3,558.7,130.6z;
M559.7,130.6c0,27.2-25.1,47.4-52.3,47.4s-52.3-20.2-52.3-47.4s24.1-49.3,51.3-49.3 S559.7,103.3,559.7,130.6z;
M152.7,128.7c0,27.2-22.1,49.4-49.3,49.4S54,155.9,54,128.7s22.1-49.3,49.3-49.3S152.7,101.4,152.7,128.7z"
repeatCount="indefinite" &gt;
	</pre>
	さらに、複雑な動作をさせたい方には、<span class="l_blue">keyTime、keySplines</span>という、アニメーションのスピードを細かく設定できる要素もあります！<br/>
	今回は少々手間のかかる方法でしたが、もっと簡単に動かせる仕組みが一般化していくとよいですね！
</div>
<style type="text/css">
<!--
.svg_20150312{
	width:100%;
	heifht:100%;
}
.exsample_20150313_button{
display:inline-block;
margin: 6px auto 6px auto;
padding:8px;
width:100%;
border:1px solid #666;
border-radius:6px;
background-color:#EEE;
box-shadow:-2px -2px 2px #999 inset;
}
.exsample_20150313_button:active{
box-shadow:2px 2px 2px #999 inset;
color:transparent;
text-shadow:2px 2px 0px #666;
}
.exsample_20150313_button:hover{
background-color:#F6F6F6;
}
-->
</style>
</p><p>The post <a href="https://yugalab.net/archives/1154">【備忘録】SVGのpathをJavaScriptでぬるぬる動かしたかった</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://yugalab.net/archives/1154/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>cocos2d-xの環境構築をしたら次は何をすればよいのか</title>
		<link>https://yugalab.net/archives/872</link>
					<comments>https://yugalab.net/archives/872#respond</comments>
		
		<dc:creator><![CDATA[ユーリ]]></dc:creator>
		<pubDate>Tue, 27 Jan 2015 04:00:47 +0000</pubDate>
				<category><![CDATA[cocos2d-x]]></category>
		<category><![CDATA[technical]]></category>
		<category><![CDATA[xcode]]></category>
		<guid isPermaLink="false">http://yugalab.net/?p=872</guid>

					<description><![CDATA[<p>こんにちは、ユーリです！最近、次のスマホゲームを作成するべく、cocos2d-xでの開発をはじめました！※cocos2d-xとは、iphoneとAndroid、両方のプラットフォームで2dゲーム開発ができるフレームワーク [&#8230;]</p>
<p>The post <a href="https://yugalab.net/archives/872">cocos2d-xの環境構築をしたら次は何をすればよいのか</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></description>
										<content:encoded><![CDATA[こんにちは、ユーリです！<br />最近、次のスマホゲームを作成するべく、cocos2d-xでの開発をはじめました！<br /><br /><span class="l_red f080 lh_default">※cocos2d-xとは、iphoneとAndroid、両方のプラットフォームで2dゲーム開発ができるフレームワークです。<br />この記事は、ある程度プログラムへの知識がある方へ向けて書いています。</span><br />

<div class="fold_post"><br />環境構築については、うまくまとめていらっしゃるサイト様がたくさんありますので、この場では省きます！<br />ですが、環境構築をして、テストプロジェクトを作り、サンプルの動作を確認、まで行ったら…次になにをしたらいいか、パッと見つからなかったため、私なりにまとめてみました。<br /><span class="l_red f080 lh_default">※実行環境<br />mac OS X ver 10.9.5<br />cocos2d-x ver 3.3<br />Xcode ver 6.1.1</span><br /><br /><h3 class="section_title putit_caption l_green">メインシーン用クラスを作る</h3><br />ひとまずHelloWorldの次のステップとして、オリジナルの画面をつくることですね。<br />デフォで存在している「Classes」フォルダの中にオリジナルシーン用のクラスを作成します。<br /><a href="https://yugalab.net/wp-content/uploads/2015/01/20150127_1.jpg"><img loading="lazy" class="alignnone size-full wp-image-896" src="https://yugalab.net/wp-content/uploads/2015/01/20150127_1.jpg" alt="20150127_1" width="500" height="252" srcset="https://yugalab.net/wp-content/uploads/2015/01/20150127_1.jpg 500w, https://yugalab.net/wp-content/uploads/2015/01/20150127_1-300x151.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />New File&#8230;でファイル作成。<br /><br /><a href="https://yugalab.net/wp-content/uploads/2015/01/20150127_2.jpg"><img loading="lazy" class="alignnone size-full wp-image-897" src="https://yugalab.net/wp-content/uploads/2015/01/20150127_2.jpg" alt="20150127_2" width="500" height="293" srcset="https://yugalab.net/wp-content/uploads/2015/01/20150127_2.jpg 500w, https://yugalab.net/wp-content/uploads/2015/01/20150127_2-300x175.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />C++ Fileを選びます。<br /><br /><a href="https://yugalab.net/wp-content/uploads/2015/01/20150127_3.jpg"><img loading="lazy" class="alignnone size-full wp-image-898" src="https://yugalab.net/wp-content/uploads/2015/01/20150127_3.jpg" alt="20150127_3" width="500" height="294" srcset="https://yugalab.net/wp-content/uploads/2015/01/20150127_3.jpg 500w, https://yugalab.net/wp-content/uploads/2015/01/20150127_3-300x176.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />クラス名を決めます。何でもいいんですが、MainSceneにしました。<br /><br /><a href="https://yugalab.net/wp-content/uploads/2015/01/20150127_4.jpg"><img loading="lazy" class="alignnone size-full wp-image-899" src="https://yugalab.net/wp-content/uploads/2015/01/20150127_4.jpg" alt="20150127_4" width="500" height="223" srcset="https://yugalab.net/wp-content/uploads/2015/01/20150127_4.jpg 500w, https://yugalab.net/wp-content/uploads/2015/01/20150127_4-300x133.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br />決定すると、<br /><span class="l_red">MainScene.cpp</span>　と<br /><span class="l_red">MainScene.h</span>　の二つのファイルが作成されます。<br />ソースファイルはこのようにシーンごとに作成します。<br /><br />
<p><h3 class="section_title putit_caption l_green">Sceneの骨組みと、入力に反応するメソッドを作る</h3><br />次に、シーンを制御するコンストラクタとデストラクタ、<br />そして入力に反応するイベントリスナーを実装します。<br />まずはヘッダファイルから。</p>
<pre class="brush:cpp" title="MainScene.h">//
//  MainScene.h
//  testproject
//
//  Created by yuri on 2015/01/26.
//
//

#ifndef __testproject__MainScene__
#define __testproject__MainScene__

#include "cocos2d.h"

class MainScene :public cocos2d::Layer
{
protected:
    MainScene();            //コンストラクタ
    virtual ~MainScene();   //デストラクタ
    bool init() override;   //初期化処理

public:
    static cocos2d:: Scene* createScene();
    CREATE_FUNC(MainScene);                 //createメソッドを作成
    CC_SYNTHESIZE_RETAIN(cocos2d::Sprite *, _cursor,Cursor);    //_cursor変数を作成し、ゲッターとセッターを実装する
};

#endif /* defined(__testproject__MainScene__) */</pre>
<p>まずは必要最低限の実装です。<br /> シーンクラスは、<span class="l_blue">Scene</span>ではなく<span class="l_blue">Layerを</span>継承して作成します。 <span class="l_blue">CREATE_FUNC(MainScene);</span> はマクロで、create();関数の生成を行います。<br /> <span class="l_blue">CC_SYNTHESIZE_RETAIN(cocos2d::Sprite *, _cursor,Cursor);</span> では、入力に反応して動くカーソル用のスプライトを生成します。<br /> <br /> 続いて、ソースファイルです。</p>
<pre class="brush:cpp" title="MainScene.cpp">//
//  MainScene.cpp
//  testproject
//
//  Created by yuri on 2015/01/26.
//
//

#include "MainScene.h"

USING_NS_CC;

MainScene::MainScene()
: _cursor(NULL) //コンスタラクタ内での初期化
{

}

MainScene::~MainScene()
{
    CC_SAFE_RELEASE_NULL(_cursor);  //オブジェクトをリリースする
}

Scene* MainScene::createScene()
{
    auto scene = Scene::create();
    auto layer = MainScene::create();
    scene -&gt; addChild(layer);
    return scene;
}

bool MainScene::init()
{
    if(!Layer::init()){
        return false;
    }
    auto director = Director::getInstance();    //Directorを取り出す

    //初期化を行う
    this -&gt; setCursor(Sprite::create("CloseSelected.png")); //指定画像をリソースにスプライトを生成
    _cursor -&gt; setPosition(Vec2(100,100));                  //位置の定義
    this -&gt; addChild(_cursor);                              //生成したスプライトをシーンに追加

    //タッチ操作の動作定義
    auto listner = EventListenerTouchOneByOne::create();    //一点タッチされたときのイベント定義
    listner -&gt; onTouchBegan = [this](Touch* touch,Event* event){
        //タッチされたときの処理(この定義は必須である)
        auto touchPosition = touch -&gt; getLocation(); //タッチした位置を取得
        _cursor -&gt; setPosition(touchPosition);    //カーソルの座標にタッチ座標を格納
        log("タッチ位置 : %f , %f" , touchPosition.x , touchPosition.y );
        return true;
    };
    listner -&gt; onTouchMoved = [this](Touch* touch,Event* event){
        //タッチしたあと移動した場合
        auto touchPosition = touch -&gt; getLocation(); //タッチした位置を取得
        _cursor -&gt; setPosition(touchPosition);    //カーソルの座標にタッチ座標を格納
    };
    director-&gt;getEventDispatcher()-&gt;addEventListenerWithSceneGraphPriority(listner, this);  //作成したイベントを画面にひもづける

    return true;
}</pre>
<p>カーソル用の画像は、今回はデフォルトでリソースに入っているボタン画像を使っちゃいました。<br /><a href="https://yugalab.net/wp-content/uploads/2015/01/20150127_5.jpg"><img loading="lazy" class="alignnone size-full wp-image-905" src="https://yugalab.net/wp-content/uploads/2015/01/20150127_5.jpg" alt="20150127_5" width="500" height="238" srcset="https://yugalab.net/wp-content/uploads/2015/01/20150127_5.jpg 500w, https://yugalab.net/wp-content/uploads/2015/01/20150127_5-300x142.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /><br /></a>お好みのものを使いたい場合、Resourcesフォルダ内に画像を追加する必要があります。<br /><br />今回は初期化用の関数 <span class="l_blue">init()</span>と、<span class="l_blue">Director</span>というクラスがポイントになります。<br /><span class="l_blue">init()</span>内では、リソース内の画像ファイルからスプライトの生成、タッチした時の挙動をイベントリスナーに登録。という二つの動作を実装しています。<br /><span class="l_blue">Director</span>はゲーム全体を管理するクラスで、画面サイズや端末情報を得る際に使用します。<br />今回はこのDirectorクラスを通じて、画面にイベントリスナーを追加しています。<br /> その他の部分はだいたいおまじないです。<br /> <br /> あとは、AppDelegate.cpp内のHelloWorldの部分をMainSceneに置き換えれば完成です。</p>
<pre class="brush:cpp highlight:[2,3]" title="MainScene.cpp">#include "AppDelegate.h"
//#include "HelloWorldScene.h"
#include "MainScene.h"</pre>
<pre class="brush:cpp first-line:38 highlight:[42,43]" title="MainScene.cpp">    // set FPS. the default value is 1.0/60 if you don't call this
    director-&gt;setAnimationInterval(1.0 / 60);

    // create a scene. it's an autorelease object
    //auto scene = HelloWorld::createScene();
    auto scene = MainScene::createScene();</pre>
<p>背景は真っ暗ですが、タッチするとタッチした位置にカーソルがついてくる画面が完成しました！<br /><a href="https://yugalab.net/wp-content/uploads/2015/01/20150127_6.jpg"><img loading="lazy" class="alignnone size-full wp-image-911" src="https://yugalab.net/wp-content/uploads/2015/01/20150127_6.jpg" alt="20150127_6" width="500" height="297" srcset="https://yugalab.net/wp-content/uploads/2015/01/20150127_6.jpg 500w, https://yugalab.net/wp-content/uploads/2015/01/20150127_6-300x178.jpg 300w" sizes="(max-width: 500px) 100vw, 500px" /></a><br /><br /> 今日はここまでに致します…。</p>
</div><p>The post <a href="https://yugalab.net/archives/872">cocos2d-xの環境構築をしたら次は何をすればよいのか</a> first appeared on <a href="https://yugalab.net">ユガラボ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://yugalab.net/archives/872/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
