Rendering in WebKit




  Webkit에 대한 설명입니다.

Fingding Inverse of a 3 x 3 Matrix




 < 출처 : eneskral67  >
 
 오랫만에 3 x 3 행렬의 역행렬을 구하는 방법을 찾았는데,
이 영상보면 아마 바로 이해하게 될 것이다.
 이 아저씨, 영어 못하는 사람이 봐도 이해를 할 수 있게 예를 들어 역행렬에 대해 설명을 아주 잘하는 것 같다~!




 

Finding the Determinant of a 3 x 3 Matrix




< 출처 : patrickJMT >

 Determinant를 구하는 방법을 쉽게 설명한 영상.
특히, 글 올린 사람이 중요한 공식에 대해 짤막하게 잘 설명해놓았다.

Motion Portrait 기술.

소니(Sony-Kihara Research Center)에서 개발한 모션 포트레이트(motion portrait)라는 기술로,
한 장의 사진으로 아래와 같은 동영상 기술이 가능해진다.
나의 몹쓸 정보력으로 맨날 몇년 지난 기술만 알게 되지만.. 뭐, 어쩔 수 없지;;
자세한건 Rhea님 블로그에서 확인하시길..

  출처 :http://rhea.pe.kr/247

Interactive 3D Modeling(April, 15 2008 ABSTRACT)



Google Tech Talks April, 15 2008 ABSTRACT
Speaker: Anton van den Hengel

동영상에 있는 오브젝트를 그대로 뽑아낼 수 있는 기술..
2년 전 동영상인데.. 오늘 보고 충격 받았음..-_-;;
내 정보력 정말 저질이다. 반성 좀 하자;;

warning C4996: was declared deprecated 해결법


warning C4996: was declared deprecated

비쥬얼 스튜디오 2005에서 컴파일 하다 보면 위의 warning이 뜨는것을 볼 수 있다.

몇가지 경우가 있는듯 한데

대표적으로 예전의 문자열 관련 CRT 함수를 쓰면 나타난다.

위 warning의 의미는 "VS2005에서 이전 문자열 관련 CRT함수의 안전성을 강화하기 위하여

"_s"가 붙는 함수를 다시 만들었기 때문에 될 수 있으면 이전에 사용하던 함수는 사용하지 마라" 정도가 되겠다.

안전성이라고 해봐야 특별한것은 없고 메모리 관련 에러가 나면 확실하게 에러를 표시해 주는 기능 정도인거 같다 (이전 함수들은 메모리 버퍼의 크기에 대한 보장을 못함). 그래도 메모리 관련 에러가 나면 그 결과가 엉뚱한 데서 나타날 수가 있으므로 여간 찾기 어려운 것이 아닌데 이런 사소한것 부터 조심스럽게 쓰면 좀 더 안전하게 코딩할 수 있지 않을까 생각이 든다.



[해결법 1]

예) strcpy  -> strcpy_s


[해결법 2]
 

stdafx.h 파일의 최 상단에
#define _CRT_SECURE_NO_DEPRECATE

출처 : http://blog.bagesoft.com/289

FLARToolKit Start Guide by Saqoosha.net

** http://saqoosha.net/flartoolkit/start-up-guide/ 를 번역, 의역하였습니다.
** 원작자인 Koyama Tomohiko는 주로 플래시를 이용한 웹 서비스 제작을 하시는 분 같습니다.
   http://katamari.co.jp/#/index/hiko 이곳에 다양한 작품이 들어가 있습니다.



필요한 것

 ・Adobe Flash CS3 이후 버전
FLARToolKit
Papervision3D (rev.814 이후 버전)
・Web 카메라
・인쇄한 마커와 마커 데이터

다운로드

귀찮기 때문에 필요한 파일을 모두 모아 두었습니다.
http://saqoosha.net/lab/FLARToolKit/FLARToolKit-starter-kit.zip
덧붙임(2009/2/8 1:50): 으아~, 마커 pdf 넣은 것을 잊어버렸네요. 다시 넣어두었고 마커만 업로드한 이곳을 이용해 주세요.

Introduction

Papervision3D를 사용할 수 있는 분이라면 굉장히 간단합니다. 샘플의 메인부분은 거의 Papervinios3D 설정만 하면 됩니다.
써본 적이 없는 분께도 이 샘플은 엄청 간단하므로 어렵지 않아요. 걱정하지 않으셔도 됩니다.
단, 1가지 점에만 주의해주세요. 좌표계가 Papervision3D와 조금 다릅니다. Papervision3D으로 렌더링을 하기 때문에 글로벌 좌표계는
물론 왼손좌표계이지만, 마커 위에 올려진 오브젝트는 아래의 그림과 같은 느낌으로 마커를 정면에서 볼 때에는 오른손 좌표계가 됩니다. (**원문과 동일하게 표현해놓았습니다.) 윗 방향이 +X, 오른쪽 방향이 +Y, 앞쪽이 +Z가 됩니다.(덧붙임 2009/3/2 : 죄송합니다. 틀린 부분이 있었네요..)
marker-axis

샘플 소스의 설명

순서대로 쓸수록 어려워지기 때문에 소스를 조금씩 설명하겠습니다. SimpleCube.as 가 메인으로, 그 외의 소스는 특별히 볼 필요는 없습니다. 그러므로 SimpleCube.as 를 설명해 나가겠습니다.

17 번째 줄
this.init('Data/camera_para.dat', 'Data/flarlogo.pat');

FLARToolKit 를 초기화 합니다. 첫번째 인수에는 카메라 보정 파일의 이름입니다. 이 파일은 FLARToolKit 에 들어가있는 것으로 그대로 지정해두면 됩니다. 두번째 인수는 마커의 패턴을 정의하는 파일으로, 이 파일은 사용하는 마커에 대응하는 패턴 정의 파일을 지정합니다. flarlogo.pat 는  flarlogo-marker.pdf 용입니다。

20 번째 줄
protected override function onInit():void {

init 호출한 뒤, 초기화가 문제없이 끝나면 최종적으로 이 함수가 호출됩니다. 3D 오브젝트의 설정은 이 코드 안에 작성하면 되겠습니다. 패턴 파일이 존재하지 않거나 웹 카메라가 접속되어 있지 않다면, 이 함수가 호출되기 전에 에러가 발생합니다..

24, 25 번째 줄

var wmat:WireframeMaterial = new WireframeMaterial(0xff0000, 1, 2);this._plane = new Plane(wmat, 80, 80);

마커가 정상적으로 인식되고 있는지 확인하기 쉽게 마커와 동일한 사이즈의 Plane 을 만들어 보겠습니다. 빨간색 2px의 라인, 80 이 마커 사이즈 입니다. 80mm.

26 번째 줄
this._plane.rotationX = 180;

좀 전에 작성한 것과 같이 좌표계가 다르기 때문에 방향을 바꿉니다.

27 번째 줄

this._baseNode.addChild(this._plane);

통상적으로、Papervision3D에는 Scene3DaddChild 하지만, FLARToolKit 에서는 마커의 따라서 3D 오브젝트를 움직이기
위해 특별한 노드에 addChild 하는 필요가 있습니다. 그것이 _baseNode입니다. 여기에 addChild 하는 것으로 자동으로 마커를 따라 움직이도록 합니다.

36, 37 번째 줄
var fmat:FlatShadeMaterial = new FlatShadeMaterial(light, 0xff22aa, 0x75104e);this._cube = new Cube(new MaterialsList({all: fmat}), 40, 40, 40);

마커 위에 핑크색 Cube 를 올려보겠습니다. 사이즈는 40mm x 40mm x 40mm으로 마커의 반 정도의 사이즈입니다.

38 번째 줄
this._cube.z = 20;

Cube 는 원점을 중심으로 만들어져 있기 때문에 +Z 방향, 즉 마커 윗 방향으로 20 정도 이동시키면, 마커에 정확히 올려놓을 수 있습니다.

움직여 보기.

SimpleCube.fla 를 열고 퍼플리싱하면 웹 카메라로 부터 화면이 표시됩니다. 웹 카메라를 연결하지 않으면 에러가 발생합니다. 연결되어있는데도, 영상이 나타나지 않으면 우클릭 → 설정 → 카메라 아이콘 순서로 적당한 카메라를 선택해 주세요.(MacBook 이나, 내장 카메라는 USB Video Class Video 이라는 이름으로 되어 있습니다.)
인쇄된 마커 전체가 카메라에 비춰지도록 하면 오브젝트가 표시됩니다. 마커에 딱붙어 있네요. 어때요, 간단하죠?

정리

샘플을 보면 알 수 있듯, 마커를 따라 오브젝트를 움직이게 하는 것이라면 Papervision3D 으로 오브젝트를 만드는 코드를 작성하는 것 만으로 가능하기 때문에 모두 FLARToolKit를 시작해 봅시다.

Engineering Navi - ARToolKit 3. simpleTest.c 설명 (2/2)

 ** 이글은 http://kougaku-navi.net/ARToolKit.html 을 번역, 의역하였습니다.

 

--------------------------------------------------------------------------------------

 

 3-3. 메인루프 함수 mainLoop()

 

static void mainLoop(void)
{
    ARUint8         *dataPtr;      // 영상 데이터
    ARMarkerInfo    *marker_info;  // 검출된 마커의 정보
    int             marker_num;    // 검출된 마커의 수
    int             j, k;

    /* 카메라 영상 취득 */
    if( (dataPtr = (ARUint8 *)arVideoGetImage()) == NULL ) {
        arUtilSleep(2);   // 영상이 찍히지 않았다면,  2밀리 세컨드를 기다려 함수를 벗어난다.

        return;
    }
    if( count == 0 ) arUtilTimerReset();  // 타이머 리셋
    count++;                              // 처리 프레임 수 카운트
                                          // ↑ 이것은 나중에 FPS를 계산할 때, 사용함

    /* 캡쳐한 영상 표시 */
    argDrawMode2D();
    argDispImage( dataPtr, 0,0 );

    /* 카메라 영상으로 부터 마커 검출 */
    if( arDetectMarker(dataPtr, thresh, &marker_info, &marker_num) < 0 ) {
        cleanup(); // 에러가 발생하면 종료처리를 해서 프로그램을 종료함
        exit(0);
    }

    arVideoCapNext();  // 다음 카메라 영상을 취득한다.

    /* 가장 일치도가 높은 마커를 찾는다. */
    k = -1;
    for( j = 0; j < marker_num; j++ ) {
        if( patt_id == marker_info[j].id ) {
            if( k == -1 ) k = j;
            else if( marker_info[k].cf < marker_info[j].cf ) k = j;
        }
    }
    /* 여기서, k번째 마커가 가장 일치도가 높은 마커가 된다. */

    if( k == -1 ) {        // 일치하는 마커를 찾지 못한다면,
        argSwapBuffers();  // 버퍼 내용을 화면에 따라 그리는 것만 한다.
        return;
    }

    /* 마커의 3차원 위치, 자세(마커, 카메라 간의 좌표 변환 행렬)을 구한다. */
    arGetTransMat(&marker_info[k], patt_center, patt_width, patt_trans);

    draw();  // 출력 처리(여기에서 3D 오브젝트의 출력을 하고 있다.)

    argSwapBuffers();  // 버퍼의 내용을 화면에 표시함
}

 

메인루프 함수는 종료처리가 실행될 때까지 계소해서 반복되어 실행됩니다. 마커의 검출을 실행하는

함수 arDetecMarker()는 검출된 마커의 식별ID와 꼭지점, 일치도 등의 정보를 포함한 구조체와

검출된 마커의 수를 반환하지만, 검출된 마커 중에서 가장 높은 일치도를 가진 모양을 찾는 처리는

스스로 코딩하지 않으면 안되는 것에 주의합시다. 여기에서,

 

   marker_info[j].id  // j번째에 검출된 마커에 대응하는 마커 ID
 marker_info[j].cf  // 거기에 얼마나 가까이에 있는지 표시하는 일치도(0.0~1.0의 수치)

 

로 됩니다.

 ARToolKit의 최대의 장치가 arTransMat()라는 함수입니다. 이 함수에는 검출된 마커의 정보에서 부터,

카메라의 시점에 대한 마커의 3차원 위치자세(위치자세라는 단어가 계속 나오는데, 적당한 한국말은

무엇일까요?)를 계산하고 있습니다. 수학적으로 꽤나 엄청난 일을 하고 있기 때문에, 흥미가 있는

분은 공식사이트에서 공개된 논문과 함께 프로그램의 소스를 확인하시는 것도 추천합니다.(꽤 공부가

되니까요.) 이 함수로 부터 얻어진 patt_trans가 좌표변환행렬입니다.

 

 

 

다음으로 이 메인 루프 함수 안에서 호출되고 있는 draw() 함수의 내부를 확인해 봅시다.

 

3-4. 그래픽 출력처리함수 draw()

 

static void draw( void )
{
    double    gl_para[16];
    GLfloat   mat_ambient[]     = {0.0, 0.0, 1.0, 1.0};
    GLfloat   mat_flash[]       = {0.0, 0.0, 1.0, 1.0};
    GLfloat   mat_flash_shiny[] = {50.0};
    GLfloat   light_position[]  = {100.0,-200.0,200.0,0.0};
    GLfloat   ambi[]            = {0.1, 0.1, 0.1, 0.1};
    GLfloat   lightZeroColor[]  = {0.9, 0.9, 0.9, 0.1};
   
    // 3D 공간을 그려내기 위한 설정.
    argDrawMode3D();
    argDraw3dCamera( 0, 0 );


    // 숨겨진 면 처리에 관한 기술
    glClearDepth( 1.0 );
    glClear(GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
   
    /* 좌표변환행렬 로드 */
    argConvGlpara(patt_trans, gl_para);
    glMatrixMode(GL_MODELVIEW);
    glLoadMatrixd( gl_para );


    // 라이팅(조명)에 관한 기술
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambi);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_flash_shiny);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);

    // 실질적으로 3D 오브젝트를 만들기 위한 것은 이 3줄임!!
    glMatrixMode(GL_MODELVIEW);
    glTranslatef( 0.0, 0.0, 25.0 );  // 마커 위에 올리기 위해 z방면에 25.0mm 띄움
    glutSolidCube(50.0);             // 50.0mm의 정사각형을 그림

    glDisable( GL_LIGHTING );
    glDisable( GL_DEPTH_TEST );
}

  여기가 가장 프로그래머의 손길이 필요한 부분이라고 생각합니다. 이름이 'gl'로 시작하는 함수는 OpenGL

함수입니다. 위의 코드 중에 빨간 색으로된 부분에 주목해 주세요. argDrawMode3D()는 OpenGL의 모델
View 행렬을 초기화하는 함수입니다. argDraw3dCamera()는 3D 공간의 시야범위를 설정하는 함수입니다.

 우선 "3D공간을 출력하기 전에 이 2개를 호출한다"는 이해를 해주시기 바랍니다.

argConvGlpara()라는 함수는 조금 전에 구한 좌표변환행렬 patt_trans를 OpenGL형식(4X4 행렬의 1차원 배열)

으로 변환하고 있습니다.

 

 

 

< argConvGlpara()로 변환된 OpenGL 형식의 변환행렬 >

 

 최초, 원점(0,0,0)은 렌즈의 위치(= 카메라의 위치)에 있지만, glLoadMatrixd()에 따라 좌표변환이 실행되어,

이 함수 이후는 마커의 중심을 원점으로 하는 좌표계로의 작업이 됩니다. 최대 포인트는 OpenGL 위에 길이

단위를 미리미터 단위로 지정할 수 있는가 입니다! 예를 들어, 폭 50.0mm의 정사각형을 출력하고 싶다면,

 그대로 glutSolidCube(50.0) 라고 지정하면 되겠습니다. 다만, 이것을 실현하기 위해서는 마커의 크기가

확실히 설정되어 있어야 하므로, 주의해 주시기 바랍니다.

 

    double          patt_width     = 80.0// 마커의 한 변의 길이[mm]


 

※ patt_width는 소스 상부에 전역으로 선언되어 있습니다.

 

 ! ARToolKit의 그래픽 처리

 

   ARToolKit에 따르면, 카메라 영상을 표시하거나, 사영기하의 설정을 실행하는 처리계에는 'gsub'와

'gsub_lite'가 있습니다. 함수명 이름 앞이 'arg'로 시작하는 것이 gsub의 함수로, 'argl'로 시작하는 함수는

gsub_lite의  함수입니다.

 

- gsub의 함수 레퍼런스(영문))
- gsub_lite의 함수 레퍼런스(영문)

 

 gsub에는 GLUT에 따른 윈도우 처리, 콜백 함수 관리가 포함되어있지만, gsub_lite에는 포함되어 있지

않습니다. 단적으로 말하면, gsub_lite의 경우는 윈도우와 콜백 함수의 관리를 스스로 실장(実装:어떤

기능을 구현하기위해 구성요소를 구체화하는 일(구현하는 작업))하는 것이 가능해지지만, 이미 OpenGL/

GLUT에 익숙해진 독자분은 gsub_lite의 함수를 사용해 코딩하는 쪽이 적합할지도 모르겠습니다. 특히

기존의 OpenGL의 코드를 AR화 하려는 경우는 gsub_lite 함수로 코딩하는 쪽이 하기 쉽습니다.

 

 gsub을 사용하는 경우는 gsub.h를 include합니다. 한편, gsub_lite를 사용하는 경우는 gsub_lite.h를

include합니다. 여기서 설명하고 있는 simpleTest.c는 gsub를 이용하고 있습니다. gsub_lite를 사용한

샘플은 simpleLite.c 입니다. gsub_lite를 사용하는 프로그램 쪽이 느낌상(雰囲気的に:분위기적으로를 의역했

습니다.) OpenGL의 코드에 가깝습니다.(OpenGL의 코드 위에 ARToolKit의 코드를 실고 있는 듯한 느낌임.)

 

 gsub와 gsub_lite의 차이에 관한 내용은 공식 사이트인 아래 페이지에 설명이 있습니다. 요약하자면

"GLUT에 따른 처리가 들어있느냐, 아니냐"라고 해도 틀리지 않을 것 입니다.

 

- ARToolKit Documentation (ARToolKit Framework)

 

 3-5. 키 이벤트 함수 keyEvent()

 

static void   keyEvent( unsigned char key, int x, int y)
{
    /* ESC키가 눌리면 종료한다. */
    if( key == 0x1b ) {
        printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); // FPS 표시
        cleanup(); // 종료처리
        exit(0);
    }
}

 키 이벤트 함수는 프로그램의 초기화 시에 argMainLoop()에서 설정합니다. 그렇게 하면, 실행주에 키 입력이

있을 때에 이 함수가 호출되는 것이 가능해집니다.

 변수 key에는 눌러진 키의 키 코드가 들어가 있습니다. 이 프로그램에는 esc키가 입력되면, FPS를 표시하는

프로그램을 종료하도록 되어 있습니다. 변수 count에는 처리한 프레임 수가 들어가 있습니다. 이것을 시간(

arUtilTimer())에 나누면 1초당 처리 프레임 수(FPS)가 구해집니다.

 다음은 여기서 사용되는 cleanoup() 함수의 내부를 봅시다.

 

 3-6. 종료처리함수 cleanup()

 

 아주 심플합니다. "캡쳐를 멈추면 종료" 그것 뿐인가 봅니다. 프로그램의 처리 도중에 에러가 발생하는 경우는

이 함수를 실행한 후에 종료(exit(0) 한다)하도록 해주세요.

 

 이 샘플 프로그램의 구조가 이해된다면, 스스로 개인만의 AR 어플리케이션을 만들 수 있을 것 입니다.

 

-------------------------------------------------------------------------------------------------

 

 


Engineering Navi - ARToolKit 3. simpleTest.c 설명(1/2)

** 출처는 http://kougaku-navi.net/ARToolKit.html 입니다.

** 이글에 대한 모든 권리는 Sunao Hashimoto 씨에게 있습니다.

-------------------------------------------------------------------------------------------
지금까지의 정리.

 실질적인 프로그래밍에 들어가기 앞서, 지금까지 이야기를 정리해 둡시다.
 
 1. ARToolKit을 사용하면, 정사각형 마커를 카메라에 촬영하고 거기에 실시간으로 3D 오브젝트를 오버레이
 표시하는   프로그램을 제작가능하다.
 2. 사용하는 카메라를 직접 지정하기 위해서는 카메라 설정 파일(*.xml)을 옮겨 놓는다.
 3. 마커는 검은 정사각형의 굵은 테두리 중간에 흑백 또는 칼라 도안이 있는 것을 사용한다.
 4. 카메라 Calibration에는 calib_camera2.exe 를 사용한다.
 5. 패턴 파일 작성에는 mkpatt.exe 를 사용한다.

이제, 드디어 ARToolKit을 사용한 프로그래밍을 설명하겠습니다.

※ ARToolKit에 따른 프로그램 전체 구분.
 ARToolKit에 따른 프로그램 전체 모양은 아래 그림에 표시되어 있습니다. 하늘색으로 칠해진 부분이 하나의 
함수라고 생각해 주세요. 여러가지 처리해야 할 것이 나열되어 있어 아주 복잡해 보이기도 하지만, 프로그래머가
실제로 만들 부분은 노란색으로 표시되어 있는 부분 뿐 입니다
. 결국 대부분의 처리는 ARToolKit이 하고(= 그런 함수가
준비되어 있음) 있는 것입니다.

                                                          프로그래머는 노란색 부분만 제작하면 됩니다!

 구체적인 이야기를 하자면, main()함수 안에서 초기화 처리를 실행해, 메인 루프 함수를 동작시킵니다.
그 이후에 계속하여 메인 루프가 반복되어 집니다. 메인 루프 안에는 얻어낸 영상으로 부터 마커를 검출해,
마커를 3차원 위치자세(**의역하기 애매해서 그대로 두겠습니다.)를 계산하고, 마커의 원점으로 하는
좌표계에 변환한 후부터 3D 오브젝트를 그려냅니다. 메인 루프가 동작할 때는 키보드와 마우스의 입력을
받아낼 수 있습니다. 키 입력에 따라 종료 처리를 부르는 것이 일반적입니다.

 하얀색 박스 안에 표시된 처리는 대부분 약속된 처리이기 때문에 샘플 코드 등에서 그대로 사용할 수 있습니다.
프로그래머가 제작해야만 하는 메인 부분은 "어떤 마커가 왔을 때, 어떤 모델을 어떤 식으로 나타낼 것인가?"
라는 부분입니다.  여기에서 중요한 것이, ARToolKit에서의 3D 그래픽 처리에는 'OpenGL'을 사용한다
점입니다. 즉, 3D 오브젝트을 그려내는 것과 조작에는 OpenGL의 지식이 필요합니다. 기초적인 지식이 있다면, 
입방체(정육면체)를 나타내거나, 구체를 나타내거나 하는 정도는 바로 제작할 수 있습니다. OpenGL로 게임을
제작한 경험이 있는 분은 점점 깊이 빠져, 재미있는 것을 만들어 낼 수 있을 것 입니다. "OpenGL라는 건 처음
인데..." 라는 분은 꼭 이번 기회에 공부해 보시길 바랍니다.


 3. 샘플 프로그램 simpleTest.c를 확인해 보자.
  ARToolKit 폴더 안에 들어있는 샘플 프로그램의 소스코드를 확인하고, 프로그래밍 방법을 공부합시다.
 여기에서,
 
          C:\Program Files\ARToolKit\examples\simple
 
 이 폴더 중에 있는 simpleTest.c를 사용해 설명하겠습니다. 이 프로그램이 이해되면, 스스로 ARToolKit을
사용한 프로그램을 만들 수 있게 됩니다.

 3-1. 메인 함수 main()
int main(int argc, char **argv)
{
    glutInit(&argc, argv); // GLUTの初期化
    init();                // 初期化関数の実行

    arVideoCapStart();     // ビデオキャプチャの開始
    argMainLoop( NULL, keyEvent, mainLoop );   // メインループに入る
    return (0);
}
**GLUTの初期化  : GLUT 초기화
**初期化関数の実行  :  초기화 함수의 실행
**ビデオキャプチャの開始  : 비디오 캡쳐의 개시
**メインループに入る  : 메인 루프로 들어감

  메인 함수 안에 써있는 것은 주로 초기화 처리와 메인루프의 실행입니다. 메인루프의 실행은 argMainLoop()에
따라 실행할 수 있습니다. 제 1 인수는 마우스 이벤트 함수, 제 2인수에 키 이벤트 함수, 제 3인수에 메인루프
함수를 지정합니다. 이 프로그램에서는 마우스 이벤트 함수를 지정하지 않았으므로, NULL 입니다. 메인루프에
들어가면 더이상 메인함수에는 돌아오지 않습니다. 다음은 여기에 사용되고 있는 INIT() 함수의 내부를 봅시다.

  3-2. 초기화 함수 init()

static void init( void )
{
    ARParam  wparam;
	
    /* ビデオデバイスの設定 */
    if( arVideoOpen( vconf ) < 0 ) exit(0);  // カメラ設定ファイルをロード
    /* ウィンドウのサイズの取得 */
    if( arVideoInqSize(&xsize, &ysize) < 0 ) exit(0);
    printf("Image size (x,y) = (%d,%d)\n", xsize, ysize);

    /* カメラパラメータの初期化 */
    if( arParamLoad(cparam_name, 1, &wparam) < 0 ) { // カメラパラメータファイルをロード
        printf("Camera parameter load error !!\n");
        exit(0);
    }
    arParamChangeSize( &wparam, xsize, ysize, &cparam ); // 解像度にあわせてパラメータを変更
    arInitCparam( &cparam );                             // カメラパラメータの設定
    printf("*** Camera Parameter ***\n");
    arParamDisp( &cparam );                              // カメラパラメータの表示

    if( (patt_id=arLoadPatt(patt_name)) < 0 ) {  // パターンファイルをロードする
        printf("pattern load error !!\n");
        exit(0);
    }

    /* グラフィックウィンドウを開く */
    argInit( &cparam, 1.0, 0, 0, 0, 0 );
}
**   /* ビデオデバイスの設定 */ : 비디오 디바이스 설정
**   /* ウィンドウのサイズの取得 */ : 윈도우 사이즈 취득
**   /* カメラパラメータの初期化 */ : 카메라 파라미터 초기화
**  // カメラパラメータファイルをロード : 카메라 파라미터 파일을 로드
**  // 解像度にあわせてパラメータを変更 : 해상도에 맞춰 파라미터를 변경
**  // カメラパラメータの設定 : 카메라 파라미터 설정
**  // カメラパラメータの表示 : 카메라 파라미터 표시
**  // パターンファイルをロードする : 패턴 파일을 로드한다.
**  /* グラフィックウィンドウを開く */ : 그래픽 윈도우를 연다.


 함수 이름 앞이 'ar'로 시작하는 ARToolKit 함수가 많이 있습니다.
여기에서 실행하고 있는 것은 아래의 4가지 입니다.
  1. 비디오 디바이스 설정(설정이 기록된 XML 파일을 읽어들임)
  2. 카메라 파라미터를 로드, 해상도에 맞춰 변경하고 설정함.
  3. 패턴 파일을 읽어들임.
  4. 윈도우 작성

 복수의 카메라를 사용하는 경우와 복수의 마커를 사용하는 경우에는 조금 변경이
필요하지만, 하나의 카메라에 하나의 마커를 이용하는 간단한 어플리케이션을 제작할
경우는 이대로 사용하실 수 있습니다. 3D 오브젝트의 로드 등에는 이 함수 안에
추가하셔도 좋습니다.

----------------------------------------------------------------------------------------------

Enginneering Navi - ARToolkit 2 마커제작


2. 스스로 마커를 만들어 보자.
 ARToolKit으로 만들어진 프로그램은 마커의 패턴정보를 기록한 파일(이하 패턴 파일이라 부른다.)을 실행시,
로드하고 있습니다.
 예를 들면, 샘플 프로그램의 simpleLite.exe는 마커 인식에 C:\Program Files\ARToolKit\bin\Data 중에
있는 patt.hiro를 사용하고 있는데, 이 파일은 스스로가 만들 수가 있는데, 여기서는 그 순서에 대해 해설합니다.

2-1. 패턴을 디자인한다.
 ARToolKit의 마커는 검정색 정사각형의 굵은 테두리 안에 흑백, 또는 컬러의 도안이 있는 것을 사용합니다.
이 조건만 만족시킨다면, 스스로 임의의 패턴을 작성하는 것이 가능합니다. 다만, 컬러 도안은 카메라와
프린터의 색 재현성이 인식성능의 영향을 미치기 때문에, 주의해 주시기 바랍니다. 패턴은 임의의 포토샵과
같은 페인트 소프트웨어로 그립니다. 인쇄하고 사용하기 때문에 형식은 상관없습니다.
또한 종이에 펜으로 직접 그려 디자인 한것도 괜찮습니다.


윈도우 기본 제공의 그림판으로도 패턴을 그릴 수 있습니다.
중간에 그려야 할 패턴은 문자로 하는 것을 추천합니다.

마커의 검은 테두리 굵기에 대하여..

 이 기사를 공개한 이후로 꽤 시간이 흘러 알게된 내용입니다. ARToolKit의 마커
패턴은 검은 테두리 부분과 코드 부분의 크기로 암묵적인 조건이 있는 것 같습니
다. (정보의 출처는 개발자 본인임)
 소스코드 위에는 ' 검은 테두리 : 백색 코드 영역 : 검은테두리 '의 비율이
' 1 : 2 : 1 '가 되는 것이 전제되어 있습니다. 코드 인식처리의 부분에서 그 조건을
전제로 코드 영역을 정규화해 인식하기 때문에, 이 조건으로부터 극단적으로 먼
디자인이 된다면 인식이 잘 되지 않을 가능성이 있습니다.(덧붙여 사각형 추출
처리는 관계없음) 공식적으로는 '기본적으로 제공하는 빈 사각형 마커(ARToolKit\patterns\blankPatt.gif)를 베이스로 만드세요.' 라고 되어있는 듯
합니다. 물론 이 조건에서 벗어나면, 느닷없이 밖으로 나간다는  법은 없지만,
정확도라는 점에서 생각해보면 되도록 이 암묵적인 룰을 따르도록 합시다.


2-2. 패턴 파일 작성툴의 사용 방법.
 ARToolKit 폴더 안에 들어있는 패턴 파일 작성툴은 훌륭합니다. 카메라로 직접 촬영하여 패턴 파일을
작성할 수 있습니다. 영상 파일의 형식은 관계없이, 손으로 그린 패턴이라도 만들 수 있는 것은 이 때문
 입니다. 패턴 파일 작성 툴은 아래의 프로그램입니다.

  C:\Program Files\ARToolKit\bin\mkpatt.exe

 2-2-1. mkpatt.exe를 실행하면 아래와 같은 메세지가 표시됩니다.
 
  Enter camera parameter filename(Data/camera_para.dat): 

  
  여기에 사용하는 카메라 파라미터 파일을 입력합니다. 이대로 엔터를 누르면 디폴트인
'Data/camera_para.dat'가 선택됩니다.

 2-2-2. 비디오 캡쳐 설정 다이얼로그가 표시되면, 'OK'를 누릅니다. 그러면 영상 윈도우가 표시됩니다.
 
 2-2-3. 카메라로 물체를 촬영하는 동안에 화면 내에 패턴 조건을 만족하는 직사각형(구형)영역이 있다면,
 빨간색과 녹색 선으로 에워싸게 됩니다.


 디스플레이에 표시되고 있는 패턴을 카메라로 촬영하고 있는 장면
(작성된 패턴이 적색과 녹색 선으로 둘러싸고 있습니다.)

 스스로 제작한 패턴을 종이에 인쇄하던지, PC의 디스플레이 상에 표시하던지 하여, 그 패턴을 카메라로 촬영합니다.
패턴의 좌측 상단 모서리가 빨간색, 우측 하단 모서리가 녹색선으로 에워싸고 있는 상태에서 화면 상에서 좌클릭합니다.

 2-2-4. 클릭하면, 영상이 정지하고, 아래의 메세지가 표시됩니다. 임의의 파일명(예로 patt.kougaku)를 입력합니다.

Enter filename: 

이것으로 패턴 파일이 작성되었습니다. 파일은 'C:\Program Files\ARToolKit\bin'의 폴더 안에 저장됩니다.
 샘플 프로그래밍인 simpleLite.exe는 'C:\Program Files\ARToolKit\bin\Data'의 폴더 안에 있는'patt.hiro'
를 사용하여 패턴인식을 하고 있습니다. 이 파일에 현재 작성한 파일을 덮어쓰기하면, 자신이 만든 마커가 확실히
인식되는지 확인할 수 있습니다.
 
◀ PREV 123 NEXT ▶