<HEAD>
<TITLE>Fake Sphere Mapping</TITLE>
</HEAD>

<BODY BACKGROUND="../Image/Back2.GIF"
	TEXT="#E0E0E0"
	BGCOLOR="#191919"
	LINK="#90D0FF"
	VLINK="#4080D0"
	ALINK="#0000FF">

<BASEFONT SIZE="3"> <!-- FACE="ＭＳ Ｐ明朝"> -->

<BR>
<CENTER>
<FONT SIZE="7" COLOR="80FF80"><I>Fake Sphere Mapping</I></FONT>
<P>
<P>
</CENTER>

<CENTER>
<IMG SRC="../Image/Bar2.gif" ALT "-------------------------------------------" width=100% height="8">
</CENTER>
<P>

<P>
<DL>
<DT>
<FONT SIZE="3" COLOR="#FFFF80"><B><I>2000/07/02（日）　</I></B></FONT>
<FONT SIZE="4"><B>− Fake Sphere Mapping − フェイク環境マップってインチキ？</B></FONT>
<P>
<DD>
　フェイク環境マップとは、スフィアマッピング（球状環境マッピング）の
簡易計算法であり、速度重視の環境マッピングによく利用されている。
厳密にはフェイクスフィアマッピングと呼んだ方が良いかもしれない。
この手法は、視線反射ベクトルを求め反射ベクトルからテクスチャ座標を計算するのではなく、
頂点の法線をそのままテクスチャ座標として利用する。
実際には法線は -1.0 〜 1.0 の範囲に渡るため、当然これを 0.0 〜 1.0 に写像する必要がある。
<BR>
つまり、
<BLOCKQUOTE>
<FONT SIZE="4" COLOR ="FFA0FF"><B>テクスチャ座標を (u, v)<BR>
頂点の法線ベクトルを N (nx, ny, nz) とすると、<BR><BR>
<BLOCKQUOTE>
<FONT SIZE="4" COLOR="#FFFF80">
u = nx * 0.5 + 0.5<BR>
v = ny * 0.5 + 0.5
</FONT>
</BLOCKQUOTE>
</B></FONT>
</BLOCKQUOTE>
である。
<P>
　対して、スフィアマッピングの計算式。ただし右手座標系（左手座標系ではｚ成分は逆）。
<BLOCKQUOTE>
<FONT SIZE="4" COLOR ="FFA0FF"><B>視線ベクトルを E (ex, ey, ez)<BR>
視線反射ベクトルを R (rx, ry, rz) とすると、<BR><BR>
視線反射ベクトル R = E - 2 (E・N) N<BR>
<BLOCKQUOTE>
<FONT SIZE="4" COLOR="#FFFF80">
m = 2 * sqrt(rx^2 + ry^2 + (rz + 1)^2)<BR>
u = rx / m + 0.5<BR>
v = ry / m + 0.5
</FONT>
</BLOCKQUOTE>
</B></FONT>
</BLOCKQUOTE>
となる。

ここで、スフィアマッピングの計算時、視線ベクトルが必ず
<BLOCKQUOTE>
<FONT SIZE="4" COLOR ="FFA0FF"><B>
E (ex, ey, ez ) = (0, 0, -1)<BR>
つまり平行投影であると仮定すると、反射ベクトル R は<BR><BR>
<BLOCKQUOTE>
<FONT SIZE="4" COLOR="#FFFF80">
rx = 2 * nz * nx<BR>
ry = 2 * nz * ny<BR>
rz = 2 * nz^2 - 1<BR><BR>
</FONT>
m = 2 * sqrt(rx^2 + ry^2 + (rz + 1)^2) より、<BR>
R は単位ベクトル（つまり rx^2 + ry^2 + rz^2 = 1）であるから、<BR>
m = 2 * sqrt(2 * rz + 2)
<BLOCKQUOTE>
= 2 * sqrt(2 * (2 * nz^2 - 1) + 2)<BR>
= 2 * sqrt(4 * nz^2)<BR>
</BLOCKQUOTE>
<FONT SIZE="4" COLOR="#FFFF80">
m = 4 * nz
</FONT>
<BR>
さらに<BR>
u = rx / m + 0.5 より<BR>
u = (2 * nz * nx) / (4 * nz) + 0.5<BR>
<BLOCKQUOTE>
= 2 * nx / 4 + 0.5<BR>
= nx * 0.5 + 0.5
</BLOCKQUOTE>
同じく<BR>
v = ny * 0.5 + 0.5
</BLOCKQUOTE>
</B></FONT>
</BLOCKQUOTE>
つまり、
<BLOCKQUOTE>
<FONT SIZE="4" COLOR="#FFFF80"><B>
<BLOCKQUOTE>
u = nx * 0.5 + 0.5<BR>
v = ny * 0.5 + 0.5<BR>
</BLOCKQUOTE>
フェイク環境マッピングの式となる。
</B></FONT>
</BLOCKQUOTE>
<BR>
　何が言いたかったはほとんど説明の余地も無いことと思うが、
つまり、
<BLOCKQUOTE>
<FONT SIZE="4" COLOR="#FFFF80"><B>
フェイク環境マッピング（フェイクスフィアマッピング）とは
平行投影と仮定したスフィアマッピングである
</B></FONT>
</BLOCKQUOTE>
ということ。
さらに、
<BLOCKQUOTE>
<FONT SIZE="4" COLOR="#FFFF80"><B>
平行投影という条件下においては、インチキでも何でもなく正確な計算方法
</B></FONT>
</BLOCKQUOTE>
ということである。
<BR>
ちなみに OpenGL や Direct3D の光源計算モデルのステートである
Local Viewer は、視線ベクトルを頂点に対して正確に計算するか、
(0, 0, -1) 固定にするか（Direct3D ではｚは 1）の違いである。
<BR>
これはスフィアマッピングとフェイク環境マッピングの違いと
まったく同じであることが理解できるだろう。
</DL>

<!-- Signature -->
<FONT SIZE="3" FACE="ＭＳ Ｐ明朝">

<CENTER>
<IMG SRC="../Image/Bar2.gif" ALT "-------------------------------------------" width=90% height="16">
</CENTER>

<UL>
	<A HREF="index.html"><B><I>Masa's Column</I></B>に戻る</A>

	<TABLE>
	<TR>
	<TD>
	<A HREF="../index.html"><IMG SRC="../Image/MasaPlate.gif" BORDER="0" WIDTH="112" HEIGHT="48"></A>
	</TD>
	<TD><A HREF="../index.html">ホームページに戻る</A></TD>
	</TR>
	</TABLE>

	本ページの御意見・御感想は<BR>
<B>
<ADDRESS>
	<A HREF="mailto:masa@daionet.gr.jp">
		<I>E-Mail: masa@daionet.gr.jp</I></A>
</ADDRESS>
</B></UL>

</FONT>
<!-- Signature -->

</BODY>
