<?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>Takepepe.com &#187; JavaScript</title>
	<atom:link href="https://takepepe.com/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>https://takepepe.com</link>
	<description>Designer::develop</description>
	<lastBuildDate>Sun, 16 Jun 2013 15:40:24 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>canvas #001 WebRTC</title>
		<link>https://takepepe.com/canvas-001-webrtc/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=canvas-001-webrtc</link>
		<comments>https://takepepe.com/canvas-001-webrtc/#comments</comments>
		<pubDate>Tue, 19 Feb 2013 03:37:27 +0000</pubDate>
		<dc:creator>Takepepe</dc:creator>
				<category><![CDATA[html5]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://takepepe.com/?p=230</guid>
		<description><![CDATA[こんにちは。今日は東京でも雪が降っています。 ゲレンデ好きでも、日常の雪は勘弁して欲しいところ。 前回、Fla [...]]]></description>
				<content:encoded><![CDATA[<p><script type="text/javascript" src="http://jsdo.it/blogparts/eW16q/js"></script></p>
<p>こんにちは。今日は東京でも雪が降っています。<br />
  ゲレンデ好きでも、日常の雪は勘弁して欲しいところ。</p>
<p>前回、Flashでカメラ映像にDisplacementMapフィルターを適用する記事を書きました。<br />
  今回は同様の表現をcanvasで実装していきます。<br />
  js.do.itにアップしている上のデモはPCのChromeで見て下さい。（v.24.0以降）<br />
  また、再生の際にカメラへのアクセス許可が求められるので、許可してください。（ページ上部）</p>
<h3>ながれ</h3>
<ol>
<li>WebRTCでカメラにアクセス</li>
<li>マップ用canvasの用意</li>
<li>レイヤー配置</li>
<li>レンダリング</li>
</ol>
<h2>1.WebRTCでカメラにアクセス</h2>
<p>設定無しに、ウェブカメラにアクセス出来るメジャーブラウザはいまのところChromeのみなので、<br />
Chrome閲覧を想定したコードになっています。(2013.2.19現在)<br />
  WebRTCはマイクからの音声も拾えるようになっています。</p>
<h5>Main.js</h5>
<pre class="brush: jscript; title: ; notranslate">
  function setCamera(){
		
		if(navigator.webkitGetUserMedia) {
			navigator.webkitGetUserMedia( {video:true}, succeedUseCamera, failedUseCamera );
		}else{
			browserError();
		}
		
	}
  </pre>
<h2>2.マップ用canvasの用意</h2>
<p>前回同様、マップ画像はスクリプト上で生成します。<br />
  グラデーションの書き方はActionScriptとは違うので調べてみてください。<br />
  レンズにはまる様、サイズ調整などしています。見辛くてすみません。</p>
<h5>Main.js</h5>
<pre class="brush: jscript; title: ; notranslate">
  function setMap(){
		
		map = document.createElement('canvas');
		map.width = WIDTH;
		map.height = HEIGHT;
		map_ctx = map.getContext('2d');
		map_ctx.beginPath();
		
		var grad = map_ctx.createRadialGradient(WIDTH*0.5*offset,HEIGHT*0.5*offset,0,WIDTH*0.5*offset,HEIGHT*0.5*offset,WIDTH*0.5*offset);
		grad.addColorStop(0,'red'); 
		grad.addColorStop(1,'blue');
		map_ctx.fillStyle = grad;
		map_ctx.rect(0,50, WIDTH*offset,HEIGHT*offset);
		map_ctx.fill();
		
	}
  </pre>
<h2>3.レイヤー配置</h2>
<p>必要なレイヤーを順番に配置していきます。<br />
  カメラ映像の映写が始まるまで、レンズが外れたような見た目にならないよう、リソースの画像も敷いています。<br />
  マップ用canvasとvideoタグは配置する必要はありません。</p>
<h5>Main.js</h5>
<pre class="brush: jscript; title: ; notranslate">
  function setCanvas(){
		
		lens = new Image();
		lens.src = &quot;http://jsrun.it/assets/1/Y/a/h/1Yahi.png&quot;;
		
		frame = new Image();
		frame.src = &quot;http://jsrun.it/assets/n/P/B/W/nPBWU.png&quot;;
		
		mirror = document.createElement('canvas');
		mirror_ctx = mirror.getContext('2d');
		
		c = document.createElement('canvas');
		ctx = c.getContext('2d');
		
		lens.width = mirror.width = frame.width = c.width = WIDTH;
		lens.height = mirror.height = frame.height = c.height = HEIGHT;
		
		var objBody = document.getElementsByTagName(&quot;body&quot;).item(0);
		objBody.appendChild(lens);
		objBody.appendChild(c);
		objBody.appendChild(frame);
		
	}
  </pre>
<h2>4.レンダリング</h2>
<p>ActionScriptと違い、現状ではcanvasのAPIやCSSでブレンドモードの設定は出来ません。<br />
  ここで、以下のライブラリを利用させていただきました。</p>
<p><a href="https://github.com/Phrogz/context-blender" target="_blank">context-blender.js @Author Phrogz</a></p>
<p>また、DisplacementMapFilterもcanvasのAPIにはないため、こちらも外部ライブラリに頼りです。</p>
<p><a href="http://www.soundstep.com/blog/2012/04/25/javascript-displacement-mapping/" target="_blank">displacement.js @Author Romuald</a></p>
<h5>Main.js</h5>
<pre class="brush: jscript; title: ; notranslate">
  function draw(){
		
		ctx.clearRect(0, 0, WIDTH, HEIGHT);
		ctx.drawImage(lens, 0, 0, WIDTH, HEIGHT);
		
		mirror_ctx.drawImage(video, 0, 0, WIDTH, HEIGHT);
		mirror_ctx.setTransform(-offset, 0, 0, offset, WIDTH*offset, 50);
		
		var filter = new filters.DisplacementMap(
		mirror,
		map,
		mirror,
		new filters.Point(0,30),
		0,
		-30,
		filters.ColorChannel.RED,
		filters.ColorChannel.RED);
		filter.draw();
		
		mirror_ctx.blendOnto( ctx, 'overlay');
		
	}
  </pre>
<p>結果として、かなり重い実装になってしまいました。<br />
  DisplacementMapFilterの処理に時間がかかっているので、次回のjavascript関連投稿は<br />
  この処理をホヤホヤのCSS Shadersで実装したいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>https://takepepe.com/canvas-001-webrtc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

 Served from: takepepe.com @ 2026-04-07 06:36:47 by W3 Total Cache -->