2012-05-25 4 views
0

여기 실제의 3D 장면에 레이 - 캐스팅을 추가하려고합니다. 우리가 알고있는 것처럼 레이 캐스팅에서는 레이를 캐스팅하기 위해 레이의 방향을 알아야합니다. 광선의 첫 번째 점은 glLookAt에서 얻을 수있는 광선의 시작점입니다. 광선의 두 번째 점은 화면의 각 점입니다. 화면 공간을 잘 조정되어CUDA에서 커널 함수에서 화면 공간 좌표를 세계 공간 좌표로 변환하는 방법

uint x = blockIdx.x*blockDim.x + threadIdx.x; 
uint y = blockIdx.y*blockDim.y + threadIdx.y; 

(X, Y) : 원래 CUDA 레이 캐스팅 SDK에서, 아래의 코드에 의해 커널 기능의 화면 포인트를 얻는다? 이제 (x, y)를 세계 공간 좌표로 변환해야합니다. 좋은 사람은 gluUnProject를 사용하여이 작업을 수행한다고 말했습니다. 좋은 생각! 그러나 CUDA 커널에서 OpenGL 함수를 호출 할 수 없습니다.

어쩌면 역변환 행렬을 사용하여 변환 할 수 있습니다. 그러나 올바른 방법이 확실하지 않습니다. 누가 CUDA 커널 함수에서 화면 좌표를 세계 좌표로 변환하는 방법에 대한 힌트를 줄 수 있습니까?

+3

도움이 필요한 부분이 그다지 명백하지 않습니다. 그것은 변환의 수학입니까, 아니면 수학의 CUDA 구현입니까? 아마도 변환을 수행하는 호스트 코드의 직렬 부분을 작성하여 올바른지 확인한 다음 계산을 CUDA 실행 모델로 매핑하는 방법의 문제점을 살펴볼 수 있습니다. – talonmies

+1

'gluUnproject()'의 소스를보고 CUDA 코드로 구현할 수 있습니다. 이 질문은 CUDA와 완전히 직교합니다 - 당신이 필요로하는 것은 단지 수학이며 각 스레드에 의해 실행될 C 코드입니다. – harrism

답변

1

내 솔루션은 다음과 같이이다 : CUDA 커널에서는 화면이 방법으로 좌표를 가져옵니다

uint x = blockIdx.x*blockDim.x + threadIdx.x; 
uint y = blockIdx.y*blockDim.y + threadIdx.y; 

실제로는 화면이 Z 축에 수직이고 좌표 공간에서 또 다른 의미합니다. gluPerspective에서 우리는 화면과 뷰 위치 사이의 거리를 얻을 수도 있습니다. 따라서 뷰 위치를 알면 화면의 Z 좌표를 계산할 수 있습니다. 따라서 화면의 각 점의 좌표는이 좌표 공간 아래의 (x, y, z)입니다.

이 특정 좌표 공간에서 뷰 방향은 Z 축과 평행합니다. 또한 우리는 세계 공간에서 시야 방향을 안다. 따라서 Z 축 정렬 뷰 방향 (특히 위의 좌표 공간)을 실제 뷰 방향 (월드 공간에서)으로 변환하는 변환 행렬을 계산하면됩니다.

그러면이 행렬을 사용하여 화면의 각 점 (x, y, z)을 월드 공간으로 변환합니다. 이것이 바로 세계 공간 좌표입니다.

저는 이것을 구현하려고합니다.이 아이디어는 구현 후,이 대답을 받아 들일 것입니다.