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 오브젝트의 로드 등에는 이 함수 안에
추가하셔도 좋습니다.

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