SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

HTML Canvasの3D対応への道を探る

3Dゲームで理解する、HTML Canvasの基本

ダウンロード サンプルソース (9.0 KB)

グラフィックスのコンテキスト

 HCに対して直接描画を行うわけではありません。次に示すように、キャンバス(canvas)から2Dグラフィックスのコンテキストを取得し、そのコンテキストに対して描画を行います。

  var context = canvas.getContext( "2d" );
  context.fillStyle = "#fff";
  context.strokeRect( 20, 20, 60, 60 );

 最初の1行でグラフィックスのコンテキストを取得しています("2d"という指定に注意してください。"3d"コンテキストは現在まだ提供されていません)。2行目で現在の色を設定し、3行目で四角形を描画しています。

HC要素の2通りの作り方

 他の多くのHTML要素と同様、HCにも2通りの作り方があります。その1つは、次のようにマークアップで宣言する方法です。

  <canvas id="canvas" style="border: solid 1px" width="400" height="400">
  </canvas>

 この方法を用いた場合は、getElementById()呼び出しでcanvasオブジェクトを取得する必要があります。

  var canvas = document.getElementById( "canvas" );

 もう1つは、JavaScriptでプログラム的に作る方法です。

  var canvas = document.createElement( "canvas" );
  canvas.style.border = "1px solid";
  canvas.width = 400;
  canvas.height = 400;
  canvas.style.width = 400;
  canvas.style.height = 400;
  document.documentElement.appendChild( canvas );

 どちらの方法も得られる結果は同じなので、都合に応じて使い分ければよいでしょう。本稿の3Dゲームでは2番目の方法を使用しています。

3Dレンダリング

 さて、HTML Canvasによる描画の基本が理解できたところで、ダウンロードしたソースコードに含まれている3Dレンダリングゲームに話を移しましょう。詳細は本稿の範囲を超えるので、重要な点のみをかいつまんで説明します。

 この3Dワールドはグリッドで構成されます。グリッドの各要素は、塗り潰された状態か空の状態のどちらかを取ります。このグリッドをレンダリングするということは、各面を3Dポリゴンに変換し、それらの3Dポリゴンを2Dに投影し、2DポリゴンをHCで描画することを意味します。

 これをサポートするため、ダウンロードしたソースコード内の3Dゲームには2Dおよび3Dの点を表すクラス(P2およびP3)とポリゴンクラス(Polygon2およびPolygon3)が存在します。Polygon3.project()メソッドは、ポリゴンを2D平面に投影して Polygon2を生成します。そしてPolygon2が、moveToメソッドとlineToメソッドによりHCに描画されます。

 ポリゴンの塗り潰しという力仕事がHC側で処理されるため、この3Dコードは、Cのような昔からよく使われてきたグラフィックス言語でなくJavaScriptで記述されているにもかかわらず、かなり高速です。

変換

 グラフィックスのプログラミングでは2次元の空間変換が非常に重要な意味を持ちます。これにより任意の図形を任意の尺度で拡大/縮小、回転、平行移動することが可能となります。変換でレンダリングの質が低下することはないので、これは特にベクタグラフィックスで効果を発揮します。

 変換は状態マシンモデルにも従うので、当然、save()およびrestore()と共に使用します。次のコードは、3Dシステムのマップウィンドウで視点の矢印をレンダリングする例です。

  function render_arrow( ctx, x, y, scale, rot ) {
    // Save the current graphics state, including transformation state.
    ctx.save();

    // Move the arrow into place.
    ctx.translate( x, y );
    ctx.scale( scale, scale );
    ctx.rotate( rot );

    // Draw the arrow.
    ctx.strokeStyle = "#aaa";
    arrow.fill( ctx );

    // Restore the original graphics state
    ctx.restore();
  }

スクリーンショットのキャプチャ

 HCの素晴らしい点は、レンダリング画像の各ピクセルを読み書きできることです。この機能の利用法の1つがスクリーンショットのキャプチャです。 context.toDataURL()メソッドは、PNG形式でエンコードされた画像を含む次のようなdata URLを返します。

  data:image/png;base64,iVBORw0KGgoAAAANSUh[... much more data removed ...]

 このURLは、他のどんなものとしても使えます。例えば、これで新しいウィンドウを開き、そのウィンドウに画像が表示されるようにできます。本稿の3Dゲームでは、ビューとマップの四角形の下に特別な四角形があります。[Shift]+[S]キーを押すと、スクリーンショットがキャプチャされ、この四角形の中にそれが表示されます。ここから画像を保存したり、独自のウィンドウで表示したり、(OSがサポートしていれば)デスクトップにドラッグしたりできます。

HTMLとピクセルを橋渡しするHTML Canvas

 長年にわたってWebデザイナーとプログラマは、ピクセル精度のレイアウトという名目のもと、HTML要素やCSSスタイルの宣言を裏技的に使って、普通ではできないようなことをすることに多大な努力を重ねてきました。HTMLはもともと保護の目的でレイアウトの細部を分離するように作られているため、ピクセルレベルの精度を達成することは常に大変な作業でした。本稿の例を見て分かるように、HTML CanvasによってHTMLマークアップと個々のピクセル間のギャップを埋めることが可能になります。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Greg Travis(Greg Travis)

ニューヨーク在住のJavaプログラマ兼テクノロジーライター。ハイエンドPCゲーム業界で3年間を過ごした後に、EarthWebに参加し、当時最新鋭のJavaプログラミング言語を用いた新規テクノロジーを各種開発。1997年以降は、さまざまなWebテクノロジーについてのコンサルタントを務める。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3113 2008/10/24 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー