2013-11-28 5 views
0

OpenGL 모델의 3D 좌표를 얻으려고합니다. 이 코드는 포럼에서 발견되었지만 충돌이 어떻게 감지되는지 이해할 수 없습니다.2D 화면 좌표로 3D 모델 좌표 가져 오기 gluUnproject

-(void)receivePoint:(CGPoint)loke 
{ 

GLfloat projectionF[16]; 
GLfloat modelViewF[16]; 
GLint viewportI[4]; 

glGetFloatv(GL_MODELVIEW_MATRIX, modelViewF); 
glGetFloatv(GL_PROJECTION_MATRIX, projectionF); 
glGetIntegerv(GL_VIEWPORT, viewportI); 

loke.y = (float) viewportI[3] - loke.y; 

float nearPlanex, nearPlaney, nearPlanez, farPlanex, farPlaney, farPlanez; 

gluUnProject(loke.x, loke.y, 0, modelViewF, projectionF, viewportI, &nearPlanex, &nearPlaney, &nearPlanez); 
gluUnProject(loke.x, loke.y, 1, modelViewF, projectionF, viewportI, &farPlanex, &farPlaney, &farPlanez); 

float rayx = farPlanex - nearPlanex; 
float rayy = farPlaney - nearPlaney; 
float rayz = farPlanez - nearPlanez; 

float rayLength = sqrtf((rayx*rayx)+(rayy*rayy)+(rayz*rayz)); 

//normalizing rayVector 

rayx /= rayLength; 
rayy /= rayLength; 
rayz /= rayLength; 

float collisionPointx, collisionPointy, collisionPointz; 

for (int i = 0; i < 50; i++) 
{ 
    collisionPointx = rayx * rayLength/i*50; 
    collisionPointy = rayy * rayLength/i*50; 
    collisionPointz = rayz * rayLength/i*50; 
} 
} 

내 의견으로는 중단 조건이 없습니다. 언제 collisionPoint를 찾을 수 있습니까? 또 다른 질문은 다음과 같습니다. 이 충돌 지점에서 텍스처를 어떻게 조작합니까? 나는 해당 버텍스가 필요하다고 생각한다!?

안부

+0

GluUnproject는 화면 좌표를 가져 와서 현재 ModelView 행렬을 사용하여 화면에 비확산하는 데 사용됩니다. 그래서 그것은 현재의 변환 행렬이 주어진다면, 화면상의 특정 x와 y 위치에 대한 좌표를 세계에 제공합니다. 물리 계산을 수행하기 위해 어떻게 사용하려고하는지 잘 모르겠습니다. – Bartvbl

+0

충돌 알고리즘을 광선 추적이라고합니다. 객체의 해당 3D 픽셀을 2D 터치 위치로 가져 오려고합니다. – Philsen

답변

0

그 코드는 지금까지 당신의 loke의 위치에 당신에 가까운 클리핑 장소에서 광선을한다 (50)에 파티션이 선을 따라 3D에 지점의 모든 가능한 위치를 보간합니다. 루프의 종료 지점에 게시 한 원래 코드에서 collisionPointx, y 및 z는 가장 중요한 포인트의 값입니다. 해당 코드에는 "충돌"테스트가 없습니다. 실제로 충돌시킬 3D 오브젝트에 대해 3D 좌표를 테스트해야합니다.

+0

오른쪽. 그리고 어떻게 할 수 있습니까? :) – Philsen

+0

일반적으로 마우스의 위치에서 깊이 버퍼를 읽습니다. 그러면 정규화 된 점이 생깁니다. 다시 세계 좌표계로 변환하십시오. –

+0

glFragCoord와 함께 깊이 버퍼를 사용하는 경우 glreadpixels로 z 값을 읽을 수 있습니까? 왜 광선 추적을해야합니까? – Philsen