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 좌표(모델의 꼭대기부분이 바라보는 좌표위치)*/
}