$B7W;;5!=xO@#2!J#2#0#1#1G/EY!K

$B7W;;5!=xO@#2(B, $B, www.kameda-lab.org 2011/11/21d

$B%j%s%/(B

$B!&(BOpenGL(ver.2.1)$B$N3F4X?t(B($B>.J8;z$N(Bgl$B$N#2J8;z$G;O$^$k4X?t(B)$B$N@bL@(B
$B!&(BOpenGL$B$N(BProgramming Guide Book (ver1.1, $BDL>N@VK\(B)


10($BB3(B). $B%b%G%k%G!<%?$NFI$_9~$_$HI=<((B


10.4 $BK!@~%Y%/%H%k$NIUM?(B

$B%Q%C%A$4$H$KK!@~%Y%/%H%k$r@5$7$/M?$($J$$$H!"(BCG$B$O@53N$K$OI=<($5$l$^$;$s!#(B
$BC1=c$J?^7A$J$i$H$b$+$/!"Bg$-$/$J$k$H$3$l$OCWL?=}$K$J$j$^$9!#(B

$BK!@~%Y%/%H%k$O%Q%C%A$,7h$^$C$F$$$l$PDj$^$j$^$9!#(B
$B$=$l$f$($K!"K\@a$G$O!J1i=,#4$H$O0c$C$F!K%U%!%$%k$+$i%G!<%?$r(Bic2_PATCH$B9=B$BN$KFI$_9~$`;~E@$GK!@~%Y%/%H%k$r5a$a$^$9!#(B
$B$3$N$?$a$K!"(Bic2_PATCH$B9=B$BN$GK!@~%Y%/%H%k$r3JG<$G$-$k$h$&$K3HD%$7$^$9!#(B
OpenGL$B$G$O#1$D$ND:E@$rM?$($kEY$KK!@~%Y%/%H%k>pJs$rIUM?$G$-$^$9!#(B
$B$3$N$H$-!"(BglEnable(GL_NORMALIZE)$B$r;XDj$7$F$*$/$H!"K!@~%Y%/%H%k$r@55,2=$7$F$*$/I,MW$,$"$j$^$;$s!#(B
$B$3$N$?$a!"$3$3$G$OK!@~%Y%/%H%k$H$7$F30@Q$N7W;;7k2L$rD>@\:NMQ$7$^$9!#(B

110-4-NormalVector.c
110-3$B$+$i$N:9J,(B


10.5 $BK!@~%Y%/%H%k$NI=<((B

$B4v2?E*$J7W;;$,$"$C$F$$$k$+$I$&$+$r3NG'$9$k$K$O$d$O$jI=<($7$F$_$k$K8B$j$^$9!#(B
$B!&%Q%C%A$N=E?4$r5/E@$K$9$k!#(B
$B!&K!@~J}8~$K@~J,$rIA$/!#(B
$B!&K!@~$NI=<($ND9$5$O%Q%C%A$NLL@Q(B($B$J$$$7$=$NJ?J}:,(B)$B$KHfNc$5$;$k!#(B
$B!&@~J,$r8+$d$9$/$9$k$?$a$K!"K!@~@~J,$NI=<(;~$K$O(BLightin$B$N8z2L$r0l;~E*$K@Z$k!#(B

110-5-ShowNormal.c
110-4$B$+$i$N:9J,(B


10.6 $B8w8;$N0l;~E*A`:n(B

$B$;$C$+$/K!@~$r@5$7$/M?$($F$b!"(BDiffuse$B8w8;$,u67$G$O!"(BMODELVIEW$B9TNs$r4v$iJQ2=$5$;$F$b$[$H$s$I(BCG$B$KJQ2=$,$"$j$^$;$s!#(B
($B$H$3$m$G$=$l$O$J$<$G$7$g$&$+$M!)(B)

$B$=$3$G!"(B7.6$B@a$d(B7.7$B@a$G9T$C$?(BMODELVIEW$B9TNs$NA`:n$r6n;H$7$F!"!V8w8;(B$B$N$_(B$B$r0l;~E*$KA`:n!W$G$-$k$h$&$K$7$^$9!#(B
$B!&$"$k;~E@$G$NJ*BN8GM-:BI87O$+$i%+%a%i@$3&:BI87O$X$NJQ49$r9T$&(BMODELVIEW$B9TNs$r%m%C%/$9$k!#(B
$B!&0J9_$NA`:n$O!"8w8;$KBP$7$F$OE,MQ$9$k$b$N$N!"J*BNI=<($K$O@h$[$I%m%C%/$7$?(BMODELVIEW$B9TNs$rMQ$$$k!#(B
$B!&%m%C%/$r2r=|$7$?$H$-$O!"%m%C%/;~E@$G$N>u67$KI|5"$5$;$k!#(B

110-6-MoveLight.c
110-5$B$+$i$N:9J,(B


11. $BF);kEj1F(B


11.1 $BF);kEj1F(B

8.1$B@a(B($B0E<(E*$K$O(B3.3$B@a(B)$B$+$i$3$3$^$G$OD>8rEj1F$rMQ$$$F$$$^$7$?!#(B
$BK\@a$G$O$$$h$$$hF);kEj1F$r@_Dj$7$^$9!#(B
$B$3$l$K$h$j!"FC$K1|9T$-$N$"$kJ*BN$N8+$+$1$,NI$/$J$j$^$9!#(B

$BF);kEj1F$r7hDj$9$kK\GE@5wN%$NBg$-$5$G$9!#(B
$B$3$3$G$O;#A|LL$K$O=i4|@_Dj$N=D2#(B400$B2hAG(B[pixel]$B$rA[Dj$7$FOC$r$7$^$9!#(B
$B$3$N$H$-$O!">GE@5wN%$NC10L$b2hAG(B[pixel]$B$K$J$j$^$9!#(B
$B?eJ?2h3Q(B35$B!k$K$J$k$h$&$J>GE@5wN%$O!"0J2<$N7W;;$GM?$($i$l$^$9!#(B

tan(35.0[deg] / 2) = (400[pixel] / 2) / f[pixel]
f = 634.319[pixel]

$B$B%+%a%i@$3&:BI87O(B$B$N86E@$K$*$+$l$?%+%a%i$N@h$N$I$NHO0O$^$G$rIA2h$9$k$+(BZ$BCM$G;XDj$7$^$9!#(B
$B%+%a%i$O(B(0,0,-1)$B$NJ}8~$r8~$$$F$$$k$N$G!"Nc$($P(B z=-0.1 $B!A(B z=-100.0 $B$NHO0O$r;XDj$9$k$H$-$O(B(0.1$B!A(B100.0)$B$H$J$j$^$9!#(B
$B$3$NHO0O;XDj$K$O@5CM$G$"$l$P$I$N$h$&$JCM$b@_Dj$G$-$^$9$,!"$"$^$j$KHO0O$,Bg$-$$$H(BCG$BIA2h;~$N@:EY$,Mn$A$^$9!#(B

111-1-Perspective.c
110-6$B$+$i$N:9J,(B

$B%W%m%0%i%`$O!"(B'P'$B$r2!$9EY$KD>8rEj1F$HF);kEj1F$r@Z$jBX$($i$l$^$9!#(B
$B=i4|>uBV$OD>8rEj1F$G$9!#(B


11.2 $BE,@Z$J5wN%(B

11.1$B@a$N%W%m%0%i%`$G$B$3$l$O4V0c$$$G$O$"$j$^$;$s!#(B
$B$G$O8+$F$$$k;d!J$"$J$?!K$O2?$r8+2a$4$7$F$7$^$C$?$N$G$7$g$&!)(B

$BF);kEj1F$K@Z$jBX$($?8e!"(B'j'$B%-!<$r$7$P$i$/2!$7$F$$$k$H$h$&$d$/MM;R$,$o$+$j$^$9!#(B
$B8+2a$4$7$F$7$^$C$?MW0x$,2?$+$o$+$j$^$7$?$+!)(B


12. $B4J0W%"%K%a!<%7%g%s(B

$B3j$i$+$KF0$/%"%K%a!<%7%g%s$r


12.1 $BA`:n$N5-O?(B

$B4J0W%"%K%a!<%7%g%s$NJ}?K$H$7$F!"A4$F$N%-!$B!&%-!$B!$D$N(BIC2_KEYINPUT$B$G$O#1$D$N%-!$B!&(BIC2_KEYINPUT$B$N%j%s%/%H%j%9%H$G$O!"(BFIFO$B$KJB$Y$F5-21$7$^$9!#(B
$B!&5-O?$N3+;O$K$O(B'S'$B%-!<$r!"5-O?$N=*N;$K$O(B'E'$B%-!<$r;H$$$^$9!#(B
$B!&5-O?$N3+;O$KEv$?$C$F$O!"2a5n$N%j%s%/%H%j%9%H$K;H$C$F$$$?%a%b%j$r2rJ|$7!"(BPROJECTION$B9TNs$H(BMODELVIEW$B9TNs$r=i4|2=$7$^$9!#(B
$B!&G0$N$?$a!"(B'A'$B%-!<$G8=:_$NA`:n5-O?$rI8=`=PNO$KI=<($7$^$9!#(B

$B4J0W%"%K%a!<%7%g%s$N$B!&(B'O'$B$GD>8rEj1F$r@_Dj!#(B
$B!&(B'P'$B$GF);kEj1F$r@_Dj!#(B

112-0-Structures.c($B111-1-Perspective.c$B$HF1$8(B)
111-1$B$+$i(B112-0$B$X$N:9J,(B
112-1-Memory.c
112-0$B$+$i(B112-1$B$X$N:9J,(B
$B"((B12$B@a$+$i9=B$BN$r=8$a$k>l=j$rJQ99$7$^$7$?!JJ,3d%3%s%Q%$%k$r$7$d$9$/$9$k$?$a!K!#(B


12.2 $BA`:n$N:F8=(B

$BD9$$4V$+$+$j$^$7$?$,!"$h$&$d$/:F@85!G=$G$9!#(B
OpenGL$B$N(BglutSetTimer()$B$rMQ$$$^$9!#(B
$B!&A`:n4V3V$O0lDj(B(playinterval [ms])$B$K$J$j$^$9!#(B
$B!&A`:n5-O?$r!"(B'G'$B%-!<$G:F8=$5$;$^$9!#(B
$B!&!V2?$b$7$J$$!W$H$$$&A`:n$r(B'z'$B%-!<$G$B:#$^$GC10l%U%!%$%k%=!<%9$G$OHr$1$F$-$^$7$?$,!"K\@a$G$O$8$a$F(B function prototype $B@k8@$r;H$C$F$$$^$9!#(B

112-2-Replay.c
112-1$B$+$i$N:9J,(B


12.3 $BA`:n$NJ]B8$HFI9~(B

$B!&A`:n5-O?$r!"(B'W'$B%-!<$G%"%K%a!<%7%g%s%U%!%$%k(B(IC2_animation.txt)$B$KJ]B8$5$;$^$9!#(B
$B!&A`:n5-O?$r!"(B'R'$B%-!<$G%"%K%a!<%7%g%s%U%!%$%k(B(IC2_animation.txt)$B$+$iFI$_9~$a$k$h$&$K$7$^$9!#(B
$B!&%"%K%a!<%7%g%s%U%!%$%k$O%F%-%9%H$J$N$G!"%(%G%#%?$G3NG'$9$k$3$H$b$G$-$^$9!#(B
$B!&%"%K%a!<%7%g%s%U%!%$%k$G$O(B # $B$G;O$^$k9T!"6u9T$O%b%G%k%U%!%$%k$HF1MML5;k$7$^$9!#(B

112-3-AnimationFile.c
112-2$B$+$i$N:9J,(B


12.4 $B%"%K%a!<%7%g%s$N5-O?(B

$BA`:n$rA4$FIA2h$9$k$N$O%a!<%-%s%0$r8+$F$$$k$h$&$J$b$N$G!"$"$^$j$$$$5$J,$G$O$J$$$+$b$7$l$^$;$s!#(B
$B$=$3$G!"<+J,$,;W$C$?%U%l!<%_%s%0$N$_IA2h$7$F$$$/$h$&$K$7$^$9!#(B
$B!&%"%K%a!<%7%g%s%U%l!<%`$N3NDj$r;X<($9$k(B'F'$B%-!<$rMQ0U$7$^$9!#(B
$B!&%"%K%a!<%7%g%s%U%!%$%kFb$G$O(B'F'$B%-!<5-O?;~$K2~9T$7$^$9!#(B


12.5 $B%-!<%j%9%H(B

$B!ZEj1F$N@Z$jBX$(![(B
O : $BD>8rEj1F$X@Z$jBX$(!J=i4|>uBV$OD>8rEj1F!K(B$B!J(B12$B@a0J9_!K(B
P : $BF);kEj1F$X@Z$jBX$((B$B!J(B12$B@a0J9_!K(B
P : $BD>8rEj1F!"F);kEj1F$N@Z$jBX$(!J=i4|>uBV$OD>8rEj1F(B, 11$B@a$^$G!K(B

$B!Z0\F0![!J0\F0$O(Bdelta_t$B$4$H!K(B
h : $BJ*BN:BI87O$G$N(BX$B<4IiJ}8~0\F0(B
l : $BJ*BN:BI87O$G$N(BX$B<4@5J}8~0\F0(B
n : $BJ*BN:BI87O$G$N(BY$B<4IiJ}8~0\F0(B
u : $BJ*BN:BI87O$G$N(BY$B<4@5J}8~0\F0(B
j : $BJ*BN:BI87O$G$N(BZ$B<4IiJ}8~0\F0(B
k : $BJ*BN:BI87O$G$N(BZ$B<4@5J}8~0\F0(B

$B!Z2sE>![!J2sE>$O(Bdelta_r$B$4$H!K(B
x : $BJ*BN:BI87O$G$N(BX$B<42s$jIi2sE>(B
w : $BJ*BN:BI87O$G$N(BX$B<42s$j@52sE>(B
a : $BJ*BN:BI87O$G$N(BY$B<42s$jIi2sE>(B
f : $BJ*BN:BI87O$G$N(BY$B<42s$j@52sE>(B
s : $BJ*BN:BI87O$G$N(BZ$B<42s$jIi2sE>(B
d : $BJ*BN:BI87O$G$N(BZ$B<42s$j@52sE>(B

$B!Z3HBg=L>.![!J#5!s9o$_(B)
v : $BJ*BN:BI87O$G$N=L>.(B
b : $BJ*BN:BI87O$G$N3HBg(B

$B!Z%j%;%C%H![(B
R : MODELVIEW$BC_@Q9TNs$N=i4|2=(B

$B!Z%"%K%a!<%7%g%s@)8f![(B
z : $BC10L;~4V7P2a(B
< : $BC10L;~4V$N(B10$B!sC;=L(B
> : $BC10L;~4V$N(B10$B!s1dD9(B
F : $B%"%K%a!<%7%g%s%U%l!<%`$N3NDj(B

$B!Z%a%?%3%^%s%I![!J%"%K%a!<%7%g%s$G$O5-O?$5$l$J$$!K(B
q : $B%W%m%0%i%`$N=*N;(B
Q : $B%W%m%0%i%`$N=*N;(B
ESC : $B%W%m%0%i%`$N=*N;(B
p : $B8=:_$N(BMODELVIEW$B9TNs(B, PROJECTION$B9TNs$NI=<((B
T : $B%F%#!<%]%C%H$NIA2h!&HsIA2h$N@Z$jBX$(!J=i4|!'HsIA2h!K(B

N : $BK!@~%Y%/%H%k$NIA2h!&HsIA2h$N@Z$jBX$(!J=i4|!'HsIA2h!K(B
L : $B8w8;$N0KCNCOE*0\F0$NM-8z2=!&L58z2=!J=i4|!'L58z!K(B
S : $B%"%K%a!<%7%g%s5-O?$N3+;O(B
E : $B%"%K%a!<%7%g%s5-O?$N=*N;(B
A : $B%"%K%a!<%7%g%s5-O?$NI=<((B
G : $B%"%K%a!<%7%g%s$NIA2h(B
W : $B%"%K%a!<%7%g%s$N%U%!%$%kJ]B8(B
I : $B%"%K%a!<%7%g%s$N%U%!%$%kFI9~(B


$B2]Bj(B5. 2011/11/28$B=PBjJ,(B

$B2]Bj$O$$$:$l$b(B2011/11/28,13:30 (JST)$BDs=PDy@Z$G$"$k!#(B


kameda[at]iit.tsukuba.ac.jp, 2011.