2012-03-09 3 views
1

나는 카메라가 3 차원 공간에서 정지 된 2 차원 평면 위로 움직이는 openframeworks에서 게임을 만들고 있습니다. 카메라가 항상 움직이기 때문에 모든 프레임에 대해 5 개의 좌표를 선택해야합니다 (마우스 1 개, 뷰포트 모서리 4 개). 그러나 gluUnproject 함수가 너무 느린 것을 발견했습니다. Z = 0 인 고정 평면에서 좌표 만 따기 때문에 내 카메라 클래스의 modelview 및 투영 행렬을 사용하여 좌표를 매우 저렴하게 계산할 수 있어야한다는 것을 알았지 만 해결할 수 없습니다. 수학을하는 법. 비 투영 좌표로 좌표 평면은 I 화면을 변환 할 world_dims.x, world_dims.yglunproject 저렴 대안

치수 Z 축에 정렬 된 모델 뷰 및 프로젝션 매트릭스 뷰포트 -

제가

카메라가 요약하자면 gluUnproject를 사용하지 않고 비행기에서.

는 Incase의 나는 내가 gluUnproject 기능이 너무 느린 것으로 나타났습니다 그러나 그 비트

ofVec3f ofxGrabCam::pickCoordinate(ofVec2f t_mouseP) { 
//read z value from depth buffer at mouse coords 

ofVec3f t_mouseW(t_mouseP.x, t_mouseP.y, 0); 

glReadPixels(t_mouseW.x, ofGetScreenHeight()-1-t_mouseP.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &t_mouseW.z); 

if (t_mouseW.z == 1.0f){ 
    return ofVec3f(-99,-99,-99); //represents point not found 
} 

GLdouble c[3]; 

gluUnProject(t_mouseW.x, ofGetScreenHeight()-1-t_mouseW.y, t_mouseW.z, matM, matP, viewport, c, c+1, c+2); 

ofVec3f mouseW(c[0],c[1],c[2]); 

return mouseW; 

}

답변

3

내 gluUnproject을 heres 코드와 바보 인거야.

단지 5 개의 좌표 만 역 변환하면 성능 병목 현상이 발생하지 않습니다.

gluUnproject를 사용하지 않고 화면 좌표를 평면에서 투영되지 않는 좌표로 변환하려고합니다.

역변환 경로를 결정해야합니다. 즉, 모델 공간에서부터보기 공간으로의 방향을 묘사하는 행렬을 뒤집은 다음 (그리고 시점을 반전하여 어떤 점에서 그 점을 반전하여) 좌표로 전달합니다. 그러나 이것은 gluUnproject가하는 것과 정확히 같습니다.

+1

저는 성능이 떨어지고 있습니다 (60fps에서 실행하려고합니다). 확실히 나는 모든 것을 올바르게하고있다.하지만 내 코드를 편집 할 것이다. 나는 지금이 방법 http://www.mvps.org/directx/articles/rayproj.htm을 조사해 왔지만 여전히 운이 없다. 특정 순서로 수행해야하는 특정 전환을 내게 줄 수 있습니까? –

+0

저는 gluUnproject가 주요 병목 현상이 있음을 발견했으며,이 질문에 대안에 대한 답이 있다면 사랑했을 것이라고 말하고 싶습니다. – Jeff

+0

@ Jeff : 성능 저하는 gluUnProject 때문이 아닙니다. 병목 현상은 glReadPixels입니다. 원하는 모든 것이 광선이라면 glReadPixels을 사용하지 말고 0과 1을 Z 좌표로 사용하십시오. – datenwolf