void GLRender::SetPickPoint(int x, int y)
{
// OpenGL에서 Unsigned Integer
GLuint selectBuf[BUFSIZ]; // 512
GLint hits, viewport[4];
glSelectBuffer(BUFSIZ, selectBuf); //선택한 결과 저장할 곳 선택.
glRenderMode(GL_SELECT);
glInitNames();
glPushName(0);
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glGetIntegerv(GL_VIEWPORT, viewport);
gluPickMatrix(x-3, y-3, 6, 6, viewport); //선택을 할 때 검사 할 공간을 정의.
glOrtho(0.0, clip_x, 0.0, clip_y, -1, 1); //뷰포트 변경시 왜곡현상 관련
render_mode = SELECT;
GLRenderScene(pDrawObjectList, NULL);
glPopMatrix();
glFlush();
hits = glRenderMode(GL_RENDER); //렌더링모드 변경
processHits(hits,selectBuf);
}
void GLRender::processHits(int hits, GLuint* sbuffer)
{
int k = 0;
for(int i=0; i<hits; i++)
{
int n0 = sbuffer[k];
for(int j=0; j<n0; j++)
{
POSITION pos = pDrawObjectList->GetHeadPosition();
DrawObject* drawObject;
// 그려진 리스트 속의 객체들 Pick
while(pos != NULL)
{
drawObject = (DrawObject*)pDrawObjectList->GetNext(pos);
if(drawObject->id == sbuffer[k+3+j])
drawObject->selected = TRUE;
}
}
k += n0 + 3;
}
}
궁금한것은 processHits 함수입니다.
위에 함수는 픽킹인것까진 알겠는데 아래함수는 뭘 하는 건지 모르겠네요 n0 는 뭐고 sbuffer[k+3+j] 는 왜하는거며 k += n0 + 3; 는 뭐하는 넘인지 모르겠네요.
그리고 또 다른 opengl 질문은 픽킹을 한 개체를 좌표변환을 시켜줄수있나요? glTranslatef 함수를 써서 움직이게 만들고 싶은데 ^^;;
접근을 못하겠네요..휴우 ㅠㅠ
D3D 가 뭐죠? ㅎㅎ
오우 그럼 픽킹좀 아실거같은데 picking 한거 의 대한 개체접근 뭐 키워드좀 그런것좀 알려주세요
네모 그려놓고 네모 클릭하면 픽킹해서 뭐가 선택됐는지 확인한담에 그걸 특정 좌표로 이동시킬려고해요!
네넹
2차원에서 할건데 그냥 x,y 로 하면안돼는건가요?
평면의 방정식이라.. 흐음
헤헤
저 위에 소스에보면 hits 가 선택된 개수고 ,selectbuf 가 저장될 버퍼거든용 그걸 processHits 함수를 이용해서 굴리는거같은데 processHits 가 뭔소린지 모르겠네요
아스트라로테가 하는말보니 돋네... 모르면 말을 하지 말던가... 나처럼..ㅡ.,ㅡ
OpenGL을 써본지도 어언 10여년 전이구나..ㅠㅠ
장면 랜더링 후 processHits를 호출하네.. drawObject->selected = TRUE;.... 걍 객채선택만 하는걸 봐선 다음 프레임 처리시 픽킹된 객체들에 대한 처리가 있을듯 하고...
전체 코드도 아니고, 일부 코드만 저렇게 띵 올리고 질문 올리는넘이 젤 시러..ㅡ,.ㅡ
k += n0 + 3; 이걸 왜 해주는걸까요? \'ㅅ\'