이글루스 로그인

Stereo viewing coding

스테레오 뷰잉 코딩 첫번째 세미나.
허겁지겁 후다닥 코딩한 결과 도넛츠 주위를 도는 torus 완성.. ㅎㅎ
생각보다 3D viewing이 잘되서... 교수님의 은근한 기대에 부담감만 커지고....

그래도 어쨌든 Mission Complete!!!!!








Core Code by OpenGL

void setStereoPerspective(GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far, GLdouble focalLenght, GLdouble eyeSep, EyeMode eyeMode)
/*스테레오스코픽 투시도법 함수 사용자지정*/
{
GLdouble left;
GLdouble right;

GLdouble top = near*tan(DTOR*fovy/2); // y clipping plane의 0부터의 거리를 계산 // fovy : y방향의 시야각 영역 // near : 가까운 clipping거리 // far : 먼 클리핑거리
GLdouble bottom = -top;

GLdouble halfNearWidth = aspect*top; // aspect에 기초한 x clipping의 0부터의 거리를 계산 // aspect : viewport의 종횡비
GLdouble stereoAdjustment = eyeSep/2*near/focalLenght; // equation 연립에 의한 계산식

if(RIGHT == eyeMode)
{
left = -halfNearWidth - stereoAdjustment; // 오른쪽눈의 left, right 정의
right = halfNearWidth - stereoAdjustment;
}
else
{
left = -halfNearWidth + stereoAdjustment; // 왼쪽눈의 left, right 정의
right = halfNearWidth + stereoAdjustment;
}
glFrustum(left, right, bottom, top, near, far);
/*glFrustum 절두체 즉, 전체공간상에서 랜더링해야하는 공간만을 잘라낸 것, 6개의 인자를 가지며,
첫번째와 두번째는 절두체를 구성하는 왼쪽과 오른쪽의 수직 평면이며 세번째와 네번째는 위와 아래의 수평평면,
다섯번째와 여섯번째는 절두체를 구성하는 시선과 수직인 평면으로써 가장 가까운것과 먼것(반드시 양수)*/
}

void setStereoLootAt(GLdouble eyeX,GLdouble eyeY, GLdouble eyeZ, GLdouble centreX, GLdouble centreY, GLdouble centreZ, GLdouble upX, GLdouble upY, GLdouble upZ, GLdouble eyeSep, GLdouble eyeMode)
/*단순히 카메라는 약간씩 왼쪽 그리고 오른쪽으로 이동한다. 불행히도 어느방향이 왼쪽 오른쪽인지 3D 모델 공간에서는 사실상 알 수 없다.
그러나 우리는 이런 약간의 방향들을 데이터를 Input하여 계산해 LookAt함수에 기존의 좌표에 더해줄 수 있다.
그렇게 해서 stereoLookAt 함수값이 셋팅된다.*/
{
GLdouble inX = centreX - eyeX;
GLdouble inY = centreY - eyeY;
GLdouble inZ = centreZ - eyeZ;

GLdouble factor = (eyeMode == RIGHT)?1:-1;
// eyeMode에서 들어오는값 Right는 1 Left는 -1을 factor인자에 대입하여 오른쪽 왼쪽을 계산

GLdouble realEyeCorX = factor*(inY*upZ - upY*inZ);
GLdouble realEyeCorY = factor*(inZ*upX - upZ*inX);
GLdouble realEyeCorZ = factor*(inX*upY - upX*inY); //vector cross product of "in" with "up"

GLdouble length = sqrt(realEyeCorX*realEyeCorX + realEyeCorY*realEyeCorY + realEyeCorZ*realEyeCorZ);
//realEyeCor 벡터의 길이값 계산

GLdouble corLengthFactor = eyeSep/(2*length); // 축소비 지정
realEyeCorX *=corLengthFactor;
realEyeCorY *=corLengthFactor;
realEyeCorZ *=corLengthFactor; // 각 realEyeCor 좌표에 축소비를 곱해서 누적연산

gluLookAt(eyeX + realEyeCorX, eyeY + realEyeCorY, eyeZ + realEyeCorZ, centreX, centreY, centreZ, upX, upY, upZ);
/* EyeMode가 right이면 realEyeCor은 양수 , left이면 음수*/
/*모델과 Eye와의 거리값에 따른 카메라 시선의 위치가 약간씩 변함*/
/*첫번째 xyz좌표는 바라보는 시선의 위치, 두번째xyz죄표는 모델의 위치, 세번째는 모델의 top 좌표(모델의 꼭대기부분이 바라보는 좌표위치)*/
}




Download : stereo_viewing_coding.ppt
by KaKaLoT | 2007/06/07 12:23 | Major[Stereoscopic] | 트랙백


트랙백 주소 : http://kakalot.egloos.com/tb/1246371
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
※ 로그인 사용자만 덧글을 남길 수 있습니다.








rss

skin by jiinny