<?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"
	>

<channel>
	<title>blog.wonder-boys.net</title>
	<atom:link href="http://blog.wonder-boys.net/wp-rss2.php" rel="self" type="application/rss+xml" />
	<link>http://blog.wonder-boys.net</link>
	<description>css,javascript,actionscriptを中心に勉強したことをまとめるブログ</description>
	<pubDate>Wed, 01 Sep 2010 09:52:17 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
	<language>ja</language>
			<item>
		<title>[javascript]三角関数の基本</title>
		<link>http://blog.wonder-boys.net/?p=446</link>
		<comments>http://blog.wonder-boys.net/?p=446#comments</comments>
		<pubDate>Wed, 01 Sep 2010 09:52:17 +0000</pubDate>
		<dc:creator>wonder</dc:creator>
		
		<category><![CDATA[javascript]]></category>

		<category><![CDATA[三角関数]]></category>

		<guid isPermaLink="false">http://blog.wonder-boys.net/?p=446</guid>
		<description><![CDATA[三角関数の基本部分を復習してみようと思います。

数学的な三角関数
さて、まずいわゆる学校で習う三角関数についての復習をしてみます。
高校で習っているはずですね！数学I・Aでやりましたね！

図のような「直角三角形」にお [...]]]></description>
			<content:encoded><![CDATA[<p>三角関数の基本部分を復習してみようと思います。</p>
<p><span id="more-446"></span></p>
<h3>数学的な三角関数</h3>
<p>さて、まずいわゆる学校で習う三角関数についての復習をしてみます。<br />
高校で習っているはずですね！数学I・Aでやりましたね！</p>
<p style="padding:0 0 15px 0;text-align:center;"><img src="image/math01.png" alt="" /></p>
<p>図のような「直角三角形」において、角度が分かると辺の比率の関係を表しているのが三角関数です。<br />
公式は、</p>
<pre>sinθ = a / c　//サイン
cosθ = b / c　//コサイン
tanθ = a / b　//タンジェント</pre>
<p>となります。<br />
例えば、角度が45°のときの辺cと辺aの比率は、</p>
<pre>sin45° = 1 / √2 = a / c　※角度に対する比率というのは決まっています。</pre>
<p>ですね、よって</p>
<pre>a : c = 1 : √2</pre>
<p>となるわけです。</p>
<p>つまり、三角関数の基本的な意味とは、</p>
<blockquote><p>・角度と辺の比率の関係を表す。<br />
・角度から辺の比率が分かる。<br />
・辺の比率から角度が分かる。</p></blockquote>
<p>ということです。</p>
<h3>javascriptでの三角関数の書き方</h3>
<p>まあ、これは書くまでもないですが、一応。<br />
今回はjavascriptでの書き方。</p>
<p>javascriptではMathクラスが予め用意されています。<br />
このMathクラスのメソッドを使います。</p>
<pre>Math.sin( 角度 )
Math.cos( 角度 )
Math.tan（ 角度 ）</pre>
<p>と書きます。<br />
返り値は辺の比率が小数点で返ってきます。<br />
このとき重要なのは、角度に入る部分が「度」ではなくて「ラジアン」だということです。</p>
<blockquote><p><a href="http://ja.wikipedia.org/wiki/ラジアン" target="_blank"> ラジアン　wikipedia </a></p></blockquote>
<p>ラジアンの意味は上記を見てもらうとしまして、角度とラジアンの関係は</p>
<pre>360度 = 2π（パイ）ラジアン</pre>
<p>になります。<br />
javascriptでいくと、</p>
<pre>360度 = Math.PI * 2</pre>
<p>です。<br />
つまり、sin360°を求めたいときは</p>
<pre>Math.sin( Math.PI * 2 )</pre>
<p>と書きます。<br />
ちょっとめんどくさいですね。</p>
<h3>座標における三角関数：sinとcosの意味</h3>
<p>ここからは実際にプログラミング中での使い方を見ていきます。<br />
実際に使う箇所として一番多いのは、図形やいろんなオブジェクトを運動させる（アニメーション）ときではないかと思います。<br />
つまり、ある座標上のx値とy値をもとに動かしていくわけです。</p>
<p>座標上における三角関数というのはどのようなものでしょうか。</p>
<p style="padding:0 0 15px 0;text-align:center;"><img src="image/math02.png" alt="" /></p>
<p>上記の図を見てもらうと分かりますが、この三角形の「点Ｂ」において、x座標はb、y座標はaになります。<br />
つまり、点Bの座標は（ b, a ）ということになりますね。<br />
さらに、点Bの座標を知りたければ、辺bと辺aを知ればよいということになります。</p>
<p>さて、どうやるのか。<br />
一番上の三角関数の基本に戻ると</p>
<pre>sinθ = a / c
cosθ = b / c</pre>
<p>この公式がありましたね。<br />
この式を変形すると、</p>
<pre>a = sinθ * c
b = cosθ * c</pre>
<p>になります。<br />
cは対辺と呼ぶので</p>
<blockquote><p>cosに対辺をかけたものがx座標<br />
sinに対辺をかけたものがy座標</p></blockquote>
<p>になります。<br />
また、</p>
<blockquote><p>基準点からの角度と対辺の長さが分かれば座標を取得できる</p></blockquote>
<p>ということにもなります。<br />
ちなみにtanについてふれていませんが、実際あまりつかわないのでここではそっとしておきましょう。</p>
<h3>三角関数を使って円運動</h3>
<blockquote><p>基準点からの角度と対辺の長さが分かれば座標を取得できる</p></blockquote>
<p>と書きましたが、この方法を使って表現できる一番スタンダードなものは円運動です。<br />
円運動させたい図形の座標を「点B」、円運動する円の中心点を「点Ａ」とみたてて三角形を書いてみます。</p>
<p style="padding:0 0 15px 0;text-align:center;"><img src="image/math03.png" alt="" /></p>
<p>どうでしょうか。<br />
半径と中心点の座標を決めて、角度だけ変えていけば点Bは図の円の上を移動することになりますね。<br />
これを利用して円運動をさせます。</p>
<pre>//基準点
var centerX = 200;
var centerY = 200;

//半径
var radius = 50;</pre>
<p>としてみます。<br />
これを使い座標を取得します。</p>
<pre>var posX = Math.cos( angle ) * radius;
var posY = Math.sin( angle ) * radius;</pre>
<p>angleには角度が入ります。<br />
5度づつ動かしたい場合は、</p>
<pre>//角度の初期値
var angle = 0;

//変化率（5度）
var per = Math.PI / 36;</pre>
<p>としておきます。</p>
<p>それから、実際に動かすとわかりますが、このままでは原点（0,0）を中心に動いてしまいます。<br />
設定した点を中心に周るように点をずらします。</p>
<pre>var posX = Math.cos( angle ) * radius + centerX;
var posY = Math.sin( angle ) * radius + centerY;</pre>
<p>これらをまとめて、定期的に動作させます。</p>
<p><script src="http://jsdo.it/blogparts/1IkM/js" type="text/javascript"></script> <a title="円運動" href="http://jsdo.it/_wonder/1IkM">円運動 - jsdo.it - share JavaScript, HTML5 and CSS</a> これが円運動の基本です。</p>
<h3>三角関数を使って円運動（2）</h3>
<p>上記の座標算出方法は、</p>
<ol>
<li>中心点を決める</li>
<li>円運動させる円の半径を決める。</li>
<li>角度を決め、角度を増やしていく。</li>
</ol>
<p>という方法でした。 「基準点を決めて半径がこのくらいで円運動させる」というように、あらかじめ全ての情報が分かっている場合は特に問題ないです。  ただ、例えば座標上に一つ点があってそれをある基準点の周りを円運動させたいときなんかは少し面倒なことになります。</p>
<ul>
<li>点が基準点からみて角度が何度あるのか。</li>
<li>点と基準点との距離（円運動させる円の半径）はいくつか。</li>
</ul>
<p>という処理をはさまなければいけません。 この処理は、</p>
<pre>var targetX; //移動する点のx座標とする
var targetY; //移動する点のy座標とする

//角度を求める
var dx = targetX - centerX;
var dy = targetY - centerY;

var angle = Math.atan2( dy, dx ); //点と点の距離から角度を求める式

//距離を求める
var radius = Math.sqrt( dx*dx + dy*dy ); //ピタゴラスの定理</pre>
<p>とやって初めて角度と距離を取得することが出来ます。 ちなみに距離を求める方法はピタゴラスの定理です。覚えてますか？ サンプルはこちら。  <script src="http://jsdo.it/blogparts/9C6Z/js" type="text/javascript"></script></p>
<p class="ttlBpJsdoit" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a title="三角関数（2）" href="http://jsdo.it/_wonder/9C6Z">三角関数（2） - jsdo.it - share JavaScript, HTML5 and CSS</a></p>
<p>設定した位置から基準点に対して円運動します。</p>
<h3>三角関数の数値を使った運動</h3>
<p>ここまでは三角関数を使ってある点との角度を求めたり位置を求めたりしましたが、ちょっと視点を変えてみようと思います。<br />
<a href="http://ja.wikipedia.org/wiki/ファイル:Sin_and_cos.png" target="_blank"> wikipedia</a>さんからちょっと拝借させて頂きました。ごめんなさい。</p>
<p style="padding:0 0 15px 0;text-align:center;"><img src="image/math04.png" alt="" /></p>
<p>これを見るとわかりますが、sinやcosというのは-1.0～1.0の値をいったりきたりしています。<br />
これに注目してみましょう。。</p>
<pre>Math.sin( angle );</pre>
<p>angleを少しづつ増やしていくと、sinは</p>
<pre>0　→　1.0　→　0　→　-1.0　→　0</pre>
<p>となっていきます。<br />
この値を例えば位置に加え続けてみます。</p>
<pre>var vx = posX + Math.sin( angle );
angle += 0.1;</pre>
<p>という感じですね。<br />
これで、ある範囲を往復する運動になります。<br />
しかもちょっとイージング（加速したり減速したりする）気味で。</p>
<p><script src="http://jsdo.it/blogparts/aN51/js" type="text/javascript"></script> <a title="三角関数（3）" href="http://jsdo.it/_wonder/aN51">三角関数（3） - jsdo.it - share JavaScript, HTML5 and CSS</a> 同じように、図形の大きさに適用してみます。  <script src="http://jsdo.it/blogparts/cqow/js" type="text/javascript"></script></p>
<p class="ttlBpJsdoit" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a title="三角関数（4）" href="http://jsdo.it/_wonder/cqow">三角関数（4） - jsdo.it - share JavaScript, HTML5 and CSS</a></p>
<p>なんか面白い動きになりましたね。</p>
<h3>まとめ</h3>
<p>以上で基本終わりです。<br />
なかなか奥が深い三角関数ですので気になる方は色々と調べてみてください。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wonder-boys.net/?feed=rss2&amp;p=446</wfw:commentRss>
		</item>
		<item>
		<title>[javascript]JS + Canvas = 3D しました</title>
		<link>http://blog.wonder-boys.net/?p=436</link>
		<comments>http://blog.wonder-boys.net/?p=436#comments</comments>
		<pubDate>Fri, 27 Aug 2010 09:46:03 +0000</pubDate>
		<dc:creator>wonder</dc:creator>
		
		<category><![CDATA[javascript]]></category>

		<category><![CDATA[3D]]></category>

		<guid isPermaLink="false">http://blog.wonder-boys.net/?p=436</guid>
		<description><![CDATA[javascriptとCanvasを使って3Dオブジェクトを作ってみました。

サンプル
こんな感じで。
四角い箱がぐるぐる回ります。
let&#8217;s play !!
 3D Cube - jsdo.it - s [...]]]></description>
			<content:encoded><![CDATA[<p>javascriptとCanvasを使って3Dオブジェクトを作ってみました。</p>
<p><span id="more-436"></span></p>
<h3>サンプル</h3>
<p>こんな感じで。<br />
四角い箱がぐるぐる回ります。<br />
let&#8217;s play !!</p>
<p><script src="http://jsdo.it/blogparts/44zk/js" type="text/javascript"></script> <a title="3D Cube" href="http://jsdo.it/_wonder/44zk">3D Cube - jsdo.it - share JavaScript, HTML5 and CSS</a></p>
<p>簡単にコードの解説を。</p>
<h3>座標の決定は遠近法を使う</h3>
<p>3Dの描画を行う場合データとしては、x、y、zの座標を持たないといけません。<br />
 しかし、スクリーン上は2次元なのでx、yしかありません。<br />
そこで遠近法を使って&#8221;3Dっぽく&#8221;見せる必要があります。<br />
奥行きを感じる絵を描くのと同じ感覚でしょうかね。</p>
<blockquote><p><a href="http://ja.wikipedia.org/wiki/遠近法" target="_blank">遠近法 Wikipedia</a></p></blockquote>
<p>具体的には、消失点（上記ページ参照）を作り、その座標点を考慮して点を配置します。</p>
<pre>■106行目
var Point3D = function( posX, posY, posZ ){
    this.x = posX;
    this.y = posY;
    this.z = posZ;
    this.cx = posX;
    this.cy = posY;
    this.cz = posZ;
    this.centerX = 0;
    this.centerY = 0;
    this.centerZ = 0;

    this.fl = 250;
    this.vpX = 0;
    this.vpY = 0;
};

Point3D.prototype = {
    setVanishingPoint: function( vpX, vpY ){
        this.vpX = vpX;
        this.vpY = vpY;
    },
    setCenter: function( centerX, centerY, centerZ ){
        this.centerX = centerX;
        this.centerY = centerY;
        this.centerZ = centerZ;
    },
    screenX: function(){
        return this.vpX + this.centerX + this.x * this.getScale();
    },
    screenY: function(){
        return this.vpY + this.centerY + this.y * this.getScale();
    },
    getScale: function(){
  return this.fl / ( this.fl + this.z + this.centerZ );
    }
};</pre>
<p>これが基本となるオブジェクト。<br />
点の座標を管理します。</p>
<pre>this.vpX = 0;
this.vpY = 0;</pre>
<p>ここが消失点を持つプロパティです。<br />
インスタンス化した後に外部から設定できるようにしてあります。</p>
<pre>■277行目
for( var i = 0; i &lt; points.length; i++ ){
    var point = points[i];
    point.setVanishingPoint( stage.stageWidth / 2, stage.stageHeight / 2 );
    point.setCenter( 0, 0, 50);
    stage.setPoint( point );
}</pre>
<p>ステージのちょうど真ん中を消失点に設定しています。</p>
<pre>■132行目
screenX: function(){
    return this.vpX + this.centerX + this.x * this.getScale();
},
screenY: function(){
    return this.vpY + this.centerY + this.y * this.getScale();
}</pre>
<p>screenXとsccreenYというメソッドを使って、スクリーン上に配置する場所を計算しています。<br />
x値とy値が同じでもz値が大きくなるとその分消失点に近づいていくというわけです。</p>
<h3>3Dの回転</h3>
<p>3Dの座標回転は三角関数を使います。</p>
<pre>■51行目
rotateX: function( point, angle ){
    cosX = Math.cos( angle );
    sinX = Math.sin( angle );

    y1 = point.cy * cosX - point.cz * sinX;
    z1 = point.cz * cosX + point.cy * sinX;

    point.y = y1;
    point.z = z1;
}</pre>
<p>この関数はx方向の軸を中心に回転させるメソッドです。 angleというのは角度。<br />
原点を中心として現在の位置から何度回転させるか。で位置を決めています。<br />
同じ原理で、y軸、z軸の回転もできます。</p>
<h3>面の描画（ポリゴン）</h3>
<p>上記にあったPoint3Dクラス（※正確にはクラスじゃないけど）の座標を元に面を描く場合三角形を使います。<br />
Point3Dインスタンスを3つ集めて三角形を描きます。これがいわゆるポリゴンですね。</p>
<blockquote><p>
<a href="http://ja.wikipedia.org/wiki/ポリゴン" target="_blank">ポリゴン　Wikipedia</a></p></blockquote>
<p>三角形というのはどうやらいろいろと使いやすいものだそうです。</p>
<pre>■145行目
var Triangle = function( pointA, pointB, pointC, color ){
    this.a = pointA;
    this.b = pointB;
    this.c = pointC;
    this.color = color;
    this.light;
};</pre>
<p>メソッド部分は割愛しますが、Triangleクラスを使っています。<br />
引数に入るPoint3Dインスタンス3つを使って三角形を描くようにします。<br />
実際に描くのはCanvasですが。</p>
<p>Triangleクラスは三角形データの保持です。</p>
<pre>■86行目
this.canvas.moveTo( triangle.a.screenX(), triangle.a.screenY() );
this.canvas.lineTo( triangle.b.screenX(), triangle.b.screenY() );
this.canvas.lineTo( triangle.c.screenX(), triangle.c.screenY() );
this.canvas.lineTo( triangle.a.screenX(), triangle.a.screenY() );</pre>
<p>こんな感じで。</p>
<h3>陰面消去</h3>
<p>ポリゴンを使って三角形を描画すると奥に配置されるべきポリゴンが手前に来てしまうことがあります。<br />
これはちょっとよろしくないので、裏側になるポリゴンは描画しないようにします。<br />
これが、陰面消去。</p>
<pre>■159行目
isBackFace: function(){
    var cax = this.c.screenX() - this.a.screenX();
    var cay = this.c.screenY() - this.a.screenY();
    var bcx = this.b.screenX() - this.c.screenX();
    var bcy = this.b.screenY() - this.c.screenY();
    return cax * bcy &gt; cay * bcx;
}</pre>
<p>3つの点の配置順をチェックして面が裏面なのか表面なのかを判断します。</p>
<pre>■77行目
if( triangle.isBackFace() ){ continue; };</pre>
<p>こんな感じで裏面だったら描画しないようにします。</p>
<h3>3D照明</h3>
<p>ついでに、面の位置によって明るさを調整できるとリアルに感じますね。<br />
光源データを持つクラスを作ります。</p>
<pre>■204行目
var Light = function( posX, posY, posZ, brightness ){
    this.x = -100;
    this.y = -100;
    this.z = -100;
    this.brightness = 1;

    if( arguments[0] ) this.x = posX;
    if( arguments[1] ) this.y = posY;
    if( arguments[2] ) this.z = posZ;
    if( arguments[3] ) this.brightness = brightness;
};

Light.prototype = {
    setBrightness: function( num ){
  this.brightness = Math.max( num, 0 );
  this.brightness = Math.min( this.brightness, 1 );
    }
};</pre>
<p>位置とか。明るさとか。<br />
このクラスに対して面がどっちを向いているかを算出します。</p>
<pre>■179行目
getLightFactor: function(){
    var ab = new Object();
    ab.x = this.a.x - this.b.x;
    ab.y = this.a.y - this.b.y;
    ab.z = this.a.z - this.b.z;

    var bc = new Object();
    bc.x = this.b.x - this.c.x;
    bc.y = this.b.y - this.c.y;
    bc.z = this.b.z - this.c.z;

    var norm = new Object();
    norm.x = ( ab.y * bc.z ) - ( ab.z * bc.y );
    norm.y = -(( ab.x * bc.z ) - ( ab.z * bc.x ));
    norm.z = ( ab.x * bc.y ) - ( ab.y * bc.x );

    var dotProd = norm.x * this.light.x + norm.y * this.light.y + norm.z * this.light.z;
    var normMag = Math.sqrt( norm.x * norm.x + norm.y * norm.y + norm.z * norm.z );
    var lightMag = Math.sqrt( this.light.x * this.light.x + this.light.y * this.light.y + this.light.z * this.light.z );
    return ( Math.acos(dotProd / (normMag * lightMag)) / Math.PI) * this.light.brightness;
}</pre>
<p>とっても難しいので理解できません。<br />
また、この結果をもとに色を調節します。</p>
<pre>■166行目
getAdjustedColor: function(){
    var color = parseInt( '0x'+( this.color.charAt(0) == "#" ? this.color.substring(1) : this.color ) );
    var red = ( color &amp; 0xff0000 ) &gt;&gt; 16;
    var green = ( color &amp; 0x00ff00 ) &gt;&gt; 8;
    var blue = ( color &amp; 0x0000ff );

    var lightFactor = this.getLightFactor();
    red *= lightFactor;
    green *= lightFactor;
    blue *= lightFactor;
    color = red &lt;&lt; 16 | green &lt;&lt; 8 | blue ;
    return "#" + color.toString(16);
}</pre>
<p>一度、RGBに分けて各色ごとに調整して元に戻しています。ビット演算ですね。<br />
まあこの辺もあんまり理解してないんですけど。</p>
<h3>というわけで</h3>
<p>簡単な解説でした。 ここまでこればあとはどんなものでも描けそうです。<br />
球体とかも。</p>
<p><script src="http://jsdo.it/blogparts/y279/js" type="text/javascript"></script></p>
<p class="ttlBpJsdoit" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a title="3D Sphere" href="http://jsdo.it/_wonder/y279">3D Sphere - jsdo.it - share JavaScript, HTML5 and CSS</a></p>
<p>それから、この球体にテクスチャを貼り付けたりとかしたいです。<br />
やりかたわからないけど。</p>
<h3>参考サイト</h3>
<p>こちらを読めばもっと理解が深まるかも。（actionscriptですけど！）</p>
<blockquote><p><a href="http://d.hatena.ne.jp/nitoyon/20080616/as_3d_lessen1" target="_blank">AS3.0 で 3D プログラミングを１から勉強する (1)　てっく煮ブログ</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.wonder-boys.net/?feed=rss2&amp;p=436</wfw:commentRss>
		</item>
		<item>
		<title>[svg]テキストの使用（text要素）</title>
		<link>http://blog.wonder-boys.net/?p=434</link>
		<comments>http://blog.wonder-boys.net/?p=434#comments</comments>
		<pubDate>Sun, 01 Aug 2010 11:33:24 +0000</pubDate>
		<dc:creator>wonder</dc:creator>
		
		<category><![CDATA[SVG]]></category>

		<category><![CDATA[text]]></category>

		<guid isPermaLink="false">http://blog.wonder-boys.net/?p=434</guid>
		<description><![CDATA[SVGではテキストを使用することもできます。

text
SVGでテキストを使用する場合はtext要素を使用します。
表示させたいテキストはtext要素で囲むことで表示されます。
色(fill)、境界線(stroke)、 [...]]]></description>
			<content:encoded><![CDATA[<p>SVGではテキストを使用することもできます。</p>
<p><span id="more-434"></span></p>
<h3>text</h3>
<p>SVGでテキストを使用する場合はtext要素を使用します。<br />
表示させたいテキストはtext要素で囲むことで表示されます。<br />
色(fill)、境界線(stroke)、透明度(opacity)、座標(x、y)、等図形と同じ属性値を設定することができます。<br />
フォントサイズはfont-size属性にて設定します。</p>
<pre>&lt;text x="10" y="10" font-size="20" fill="red"&gt;
    テキストを使用します。
&lt;/text&gt;</pre>
<p>デフォルト座標はテキストの左下になりますので、x座標y座標を指定しない場合はエリアから外にでてしまいます。</p>
<pre>&lt;text font-size="20" fill="red"&gt;
    テキストを使用します。　//デフォルト座標値は（0,0）なのでエリア外に配置されてしまう。
&lt;/text&gt;</pre>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-text01.html" target="_blank"> SVGサンプル - テキストの配置 </a></p></blockquote>
<h3>テキスト要素の装飾</h3>
<p>上記以外にも、テキストの装飾をすることができます。</p>
<p><strong>・font-family</strong><br />
[serif, Verdana, Arial ....]</p>
<p>フォントの種類を指定します。</p>
<pre>&lt;text font-size="12" fill="blue" font-family="Verdana"&gt;テキストを使用します。its text&lt;/text&gt;</pre>
<p><strong>・font-weight</strong><br />
[normal, bold ....]</p>
<p>フォントの太さを指定します。</p>
<pre>&lt;text font-size="12" fill="blue" font-weight="bold"&gt;テキストを使用します。its text&lt;/text&gt;</pre>
<p><strong>・font-style</strong><br />
[normal, italic, oblique ....]</p>
<p>フォントのスタイルを指定します。</p>
<pre>&lt;text font-size="12" fill="blue" font-style="italic"&gt;テキストを使用します。its text&lt;/text&gt;</pre>
<p><strong>・text-decoration</strong><br />
[none, underline, overline, line-through]</p>
<p>下線や打消し線等フォントの装飾を指定します。</p>
<pre>&lt;text font-size="12" fill="blue" text-decoration="underline"&gt;テキストを使用します。its text&lt;/text&gt;</pre>
<p><strong>・word-spacing</strong><br />
[数値]</p>
<p>単語と単語の間隔を指定します。</p>
<pre>&lt;text font-size="12" fill="blue" word-spacing="2"&gt;テキストを使用します。its text&lt;/text&gt;</pre>
<p><strong>・letter-spacing</strong><br />
[数値]</p>
<p>文字と文字の間隔を指定します。</p>
<pre>&lt;text font-size="12" fill="blue" letter-spacing="2"&gt;テキストを使用します。its text&lt;/text&gt;</pre>
<p>HTMLやCSSで指定する要素とほとんど同じなので分かりやすいと思います。</p>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-text02.html" target="_blank"> SVGサンプル - テキストの装飾 </a></p></blockquote>
<h3>テキスト要素の部分的な装飾の指定</h3>
<p>text要素の内部でtspan要素を追加することで、部分的に違う装飾を指定することができます。<br />
tspanにはtextと同じ装飾を指定することができます。</p>
<pre>&lt;text font-size="12" fill="blue"&gt;テキストを使用します。&lt;tspan fill="red" text-decoration="underline"&gt;its text&lt;/tspan&gt;&lt;/text&gt;</pre>
<p>tspanには、xやy等の座標も独自に設定することができます。<br />
ただし、親要素になるtext要素の座標は継承しません。原点からの絶対座標になります。<br />
CSSでいうと、position: absoluto;を指定したようなものです。</p>
<pre>&lt;text y="20" font-size="12" fill="blue"&gt;テキストを使用します。&lt;tspan fill="red" y="30"&gt;its text&lt;/tspan&gt;&lt;/text&gt;</pre>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-text03.html" target="_blank"> SVGサンプル - 部分的なテキストの装飾 </a></p></blockquote>
<h3>テキストの配置（寄せ）</h3>
<p>テキストは通常左寄せで表示されます。<br />
テキストのセンタリングや右寄せをする場合はtext-anchorを指定します。<br />
通常の寄せと少し違うのが、<br />
指定していない場合はx=&#8221;0&#8243;がテキストの左端になりますが、middleやendを指定するとx=&#8221;0&#8243;がテキストの中央もしくは、右端になります。</p>
<p><strong>・text-anchor</strong><br />
[start, middle, end]</p>
<p>指定する名称からして、どこからテキストを始めるかという感じで覚えるといいかと思います。<br />
デフォルトはstartです。</p>
<pre>&lt;text font-size="12" fill="blue" text-anchor="start"&gt;テキストを使用します。左寄せです。&lt;/text&gt;
&lt;text font-size="12" fill="blue" text-anchor="middle"&gt;テキストを使用します。中央寄せです。&lt;/text&gt;
&lt;text font-size="12" fill="blue" text-anchor="end"&gt;テキストを使用します。右寄せです。&lt;/text&gt;</pre>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-text04.html" target="_blank"> SVGサンプル - テキストの配置（寄せ） </a></p></blockquote>
<h3>まとめ</h3>
<p>テキスト要素の配置については、そんなに戸惑うことなくできました。<br />
装飾についてもCSSと同じような指定でいけるので助かります。</p>
<p>あとは、SVGでテキストを配置するべきか、通常のHTML内に用意するべきかの判断を見極めたいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wonder-boys.net/?feed=rss2&amp;p=434</wfw:commentRss>
		</item>
		<item>
		<title>[svg]要素のグループ化と参照</title>
		<link>http://blog.wonder-boys.net/?p=432</link>
		<comments>http://blog.wonder-boys.net/?p=432#comments</comments>
		<pubDate>Tue, 27 Jul 2010 09:52:41 +0000</pubDate>
		<dc:creator>wonder</dc:creator>
		
		<category><![CDATA[SVG]]></category>

		<category><![CDATA[defs]]></category>

		<category><![CDATA[g]]></category>

		<category><![CDATA[symbol]]></category>

		<category><![CDATA[use]]></category>

		<category><![CDATA[xlink]]></category>

		<guid isPermaLink="false">http://blog.wonder-boys.net/?p=432</guid>
		<description><![CDATA[SVGの各要素をグループ化することで効率よく管理することが出来ます。

グループ化の方法
各要素をグループ化する方法は3つあります。
&#60;g&#62;
要素を単純にグループ化します。
&#60;symbol&#62;
各要 [...]]]></description>
			<content:encoded><![CDATA[<p>SVGの各要素をグループ化することで効率よく管理することが出来ます。</p>
<p><span id="more-432"></span></p>
<h3>グループ化の方法</h3>
<p>各要素をグループ化する方法は3つあります。</p>
<p>&lt;g&gt;<br />
要素を単純にグループ化します。</p>
<p>&lt;symbol&gt;<br />
各要素をグループ化しシンボルにします。</p>
<p>&lt;defs&gt;<br />
参照が想定される要素をグループ化するためのもの。</p>
<h3>g要素</h3>
<p>要素をグループ化して共通の装飾をすることができます。<br />
また、id属性を指定しておくことで、グループ単位でのアニメーション等に使用できます。<br />
g要素に指定された属性値は内部の要素に継承されます。<br />
内部の要素では属性値を上書きすることもできます。</p>
<pre>&lt;g id="figs" fill="lightgreen" stroke="darkgreen" stroke-dasharray="2,2"&gt;
    &lt;rect x="10" y="10" width="100" height="100" fill="red" /&gt;
    &lt;circle cx="170" cy="60" r="50" /&gt;
&lt;/g&gt;</pre>
<p>文書構造的には、HTMLのdiv要素のような意味合いに近いかもしれません。<br />
title要素やdesc要素と一緒に使用することで的確な意味づけを行うことができます。</p>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-g.html" target="_blank">SVGサンプル - 図形のグループ化：g</a></p></blockquote>
<h3>symbol要素</h3>
<p>各要素をグループ化することに関してはg要素と同じですが、symbolはグループ化した時点では描画されません。<br />
use要素を使い参照することで描画されます。<br />
use要素を使って描画されたものはsymbol要素でグループ化された図形のインスタンスになります。<br />
Flashのシンボル機能に近いと思います。</p>
<p>※下記にも記載しますが、use要素のhrefを使うときは、xlinkの名前空間が必要になります。</p>
<pre>&lt;symbol id="figs" fill="lightgreen" fill-opacity="0.5"&gt;
    &lt;rect width="50" height="50" /&gt;
    &lt;rect x="20" y="20" width="50" height="50" /&gt;
&lt;/symbol&gt;</pre>
<p>g要素と違うのは、</p>
<ul>
<li>参照されなければ、描画されないこと</li>
<li>viewBox属性とpreserveAspectRatio属性を持つことができること</li>
</ul>
<p>です。<br />
HTML文書にsvgを読み込むような感じに近いです。</p>
<pre>&lt;symbol id="figs2" width="70" height="70" fill="lightgreen" fill-opacity="0.5" viewBox="0 0 100 100"&gt;
    &lt;rect width="50" height="50" /&gt;
    &lt;rect x="20" y="20" width="50" height="50" /&gt;
&lt;/symbol&gt;

&lt;use x="10" y="10" xlink:href="#figs2"/&gt;</pre>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-symbol.html" target="_blank">SVGサンプル - 図形のグループ化：symbol</a></p></blockquote>
<h3>defs要素</h3>
<p>参照が想定される要素をグループ化するためのもの。<br />
symbolと同じようにdefs要素内は参照されない限り描画されません。<br />
gやsymbolと似ていますが仕様書によると、</p>
<blockquote><p>&#8216;defs&#8217; 要素は被参照要素のためのコンテナ要素である。可読性と アクセシビリティ の要求から、参照される可能性のある要素は可能ならこの要素内に定義することが推奨される。<br />
<a href="http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/struct.html#DefsElement" target="_blank"> http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/struct.html#DefsElement</a></p></blockquote>
<p>とあるので、参照されるもの全体を包みこむように使うのが良いと思われます。<br />
上記で書いた例でも、全体をdefsで囲むほうが良いですね。</p>
<pre>&lt;defs&gt;
    &lt;g id="figs" fill="lightgreen" stroke="darkgreen" stroke-dasharray="2,2"&gt;
        &lt;rect x="10" y="10" width="100" height="100" fill="red" /&gt;
        &lt;circle cx="170" cy="60" r="50" /&gt;
    &lt;/g&gt;
&lt;/defs&gt;</pre>
<p>また、id属性を付けることは出来ますが、どうやら参照してまとめて描画させることはできないようです。<br />
個別にidを付けて参照します。</p>
<pre>&lt;defs id="figs"&gt;
    &lt;g id="figs-in" fill="lightgreen" stroke="darkgreen" stroke-dasharray="2,2"&gt;
        &lt;rect x="10" y="10" width="100" height="100" fill="red" /&gt;
        &lt;circle cx="170" cy="60" r="50" /&gt;
    &lt;/g&gt;
&lt;/defs&gt;

&lt;use xlink:href="#figs"/&gt; //描画されない
&lt;use xlink:href="#figs-in"/&gt; //描画される</pre>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-defs.html" target="_blank">SVGサンプル - 図形の参照</a></p></blockquote>
<h3>use要素</h3>
<p>上記の挙げた、グループ化要素を参照することでインスタンス化して再利用できるようになります。<br />
使いまわせるという事ですね。<br />
参照は、idを使います。<br />
use要素のhref属性値に「#hoge」のように参照先のidを指定します。</p>
<pre>&lt;defs&gt;
    &lt;g id="figs-in" fill="lightgreen" stroke="darkgreen" stroke-dasharray="2,2"&gt;
        &lt;rect x="10" y="10" width="100" height="100" fill="red" /&gt;
        &lt;circle cx="170" cy="60" r="50" /&gt;
    &lt;/g&gt;
&lt;/defs&gt;

&lt;use xlink:href="#figs-in"/&gt; //g要素を参照して描画</pre>
<p>注意するべき点は、use要素のhref属性値に参照先を指定する際、xlinkという規格を用います。<br />
xlinkはxmlの規格の一種なのでnamespaceを指定します。</p>
<pre>&lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"&gt;</pre>
<p>use要素を使用するときには、忘れないようにします。<br />
その他、a要素等でも使うので予め指定しておいてもいいかもしれません。</p>
<blockquote><p><a href="http://www.doraneko.org/xml/xlink/19980303/Overview.html" target="_blank">XMLリンク言語（xLink）</a></p></blockquote>
<p>use要素ですが、座標を設定することで、位置をずらすこともできます。<br />
また、いくつでも参照して描画できます。</p>
<pre>&lt;defs&gt;
    &lt;g id="figs-in" fill="lightgreen" stroke="darkgreen" stroke-dasharray="2,2"&gt;
        &lt;rect x="10" y="10" width="100" height="100" fill="red" /&gt;
        &lt;circle cx="170" cy="60" r="50" /&gt;
    &lt;/g&gt;
&lt;/defs&gt;

&lt;use xlink:href="#figs-in"/&gt; //g要素を参照して描画
&lt;use x="50" y="20" xlink:href="#figs-in"/&gt; //いくつでも描画できる</pre>
<p>参照できる要素としては、上記のグループ化要素をはじめ、svg、各図形要素（rect、circle等前回の記事参照）も参照することができます。<br />
何回も使用する予定のあるものはuseで使いまわしたほうが良さそうです。</p>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-use.html" target="_blank">SVGサンプル - 図形の参照</a></p></blockquote>
<h3>まとめ</h3>
<p>やろうと思えばどの要素を使ってもできるようなので、どの要素をいつ使うかっていう所が重要なのかなあと思います。<br />
HTMLもdivの使いどころに迷うように、また迷いそうな気がします。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wonder-boys.net/?feed=rss2&amp;p=432</wfw:commentRss>
		</item>
		<item>
		<title>[svg]基本図形</title>
		<link>http://blog.wonder-boys.net/?p=430</link>
		<comments>http://blog.wonder-boys.net/?p=430#comments</comments>
		<pubDate>Fri, 23 Jul 2010 22:48:08 +0000</pubDate>
		<dc:creator>wonder</dc:creator>
		
		<category><![CDATA[SVG]]></category>

		<guid isPermaLink="false">http://blog.wonder-boys.net/?p=430</guid>
		<description><![CDATA[SVGで描画できる基本的な図形について。

rect
長方形を描画することができます。
角が直角のものだけではなくて、角丸も描画できます。
&#60;rect x="5" y="5" width="50" height=" [...]]]></description>
			<content:encoded><![CDATA[<p>SVGで描画できる基本的な図形について。</p>
<p><span id="more-430"></span></p>
<h3>rect</h3>
<p>長方形を描画することができます。<br />
角が直角のものだけではなくて、角丸も描画できます。</p>
<pre>&lt;rect x="5" y="5" width="50" height="50" rx="5" ry="10" /&gt;

x: x座標
y: y座標
width: 幅
height: 高さ
rx: 角丸のx軸方向の半径
ry: 角丸のy軸方向の半径。省略時はrxと同じ値になる。</pre>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-rect.html" target="_blank"> SVGサンプル - 長方形の描画 </a></p></blockquote>
<h3>circle</h3>
<p>円を描画することができます。<br />
正円のみの描画です。</p>
<pre>&lt;circle cx="100" cy="100" r="50" /&gt;

cx: 中心のx座標
cy: 中心のy座標
r: 半径</pre>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-circle.html" target="_blank"> SVGサンプル - 円の描画 </a></p></blockquote>
<h3>ellipse</h3>
<p>楕円を描画することができます。</p>
<pre>&lt;ellipse cx="100" cy="100" rx="30" ry="50" /&gt;

cx: 中心のx座標
cy: 中心のy座標
rx: x軸方向の半径
ry: y軸方向の半径</pre>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-ellipse.html" target="_blank"> SVGサンプル - 楕円の描画 </a></p></blockquote>
<h3>line</h3>
<p>直線を描画することができます。<br />
2点の座標を指定することで、2点をつなぐ直線を描画します。<br />
2点間のみの描画ですので、続けて線を描画したい場合は次に紹介するpolylineを使用します。</p>
<pre>&lt;line x1="10" y1="10" x2="100" y2="100"　/&gt;

x1: 開始点のx座標
y1: 開始点のy座標
x2: 終了点のx座標
y2: 終了点のy座標</pre>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-line.html" target="_blank"> SVGサンプル - 線の描画 </a></p></blockquote>
<h3>polyline</h3>
<p>継続して線を描画することができます。<br />
カンマで区切った座標を並べることで、制限なく線を描画できます。<br />
fill属性値を指定しないと塗り色がついてしまうので、線だけの描画をしたい場合はfill=&#8221;none&#8221;を指定しておきます。</p>
<pre>&lt;polyline points="20,50 10,40 10,20 20,10" fill="none　/&gt;</pre>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-polyline.html" target="_blank"> SVGサンプル - 連続する線の描画 </a></p></blockquote>
<h3>polygon</h3>
<p>多角形を描画することができます。<br />
指定方法はpolylineと同じです。<br />
polylineは線が閉じないのに対して、polygonは線が閉じて多角形になります。</p>
<pre>&lt;polygon points="20,50 10,40 10,20 20,10"　/&gt;</pre>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-polygon.html" target="_blank"> SVGサンプル - 多角形の描画 </a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.wonder-boys.net/?feed=rss2&amp;p=430</wfw:commentRss>
		</item>
		<item>
		<title>[その他]AR（拡張現実）あれこれ</title>
		<link>http://blog.wonder-boys.net/?p=426</link>
		<comments>http://blog.wonder-boys.net/?p=426#comments</comments>
		<pubDate>Mon, 19 Jul 2010 04:18:40 +0000</pubDate>
		<dc:creator>wonder</dc:creator>
		
		<category><![CDATA[AS3.0]]></category>

		<category><![CDATA[雑記]]></category>

		<category><![CDATA[AR]]></category>

		<category><![CDATA[FLARToolKit]]></category>

		<guid isPermaLink="false">http://blog.wonder-boys.net/?p=426</guid>
		<description><![CDATA[ARってすごい技術。
調べてみるとすでにいろいろなところで使われています。
Flashではすでにライブラリもあるので比較的簡単に実現できるようです。

ARとは
拡張現実（かくちょうげんじつ）とは現実環境にコンピュータを [...]]]></description>
			<content:encoded><![CDATA[<p>ARってすごい技術。<br />
調べてみるとすでにいろいろなところで使われています。<br />
Flashではすでにライブラリもあるので比較的簡単に実現できるようです。</p>
<p><span id="more-426"></span></p>
<h3>ARとは</h3>
<blockquote><p>拡張現実（かくちょうげんじつ）とは現実環境にコンピュータを用いて情報を付加提示する技術、および情報を付加提示された環境そのものを示す。英語表記はAugmented Reality 、省略形はAR。<br />
<a href="http://ja.wikipedia.org/wiki/拡張現実" target="_blank"> 拡張現実 - wikipedia </a></p></blockquote>
<p>漫画でいうと、<br />
「電脳コイル」のメガネ。<br />
「ドラゴンボール」のスカウター。<br />
みたいなものです。<br />
すごい、未来の技術みたいでわくわくしますね。</p>
<h3>バーチャルリアリティみたいもの？</h3>
<p>バーチャルリアリティは仮想現実とも言われるように全てがバーチャルなのに対してARは現実とバーチャルな物体を組み合わせて表現します。</p>
<h3>Webでの使われ方</h3>
<p>主に、Webカメラを通してマーカーを認識し、3Dのバーチャルな物体を表示させることが多いようです。<br />
また、マーカーだけではなくGPS情報を元に物体を表示させることもあります。「セカイカメラ」等。</p>
<p>ARはあくまでも現実にバーチャルな物体を付加し表示すること。<br />
webカメラありき、マーカーありきという考え方はしないほうがいいかも。<br />
ゆくゆくは、特別なマーカーではなくて実在するものがマーカーの代わりになったりするかもしれません。<br />
とはいえ、今段階では一番実装が現実的です。</p>
<h3>コンテンツ</h3>
<p>・<a href="http://support.sekaicamera.com/ja" target="_blank">セカイカメラ</a><br />
iphone app。<br />
GPSデータをもとに登録されたデータを表示させる。<br />
<a href="http://www.youtube.com/watch?v=FkGJ6WU6Te0" target="_blank"> サンプル動画</a></p>
<p>・<a href="http://mm10.binylrecords.com/ar/" target="_blank">MONKEY MAJIK 「BEST」</a><br />
アルバムのジャケットにマーカーをつけて販売。<br />
<a href="http://www.youtube.com/watch?v=Dcl-7wvuV7A&amp;feature=player_embedded#!" target="_blank"> サンプル動画</a></p>
<p>・<a href="http://www.iamironman2.com/uk/" target="_blank">アイアンマン2</a><br />
公式サイトでARコンテンツを展開。<br />
アイアンマンのマスクを表示。<br />
<a href="http://vimeo.com/11141217" target="_blank"> サンプル動画</a></p>
<p><strong>・エヴァンゲリオン</strong><br />
専用のiphoneアプリを箱根の特定の場所で使用すると実物大のエヴァンゲリオンが見られる。<br />
惜しくも中止になったようです。</p>
<p>・<a href="http://www.jisf.or.jp/kids/go_seitetsusho/" target="_blank">鉄の工場、製鉄所へGO!</a><br />
マーカーをダウンロードさせて、3Dコンテンツを見せる。<br />
子供向け。<br />
<a href="http://www.youtube.com/watch?v=pk7Xy01wsiI" target="_blank"> サンプル動画</a></p>
<p>・<a href="http://www.sony.jp/hitokoto/ar-simulation/" target="_blank">ARレイアウトシュミレーター - sony</a><br />
sony製品のレイアウトをシュミレートできる。</p>
<p>2009年後半から2010年にかけて、エンターテイメントの分野ではもうかなり使われている印象。<br />
技術的な壁はもうないのかも。<br />
ARコンテンツ開発をうたっている会社もかなり増えている印象。</p>
<h3>ARを実装するためのライブラリ</h3>
<p>現在は様々な言語でライブラリが用意されています。</p>
<p>・<a href="http://www.hitl.washington.edu/artoolkit/" target="_blank">ARToolKit</a><br />
C言語。1998年にワシントン大学HIT研究室で加藤博一氏が開発。世界初のARライブラリ。</p>
<p>・<a href="http://nyatla.jp/nyartoolkit/wiki/index.php" target="_blank">NyARToolKit</a><br />
Java。A虎@nyatla.jp氏によって、CからJavaに移植。<br />
Sliverlightとか、processingとか。</p>
<p>・<a href="http://www.libspark.org/wiki/saqoosha/FLARToolKit" target="_blank">FLARToolKit</a><br />
Actionscript3.0。Saqooshaさんが移植。</p>
<p>自分は、actionscript3.0しかだめなので以降FLARToolKitについて調べています。</p>
<h3>ライブラリのライセンス</h3>
<p>2種類のライセンスから選べます。</p>
<p><strong>●GPL</strong><br />
無料で使用可能。<br />
ただし、ソースの公開が条件。</p>
<p><strong>●商用ライセンス</strong><br />
有料。ソースは公開しなくてもよい。<br />
200,000円ぐらいから。</p>
<p>実際に案件で使用する場合には注意。<br />
詳しくは以下。</p>
<blockquote><p><a href="http://www.libspark.org/wiki/saqoosha/FLARToolKit" target="_blank">http://www.libspark.org/wiki/saqoosha/FLARToolKit</a></p></blockquote>
<h3>ライブラリの仕事</h3>
<ul>
<li>マーカーを認識する</li>
<li>マーカーから座標を特定する。</li>
</ul>
<p>マーカー認識と座標の特定が主な仕事。<br />
その他のオブジェクトの表示等は別で行う。<br />
FLARToolKitの場合は、Papervision3D等のライブラリを使って作成する。</p>
<h3>マーカー</h3>
<p>特定の決まりごとを守ればある程度自由がきく。</p>
<ul>
<li>色のコントラストを一定の濃さにすること。</li>
<li>上下左右が判別できること。</li>
<li>内側と外側の比率が1:2:1になること。</li>
</ul>
<p>基本的なマーカーの認識方法は以下。</p>
<blockquote><p><a href="http://sixwish.jp/Flartoolkit/Marker/section01/" target="_blank">ARマーカーの基本 - The Sixwish project</a></p></blockquote>
<h3>独自マーカーの作成</h3>
<p>独自でマーカーを作成したい場合は、このサイトが便利。</p>
<blockquote><p><a href="http://flash.tarotaro.org/ar/MarkerGeneratorOnline.html" target="_blank">ARToolKit Marker Generator</a></p></blockquote>
<p>マーカー画像の解像度も選べる。<br />
この場合、解像度が高いほど認識の制度は落ちるようですが。</p>
<h3>まとめ</h3>
<p>思ったよりかなり浸透しているなあという印象。<br />
コンテンツとしてのインパクトはかなりあるし、視覚的に確認できるので一般消費者向けにはかなり効力を発揮するのだと思いました。<br />
今後は、andoroid用、iphone用のライブラリも整備されてくるのでARのアプリケーションもかなり増えると思います。</p>
<p>BtoCの案件なら依頼されたり提案に使うような日が近いかもですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wonder-boys.net/?feed=rss2&amp;p=426</wfw:commentRss>
		</item>
		<item>
		<title>[svg]viewBox属性とpreserveAspectRatio属性</title>
		<link>http://blog.wonder-boys.net/?p=424</link>
		<comments>http://blog.wonder-boys.net/?p=424#comments</comments>
		<pubDate>Sat, 17 Jul 2010 22:27:21 +0000</pubDate>
		<dc:creator>wonder</dc:creator>
		
		<category><![CDATA[SVG]]></category>

		<category><![CDATA[preserveAspectRatio]]></category>

		<category><![CDATA[viewBox]]></category>

		<guid isPermaLink="false">http://blog.wonder-boys.net/?p=424</guid>
		<description><![CDATA[viewBox属性とpreserveAspectRatio属性についてです。

viewBox属性
svgの要素にはviewBox属性値を指定することができます。
viewBoxというのは簡単に言うと
svg要素を表示す [...]]]></description>
			<content:encoded><![CDATA[<p>viewBox属性とpreserveAspectRatio属性についてです。</p>
<p><span id="more-424"></span></p>
<h3>viewBox属性</h3>
<p>svgの要素にはviewBox属性値を指定することができます。<br />
viewBoxというのは簡単に言うと</p>
<blockquote><p>svg要素を表示するエリアを決定する</p></blockquote>
<p>ことです。<br />
viewBoxの指定方法は以下のようにします。</p>
<pre>viewBox="a b c d"

a　：　表示エリアのx座標原点の位置
b　：　表示エリアのy座標原点の位置
c　：　svg画像の表示幅
d　：　svg画像の表示高さ</pre>
<p>です。単位は全てpxです。<br />
分かりづらいので例をあげます。<br />
まずは、前半について。</p>
<pre>&lt;svg width="300" height="300" viewBox="10 10 300 300"&gt;
    &lt;rect x="0" y="0" width="100" height="100" /&gt;
&lt;/svg&gt;</pre>
<p>この場合、svg画像としては横100px、縦100pxの四角が描画されます。<br />
viewBoxで原点の位置を指定していますが、これは原点をx軸に10px、y軸に10px移動させるということなので画像自体が左上に移動します。</p>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-viewbox.html" target="_blank"> SVGサンプル / viewBoxの設定（原点位置の変更） </a></p></blockquote>
<p>画像を移動させるのではなくて、原点が移動するということなので注意が必要です。<br />
次に表示エリアの指定部分を変更してみます。</p>
<pre>&lt;svg width="300" height="300" viewBox="0 0 50 50"&gt;
    &lt;rect x="0" y="0" width="100" height="100" /&gt;
&lt;/svg&gt;</pre>
<p>こうすると、指定した原点から幅50px、高さ50px分だけ表示されます。<br />
しかも、表示エリアの大きさは変わりませんので拡大したような形になります。</p>
<p>逆に大きい値を指定することで縮小したように見せることもできます。</p>
<pre>&lt;svg width="300" height="300" viewBox="0 0 200 200"&gt;
    &lt;rect x="0" y="0" width="100" height="100" /&gt;
&lt;/svg&gt;</pre>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-viewbox02.html" target="_blank"> SVGサンプル / viewBoxの設定（表示エリアの指定） </a></p></blockquote>
<p>さてここで、もともと指定していた画像サイズ（width,height）とviewBoxのサイズの比率が違う場合はどうなるのでしょうか。</p>
<pre>&lt;svg width="300" height="300" viewBox="0 0 200 100"&gt;
    &lt;rect x="0" y="0" width="100" height="100" /&gt;
&lt;/svg&gt;</pre>
<p>このような場合ですね。</p>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-viewbox03.html" target="_blank"> SVGサンプル / viewBoxの設定（viewBoxと表示エリアで設定した比率が違う場合） </a></p></blockquote>
<p>どうでしょうか。<br />
viewBoxの比率を維持したまま表示されていますよね。<br />
svgは画像でもあるので、比率が変わってしまったらおかしいからですよね。<br />
では、比率が変わってもいいから幅、高さともに表示エリアいっぱいに表示させたい場合はどうするのか。</p>
<p>その場合は、preserveAspectRatio属性を指定します。</p>
<h3>preserveAspectRatio属性</h3>
<p>上記にも書いたとおり元々の画像サイズとviewBoxで指定したサイズの比率が違う場合にどうするかという指定です。</p>
<pre>preserveAspectRatio="描画方法 [slice or meet]"

&lt;svg width="300" height="300" viewBox="10 10 200 100" preserveAspectRatio="xMidyMid slice"&gt;
    &lt;rect x="0" y="0" width="100" height="100" /&gt;
&lt;/svg&gt;</pre>
<p>のように指定します。</p>
<h4>■描画方法</h4>
<p>元々の画像サイズとviewBoxで指定したサイズの比率が違う場合にどこに基準をおくかということ。<br />
幅を優先するのは、高さを優先するのか。<br />
はたまた、中央に揃えるのか。<br />
主なものをあげると、</p>
<blockquote><p>【none】<br />
均等な伸縮を強制しない</p>
<p>【xMidyMid】（デフォルト）<br />
要素の viewBox のＸの中央値をビューポートのＸの中央値に揃える。<br />
要素の viewBox のＹの中央値をビューポートのＹの中央値に揃える。</p></blockquote>
<p>他にもかなり種類があるので、詳しくは下記にて確認ください。</p>
<blockquote><p><a href="http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/coords.html#PreserveAspectRatioAttribute" target="_blank"> http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/coords.html#PreserveAspectRatioAttribute </a></p></blockquote>
<p>デフォルトでは、比率を保って描画されます。<br />
比率を保たずに描画する場合は、上記の通り「none」を指定します。</p>
<blockquote><p><a href="http://wonder-boys.net/test/svg/svg-viewbox04.html" target="_blank"> SVGサンプル / viewBoxの設定（比率の調整） </a></p></blockquote>
<h4>■[slice or meet]</h4>
<p>これは、viewBoxの全体が収まるようにするか、はみだすようにするかの指定です。</p>
<p>slice　viewBox は他の条件を満たしつつ、出来るだけ小さく伸縮される。<br />
meet　viewBox は他の条件を満たしつつ、出来るだけ大きく伸縮される。</p>
<p>と、ちょっと意味がわからないですね。<br />
meetを指定するとviewBoxは表示エリアから出ることなく拡大・縮小されます。つまり確実に全体が表示されます。<br />
一方、sliceを指定すると上記で指定した描画方法に則りはみでた部分は切ってしまいます。つまりは表示されない部分がでてきます。</p>
<h3>まとめ</h3>
<p>viewBox属性の指定は、全体の拡大縮小をいっぺんに指定できてしまうところがいいですね。<br />
これはベクターならではの利点でしょうか。</p>
<p>また、原点の位置の移動も指定できるので、下記のような使い方もできます。</p>
<blockquote><p><a href="http://www.carto.net/svg/samples/viewbox.shtml" target="_blank"> Example for viewbox control - carto:net </a></p></blockquote>
<p>がんばって使いこなしましょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wonder-boys.net/?feed=rss2&amp;p=424</wfw:commentRss>
		</item>
		<item>
		<title>[actionscript3.0]緩急をつけた動き</title>
		<link>http://blog.wonder-boys.net/?p=421</link>
		<comments>http://blog.wonder-boys.net/?p=421#comments</comments>
		<pubDate>Sat, 03 Jul 2010 13:18:18 +0000</pubDate>
		<dc:creator>wonder</dc:creator>
		
		<category><![CDATA[AS3.0]]></category>

		<category><![CDATA[イージング]]></category>

		<guid isPermaLink="false">http://blog.wonder-boys.net/?p=421</guid>
		<description><![CDATA[緩急をつけた基本的な動きについて

基本
ballオブジェクトを作成して動かすことにします。
package {
    import flash.display.Sprite;
    import flash.eve [...]]]></description>
			<content:encoded><![CDATA[<p>緩急をつけた基本的な動きについて</p>
<p><span id="more-421"></span></p>
<h3>基本</h3>
<p>ballオブジェクトを作成して動かすことにします。</p>
<pre>package {
    import flash.display.Sprite;
    import flash.events.Event;

    public class FlashTest extends Sprite {
        private var ball:Ball;

        public function FlashTest() {
            ball = new Ball(20);
            ball.x = 20;
            ball.y = stage.stageHeight / 2;
            addChild( ball );

            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame(e:Event):void {
            //処理を書く
        }
    }
}

/* ボールオブジェクト */
import flash.display.Sprite;

class Ball extends Sprite {
    public var radius:Number;
    public var color:uint;

    public function Ball(radius:Number=40, color:uint=0Xff0000){
        this.radius = radius;
        this.color = color;
        init();
    }

    public function init():void {
        graphics.beginFill(color);
        graphics.drawCircle(0, 0, radius);
        graphics.endFill();
    }
}</pre>
<h3>等速運動</h3>
<p>これは簡単。<br />
単純にball.xをある一定の数増やしていくだけ。</p>
<pre>ball.x += 5;</pre>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="等速運動 - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/3huS" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/3huS" title="等速運動 - wonderfl build flash online">等速運動 - wonderfl build flash online</a></div>
<h3>加速する運動</h3>
<p>ballを加速させるには、一定の速度に「加速度」を加えます。<br />
そうすることで、フレームが進むに従って速度が増えていきます。</p>
<pre>vx += ax;　//速度に加速度を追加
ball.x += vx; //x座標を増やしていく</pre>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="加速する運動 - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/6zTD" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/6zTD" title="加速する運動 - wonderfl build flash online">加速する運動 - wonderfl build flash online</a></div>
<h3>減速する運動</h3>
<p>上の2つとは少し変えて、目的座標との差の何割か進むようにします。<br />
つまりは進んでいく距離がだんだんと短くなります。</p>
<pre>var dx:Number = target - ball.x; //目的座標との差を取得
ball.x += dx * ax; //差の何割かだけ進む</pre>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="減速する運動 - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/wS4X" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/wS4X" title="減速する運動 - wonderfl build flash online">減速する運動 - wonderfl build flash online</a></div>
<h3>加速してから減速する運動</h3>
<p>減速する運動で使った何割かの部分（ax）の値をだんだん増やしていきます。<br />
最初は小さい値から始めることで、加速していくように見えそのうち上記と同じように減速していきます。</p>
<pre>var dx:Number = target - ball.x; //目的座標との差を取得
ax += per; //何割かの部分を増やす
ball.x += dx * ax; //差の何割かだけ進む</pre>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="加速してから減速する運動 - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/hK3K" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/hK3K" title="加速してから減速する運動 - wonderfl build flash online">加速してから減速する運動 - wonderfl build flash online</a></div>
<h3>サインカーブを使った運動</h3>
<p>サインカーブというのはMath.sin()が描くカーブ<br />
検索してもらうといろんな画像がでると思いますが、値としてはどんな数値を入れても -1.0 ～ 1.0　が返ってきます。<br />
この返ってくる値に変化を加えることでx座標に変換します。</p>
<pre>ball.x = (Math.sin( fx ) + 1 ) * 200; //Math.sin()の値を取得
fx += 0.05; //サインカーブに入力する値を変化させる</pre>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="サインカーブを使った運動 - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/5ER0" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/5ER0" title="サインカーブを使った運動 - wonderfl build flash online">サインカーブを使った運動 - wonderfl build flash online</a></div>
<h3>曲線を描く運動</h3>
<p>「加速してから減速する運動」を少し変更すると曲線を描くようになります。<br />
まずは、x座標だけではなくy座標も変化するようにします。</p>
<pre>var dx:Number = target - ball.x;
var dy:Number = target - ball.y;
ax += per;
ay += per;
ball.x += dx * ax;
ball.y += dy * ay;</pre>
<p>この状態で目標を動くオブジェクトにします。<br />
今回はもうひとつballインスタンスを作成します。</p>
<pre>var dx:Number = target.x - ball.x;
var dy:Number = target.y - ball.y;
ax += per;
ay += per;
ball.x += dx * ax;
ball.y += dy * ay</pre>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="曲線を描く運動 - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/1Zf1" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/1Zf1" title="曲線を描く運動 - wonderfl build flash online">曲線を描く運動 - wonderfl build flash online</a></div>
<h3>まとめ</h3>
<p>ちょっとしたコードでいろいろな動きを再現できるので覚えておいて損はないです。<br />
ここに書いたことについてはロクナナのイベントで城戸さんがお話されていたものを参考にしています。<br />
ぜひそちらもチェックしてみてください。</p>
<p><a href="http://event.67.org/?p=2139#report" target="_blank">http://event.67.org/?p=2139#report</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wonder-boys.net/?feed=rss2&amp;p=421</wfw:commentRss>
		</item>
		<item>
		<title>[actionscript3.0]インバースキネマティクス：リーチ</title>
		<link>http://blog.wonder-boys.net/?p=419</link>
		<comments>http://blog.wonder-boys.net/?p=419#comments</comments>
		<pubDate>Tue, 29 Jun 2010 13:18:50 +0000</pubDate>
		<dc:creator>wonder</dc:creator>
		
		<category><![CDATA[AS3.0]]></category>

		<category><![CDATA[IK]]></category>

		<category><![CDATA[reach]]></category>

		<guid isPermaLink="false">http://blog.wonder-boys.net/?p=419</guid>
		<description><![CDATA[前回に引き続きインバースキネマティクスです。
今回は、インバースキネマティクスのリーチについてです。

基本的な考え方
前回のドラッグは、先端が目標値に固定され、他のセグメントがそれについていく動きでしたが、今回のリーチ [...]]]></description>
			<content:encoded><![CDATA[<p>前回に引き続きインバースキネマティクスです。<br />
今回は、インバースキネマティクスのリーチについてです。</p>
<p><span id="more-419"></span></p>
<h3>基本的な考え方</h3>
<p>前回のドラッグは、先端が目標値に固定され、他のセグメントがそれについていく動きでしたが、今回のリーチは基点が固定され先端が目標値に向かっていく動きです。<br />
つまり、</p>
<blockquote><p>
先端　→　自由（目標値に向かおうとする）<br />
基点　→　固定
</p></blockquote>
<p>となります。<br />
目標値は引き続きマウス座標にします。</p>
<h3>セグメントを描画・回転</h3>
<p>ここまでは前回と同じです。<br />
セグメントを生成して目標値に向かって回転させます。</p>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="セグメントをマウスに向ける：IK drag (2) - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/q15A" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/q15A" title="セグメントをマウスに向ける：IK drag (2) - wonderfl build flash online">セグメントをマウスに向ける：IK drag (2) - wonderfl build flash online</a></div>
<h3>リーチの仕組み</h3>
<p>ここからがちょっとややしい所です。<br />
前回のドラッグのときは、マウスに近いほうから</p>
<blockquote><p>
・セグメントの回転<br />
・セグメントの位置決定</p>
<p>↓</p>
<p>・次のセグメントの回転<br />
・次のセグメントの位置決定</p>
<p>↓</p>
<p>つづく
</p></blockquote>
<p>というように、ひとつひとつについて回転と位置決定が同時に行われていました。<br />
しかし今回のリーチについては違います。<br />
基点が固定されているので目標点に近いほうから行っていくと基点がずれてしまいます。<br />
そこで、回転と位置決定を分けて設定します。</p>
<blockquote><p>
※目標点から<br />
・セグメントの回転<br />
・次のセグメントの回転<br />
　　・<br />
　　・</p>
<p>↓</p>
<p>※基点から<br />
・セグメントの位置決定<br />
・セグメントの位置決定<br />
　　・<br />
　　・
</p></blockquote>
<p>というようにします。<br />
重要なのは、設定していく順番が逆になっていることです。<br />
注意しましょう。</p>
<p>仕組みがわかりやすいように作ってみました。<br />
クリックすると設定が進んでいきます。</p>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="リーチの仕組み：IK reach (2) - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/mP09" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/mP09" title="リーチの仕組み：IK reach (2) - wonderfl build flash online">リーチの仕組み：IK reach (2) - wonderfl build flash online</a></div>
<p>ここでもうひとつ重要なのは、回転目標は先のセグメントの一方のポイントになることです。<br />
コードを見てもらうとわかります。</p>
<pre>
/* seg0 */
var dx:Number = mouseX - seg0.x;
var dy:Number = mouseY - seg0.y;
var angle:Number = Math.atan2( dy, dx );
seg0.rotation = angle * 180 / Math.PI;

var w:Number = seg0.getPin().x - seg0.x;
var h:Number = seg0.getPin().y - seg0.y;
tx = mouseX - w;
ty = mouseY - h;

/* seg1 */
var dx:Number = tx - seg1.x;
var dy:Number = ty - seg1.y;
var angle:Number = Math.atan2( dy, dx );
seg1.rotation = angle * 180 / Math.PI;

var w:Number = seg1.getPin().x - seg1.x;
var h:Number = seg1.getPin().y - seg1.y;
tx = tx - w;
ty = ty - h;
</pre>
<p>tx、tyという値をとりそのポイントに向けて回転します。<br />
また、上記のサンプルを見てもらうとわかるようにこの方法は位置についてはあまり正確ではありません。<br />
ただ、毎フレーム実行されるので実際に実行した場合はあまり気になりません。</p>
<h3>3つのセグメントをリーチさせる</h3>
<p>上記のサンプルを整理して、3つのセグメントをリーチさせます。</p>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="3つのセグメントをリーチさせる：IK reach (3) - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/ywDE" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/ywDE" title="3つのセグメントをリーチさせる：IK reach (3) - wonderfl build flash online">3つのセグメントをリーチさせる：IK reach (3) - wonderfl build flash online</a></div>
<p>なんだか面白い動きですね。</p>
<h3>複数のセグメントをリーチさせる</h3>
<p>あとは、コードをまとめてセグメントを増やすだけです。</p>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="複数のセグメントをリーチさせる：IK reach (4) - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/hXfD" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/hXfD" title="複数のセグメントをリーチさせる：IK reach (4) - wonderfl build flash online">複数のセグメントをリーチさせる：IK reach (4) - wonderfl build flash online</a></div>
<h3>ひもがいっぱい</h3>
<p>さて、あとは好きにいじってみましょう。<br />
ひもをいっぱい配置してみます。</p>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="ひもがいっぱい：IK reach (5) - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/bM55" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/bM55" title="ひもがいっぱい：IK reach (5) - wonderfl build flash online">ひもがいっぱい：IK reach (5) - wonderfl build flash online</a></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.wonder-boys.net/?feed=rss2&amp;p=419</wfw:commentRss>
		</item>
		<item>
		<title>[actionscript3.0]インバースキネマティクス：ドラッグ</title>
		<link>http://blog.wonder-boys.net/?p=415</link>
		<comments>http://blog.wonder-boys.net/?p=415#comments</comments>
		<pubDate>Sun, 27 Jun 2010 05:19:40 +0000</pubDate>
		<dc:creator>wonder</dc:creator>
		
		<category><![CDATA[AS3.0]]></category>

		<category><![CDATA[IK]]></category>

		<guid isPermaLink="false">http://blog.wonder-boys.net/?p=415</guid>
		<description><![CDATA[インバースキネマティクスを勉強中です。
インバースキネマティクスの中でもわかりやすいドラッグについてです。

基本的な考え方
インバースキネマティクスは、関節を持つ複数のセグメント(要素)をつなぎ合わせたものを使います。 [...]]]></description>
			<content:encoded><![CDATA[<p>インバースキネマティクスを勉強中です。<br />
インバースキネマティクスの中でもわかりやすいドラッグについてです。</p>
<p><span id="more-415"></span></p>
<h3>基本的な考え方</h3>
<p>インバースキネマティクスは、関節を持つ複数のセグメント(要素)をつなぎ合わせたものを使います。<br />
つなぎ合わせたものの端を一方を基点、もう一方を先端とすると先端部分の位置・角度から決めていき全体を描画します。</p>
<p>今回のドラッグについては、</p>
<blockquote><p>
先端　→　目標点<br />
基点　→　自由
</p></blockquote>
<p>の場合に使用します。<br />
今回は目標点はマウスにしますので、マウス追従するものを作ってみます。</p>
<p>※「先端」「基点」等の呼称は正式なものではないです。正式な呼称については調べてみてください。</p>
<h3>セグメントを描画</h3>
<p>まずは使用するセグメントを作ります。<br />
セグメントとセグメントは関節で繋がるのでいつのセグメントにつき1つの関節を作ります。</p>
<p>1つはオブジェクトが元々持っている、基準点を使います。<br />
つまり、obj.x、obj.yで参照できる点です。</p>
<p>もうひとつは、独自で作成します。<br />
今回はgetPin()で参照できる点を一つ作りました。</p>
<p>2つの関節点はわかりやすいように色を変えてあります。</p>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="セグメントを描画：IK drag (1) - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/yhgf" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/yhgf" title="セグメントを描画：IK drag (1) - wonderfl build flash online">セグメントを描画：IK drag (1) - wonderfl build flash online</a></div>
<h3>セグメントをマウスに向ける</h3>
<p>セグメントの状態を決める中でまずは角度を決めてみます。<br />
位置は中央に固定しておきます。</p>
<p>角度については基本的な三角関数を使っています。</p>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="セグメントをマウスに向ける：IK drag (2) - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/q15A" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/q15A" title="セグメントをマウスに向ける：IK drag (2) - wonderfl build flash online">セグメントをマウスに向ける：IK drag (2) - wonderfl build flash online</a></div>
<p>ここまではそんなに難しくないですね。</p>
<h3>セグメントをドラッグする</h3>
<p>それでは、一つのセグメントをドラッグしてみます。<br />
角度の決定は上記と同じです。</p>
<p>角度の決定をした後に、もう一つ位置の指定をします。<br />
今までは、基点（白い点）を固定して先端（赤い点）をマウスに向けました。<br />
これを、先端をマウスに固定して、基点部分を自由にしています。</p>
<p>ちょっとややこしいですね。</p>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="セグメントをドラッグする：IK drag (3) - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/92Ve" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/92Ve" title="セグメントをドラッグする：IK drag (3) - wonderfl build flash online">セグメントをドラッグする：IK drag (3) - wonderfl build flash online</a></div>
<p>角度を決めた後に、位置を決めている部分です。</p>
<pre>
var w:Number = seg0.getPin().x - seg0.x;
var h:Number = seg0.getPin().y - seg0.y;
seg0.x = mouseX - w;
seg0.y = mouseY - h;
</pre>
<p>上の二行でセグメントの2点の距離を測ります。<br />
下の二行でセグメントの基準点を距離分ずらします。</p>
<p>そうすることで、先端がマウスに合うようにしています。<br />
ここが今回の一番のキモですね。</p>
<p>これができてしまえば、あとはつなげるだけですから。</p>
<h3>2つのセグメントを連動させドラッグする</h3>
<p>さて、それでは2つのセグメントをつなげてみます。<br />
これはとても簡単。<br />
最初のセグメントはマウスを目標点にして、2つ目は最初のセグメントの基準点を目標点にすればいいだけです。</p>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="2つのセグメントを連動させドラッグする：IK drag (4) - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/hmTy" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/hmTy" title="2つのセグメントを連動させドラッグする：IK drag (4) - wonderfl build flash online">2つのセグメントを連動させドラッグする：IK drag (4) - wonderfl build flash online</a></div>
<p>できましたね。</p>
<h3>複数のセグメントを連動させドラッグする</h3>
<p>あとは、セグメントを増やすだけ。<br />
位置決定部分を使いまわせるように書き直します。</p>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="複数のセグメントを連動させドラッグする：IK drag (5) - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/sku5" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/sku5" title="複数のセグメントを連動させドラッグする：IK drag (5) - wonderfl build flash online">複数のセグメントを連動させドラッグする：IK drag (5) - wonderfl build flash online</a></div>
<p>これで完成。<br />
以外に簡単にできましたね！</p>
<h3>紐のようなものをドラッグする</h3>
<p>セグメント部分の幅や高さ、色や個数などを変更することでいろんなものを作ることが出来ます。<br />
幅と高さを小さくすると紐みたいになりました。</p>
<div style="text-align:center;width:465px;margin:0 auto 20px auto;"><iframe title="紐のようなものをドラッグする：IK drag (6) - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/lpNe" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/c/lpNe" title="紐のようなものをドラッグする：IK drag (6) - wonderfl build flash online">紐のようなものをドラッグする：IK drag (6) - wonderfl build flash online</a></div>
<p>あとは、アイデア次第ですよ！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wonder-boys.net/?feed=rss2&amp;p=415</wfw:commentRss>
		</item>
	</channel>
</rss>
