OpenGLESã§ã®ããŠã¹ãããã³ã°
ååãŸã§ã®ãœãŒã¹ã³ãŒãã§ãAR空éäžã«ãªããžã§ã¯ããæµ®ãã¹ãŠè¡šç€ºããããšãã§ããããšãªããšã次ã¯ãã®ãªããžã§ã¯ããã¿ãããããšãã«ãäœããã®æ å ±ã衚瀺ããããªãã ãããã¿ãããããªããžã§ã¯ããéåžžã®UIViewã§ããã°ãCocoaã®APIã䜿ãã°ãããã ããä»åã¯OpenGLã䜿ã£ãŠæç»ããŠããã®ã§ãã¿ããå€å®ã¯å¥ã®æ¹æ³ã§è¡ãå¿ èŠãããã
ã€ãŸããç»é¢äžã®åº§æšãããããã«è¡šç€ºãããŠããOpenGLã®ããªãŽã³ãååŸããå¿ èŠãããã®ã ãããã¯ãããŠã¹ãããã³ã°ãšåŒã°ãããã¯ããã¯ã«ãªãããã«ã®OpenGLã§ããã°ãããŠã¹ãããã³ã°ãè¡ãããã«ãã»ã¬ã¯ã·ã§ã³ã¢ãŒããšåŒã°ããç¶æ ãçšæãããŠãããã ããiOSã§æäŸãããŠããOpenGLESã§ã¯ãã»ã¬ã¯ã·ã§ã³ã¢ãŒããå©çšããããšãã§ããªãããããã£ãŠãå¥ã®ææ®µãèããå¿ èŠãããã
ããã§ããã§ã¯ãARãªããžã§ã¯ããOpenGLã䜿ã£ãŠæç»ãããšãã«ãåæã«ãã®ã¹ã¯ãªãŒã³äžã§ã®åº§æšãèšç®ããŠããŸããšããæ¹æ³ãæ¡çšãããããã®åº§æšãä¿åããŠããããŠãŒã¶ãç»é¢ãã¿ãããããšãã«å€å®ã®ããã«äœ¿ãã®ã ãããæå³ãçŽæ¥çã§åçŽãªæ¹æ³ã ããã®ããæ¹ã¯ãARãªããžã§ã¯ããç©åœ¢é åã§ããããã®æ°ãããŸãå€ããªãããã€z座æšãããã»ã©èæ ®ããªããŠãããå Žåã«æå¹ã ããã
ã¡ãªã¿ã«ä»åã¯åãäžããªãããARãªããžã§ã¯ãã®ã¹ã¯ãªãŒã³äžã§ã®åº§æšãèšç®ããããšã¯ãä»ã®ç®çã«ã䜿ãããšãã§ããã ãããããšãã°ãæ£é¢ãåããªããžã§ã¯ãã®æç»ã§ãããçŸç¶ã®ãœãŒã¹ã³ãŒãã§ã¯ãARãªããžã§ã¯ãã¯äžå¿ã®èŠç¹ã®æ¹ãåããŠãããç»é¢ãšã¯æ£äœããŠããªãããããã£ãŠãæåããã¯ã¹ãã£ãšããŠæç»ãããšãæªãã§ããŸãããšã«ãªãããããé²ãã«ã¯ããŸãARãªããžã§ã¯ãã®ã¹ã¯ãªãŒã³äžã§ã®åº§æšãååŸããããã®åŸã¢ãã«ãã¥ãŒè¡åãã¯ãªã¢ããäºæ¬¡å 座æšãšããŠãªããžã§ã¯ããæç»ããŠããã°ãããããããã°ãäžæ¬¡å 空éäžã«ãããªãããåžžã«ã¹ã¯ãªãŒã³ã®æ£é¢ãåããŠããããã«æç»ã§ãããARã¢ããªã§æ å ±ã衚瀺ããããšããªã©ã«ã¯åœ¹ã«ç«ã€ãã¯ããã¯ã ããã
ã¹ã¯ãªãŒã³äžã§ã®åº§æšã®èšç®
ã§ã¯ãARãªããžã§ã¯ãã®ã¹ã¯ãªãŒã³åº§æšã®èšç®ããã£ãŠã¿ããããŸããèšç®çµæãä¿æããŠããããã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã远å ããŠããã_translatedRectsãšããååã«ããŠãããã
List 1.
@interface ARView : UIView
{
...
GLfloat _translatedRects[16][8];
...
}
16x8ã®é åã«ãããããã¯ãARãªããžã§ã¯ãã16åããããã€ç©åœ¢é åãªã®ã§4ã€ã®é ç¹ã§å®çŸ©ã§ããããã§ãããé ç¹ã¯ãã¹ã¯ãªãŒã³åº§æšãªã®ã§ãxãšyæåã ãä¿åããŠããã°ãªãã±ãŒã ã
座æšã®èšç®ã¯ãARãªããžã§ã¯ãã®æç»ãè¡ã£ãçŽåŸã«è¡ããã€ãŸããOpenGL座æšã®å転ãç§»åãè¡ã£ãŠãglDrawArraysãåŒãã ãã®æ¬¡ãšããããšã«ãªããå¿ èŠãªã®ã¯ããã®æç¹ã§ã®ã¢ãã«ãã¥ãŒãããªãã¯ã¹ã ããã®è¡åããARãªããžã§ã¯ãã®é ç¹ã®å€æãè¡ããã®ã ããã ãã¢ãã«ãã¥ãŒãããªãã¯ã¹ã¯ãglGetFloatv颿°ã«GL_MODELVIEW_MATRIXãæå®ããããšã§ååŸã§ããã
ãã®è¡åãååŸã§ããããARãªããžã§ã¯ãã®é ç¹åº§æšã®å€æãèšç®ããããã¢ãã«ãã¥ãŒãããªãã¯ã¹ã¯4x4è¡åãšããŠè¿ã£ãŠããã®ã§ãé ç¹åº§æšã4x4è¡åãšããŠçšæãããèšç®ãããã倿ããã座æšã®xãyæåã ããã€ã³ã¹ã¿ã³ã¹å€æ°ã«å ¥ããŠãããã
List 2.
- (void)drawView:(id)sender
{
...
// çŸåšã®ã¢ãã«ãã¥ãŒãããªãã¯ã¹ãååŸãã
GLfloat mm[16];
glGetFloatv(GL_MODELVIEW_MATRIX, mm);
// 倿ããé ç¹ã4x4è¡åã§çšæãã
GLfloat ov[] = {
vleft, vbottom, 0, 1.0f,
vright, vbottom, 0, 1.0f,
vleft, vtop, 0, 1.0f,
vright, vtop, 0, 1.0f,
};
// ã¢ãã«ãã¥ãŒãããªãã¯ã¹ãçšããŠå€æãã
for (j = 0; j < 4; j++) {
// é ç¹è¡åã®äžè¡ãååŸãã
GLfloat v[4];
v[0] = ov[j * 4];
v[1] = ov[j * 4 + 1];
v[2] = ov[j * 4 + 2];
v[3] = ov[j * 4 + 3];
// 倿ã®èšç®ãè¡ã
GLfloat mv[4];
mv[0] = v[0] * mm[0] + v[1] * mm[4] + v[2] * mm[8] + v[3] * mm[12];
mv[1] = v[0] * mm[1] + v[1] * mm[5] + v[2] * mm[9] + v[3] * mm[13];
mv[2] = v[0] * mm[2] + v[1] * mm[6] + v[2] * mm[10] + v[3] * mm[14];
mv[3] = v[0] * mm[3] + v[1] * mm[7] + v[2] * mm[11] + v[3] * mm[15];
// xãy座æšãä¿åãã
_translatedRects[i][j * 2] = mv[0];
_translatedRects[i][j * 2 + 1] = mv[1];
}
ããã§ã¹ã¯ãªãŒã³äžã®åº§æšãæ±ãŸã£ãããšã«ãªãã
ã¿ããå€å®
ãããŸã§ã§ããŠããŸãã°ãã¿ããå€å®ã¯ç°¡åã ãåçŽã«ãã¿ãããã座æšãšå€æãããç©åœ¢é åãæ¯èŒããã ãã§æžãã§ããŸãã
ã¿ããã€ãã³ããæãŸããããã«ãtouchesEnded:withEvent:ãäžæžããããããã®äžã§ã¯ããŸãã¿ãã座æšãååŸãããQuartz座æšããOpenGL座æšãžã倿ããŠãããã
ãããŠãç©åœ¢é åãšæ¯èŒãããç©åœ¢é åã¯4ã€ã®é ç¹ã§å®çŸ©ããããããã®äžã«ããç¹ãå«ãŸãããã©ãã確èªããã ããªãã°ãå·Šäžãšå³äžã®åº§æšã ãããã°ãããããã§ãå·Šäžã衚ã(x0, y0)ãšãå³äžã衚ã(x3, y3)ãåãåºããŠãã¿ãã座æšãšæ¯èŒããããç©åœ¢é åã«å«ãŸãããšå€æãããããããããçšæããŠãããã©ãã«ã«æåã衚瀺ãããŠã¿ãã
List 3.
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
// ã©ãã«ãã¯ãªã¢ãã
_label.text = @"";
// ã¿ãããã座æšãååŸãã
CGPoint point;
point = [[touches anyObject] locationInView:self];
// OpenGL座æšç³»ã«å€æãã
float x, y;
x = (point.x - 160.0f) / 160.0f;
y = (240.0f - point.y) / 160.0f;
// 倿ãããç©åœ¢é åãšæ¯èŒãã
int i;
for (i = 0; i < 16; i++) {
// ç©åœ¢ã®é ç¹ãååŸãã
float x0, y0, x3, y3;
x0 = _translatedRects[i][0];
y0 = _translatedRects[i][1];
x3 = _translatedRects[i][6];
y3 = _translatedRects[i][7];
// ã¿ãããã座æšãç©åœ¢é åã«å«ãŸããå Žå
if (x > x0 && x < x3 && y > y3 && y < y0) {
// ã©ãã«ã«ã¡ãã»ãŒãžã衚瀺ãã
_label.text = [NSString stringWithFormat:@"Touched No. %d rect", i];
break;
}
}
}
å®è¡çµæã¯æ¬¡ã®ããã«ãªããARãªããžã§ã¯ããã¿ãããããšãç»é¢äžã®ã©ãã«ã«ãã®çªå·ã衚瀺ãããã¯ãã ã
ããã§ãäœçœ®æ å ±ç³»ã®ARã¢ããªã«æ±ããããæ©èœã¯äžéãæã£ãããšã«ãªãã ãããããšã¯ãé©åãªãµãŒããªã©ã«æ¥ç¶ããŠããã®äœçœ®ãšæ¹äœã®æ å ±ãååŸããç»é¢äžã«è¡šç€ºããŠããã°ããã
ãããŸã§ã®ãœãŒã¹ã³ãŒã: AR-4.zip
