SHOEISHA iD

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

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

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

japan.internet.com翻訳記事

Java 3Dの変換処理を理解する

Java 3D API解説

全般的な背景情報 2

平行移動

 オブジェクトの平行移動とは、3D空間内のある位置から3D空間内の別の位置へオブジェクトを移動することです(その方法については、後述します)。オブジェクトの平行移動は、オブジェクトを定義するすべての点を平行移動することによって行われます。点を平行移動するには、点を定義するx、y、zの各座標値にオフセットを追加します。

 たとえば、元の点の座標がx1、y1、z1で、オフセットがtx、ty、tzの場合、点の新しい位置の座標は、次で表されます。

x2 = x1 + tx
y2 = y1 + ty
z2 = z1 + tz

拡大縮小

 オブジェクトの拡大縮小とは、オブジェクトを表すすべての点の位置を、非常に限定的な方法で変更することです。必ずというわけではありませんが、拡大縮小変換は一般にオブジェクトのサイズを変更するものであり、オブジェクトが大きくなったり、小さくなったりします(1または-1という係数による拡大縮小では、サイズが変わらないことに注意してください)。拡大縮小変換を行うには、オブジェクトを定義するすべての点のx、y、zの各座標値に、同じスケール係数または異なるスケール係数を乗算します。

 座標値を乗算するのに使用するスケール係数が同一の場合、オブジェクトは単純に大きくなるか、または小さくなります(スケール係数が負の場合は、軸に対して反転します)。各軸に適用されるスケール係数が異なる場合、オブジェクトはいずれかの次元で押しつぶされたようになったり、場合によっては軸に対して反転する場合もありますが、多くの場合、同じオブジェクトを表現したものであると認識できます。

 拡大縮小変換で使用されるスケール係数は、原点が基準です。たとえば、スケール係数が2.0の場合、新しい点の座標値は、元の点から原点までの距離の2倍になります。

 元の点の座標がx1、y1、z1で、スケール係数がsx、sy、szの場合、点の新しい位置の座標は、次で表されます。

x2 = x1 * sx
y2 = y1 * sy
z2 = z1 * sx

回転

 回転は、平行移動や拡大縮小ほど直感的ではなく、理解するにはある程度の三角法の知識が必要です。しかし、その仕組みを理解していなくても、決められた手順で回転変換を作成し、使用することは可能です。

 次の方程式は、2D空間の原点を中心とする点の回転を表しており、「Planar transformations」(稿末の「参考資料」を参照)に記載されています。vは、回転の角度を表します。

x2 = x1 * cos(v) - y1 * sin(v)
y2 = x1 * sin(v) + y1 * cos(v)

 この方程式は、「Spatial transformations」(稿末の「参考資料」を参照)で、3Dに拡張されます。3Dでは、物事が非常に複雑になります。2Dの場合は、xy平面でのみ回転が可能です。つまり、原点を中心に回転できます。しかし、3Dにおける回転は、xy、yz、zxのいずれかの平面に限定されません。いずれかの軸、または3つのすべての軸を中心に回転させることすら可能です。そのため、3組の回転方程式が存在します。この3組の方程式については、変換の行列方程式と合わせて後で示します。

正の回転角

 この式を導いた執筆者によると、軸を中心に反時計回りを正の回転角としています。これは、軸の正方向の端に位置して原点を見た場合、その軸を中心とする正の回転角が反時計回りであることを意味します。

行列

 以前のレッスン「Understanding Transforms in Java 2D」では(稿末の「参考資料」を参照)、行列を使用してJava 2Dの変換を実行する方法について説明しました。「同次座標」についても説明しました。

 記事「Planar transformations」(稿末の「参考資料」を参照)には、図5に示す行列方程式が記載されています。この行列方程式を解くことで、2Dの平行移動、拡大縮小、回転の各変換を実現できます。

図5 3つの基本的なJava 2D変換を表す行列演算
図5 3つの基本的なJava 2D変換を表す行列演算

次のページ
全般的な背景情報 3

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

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

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

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

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

Richard Baldwin(Richard Baldwin)

大学教授(テキサス州オースティン、Austin Community College)、およびプライベートコンサルタント。Java、C#、およびXMLの組み合わせに特に注目している。JavaアプリケーションとC#アプリケーションの、プラットフォームや言語に依存しない多くの利点に加えて、Java、C#、およびXMLの組み合わせは、Web上で構造化情報を提供するうえでの主要な原動力になると信じている。これまで多くのコンサルティ...

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2145 2010/01/05 11:13

イベント

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

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

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

メールバックナンバー