저는 지금 좋은 일을 위해이 문제에 고심하고 있습니다. devKitPro를 사용하여 내 NDS 화면의 모델에서 꼭지점의 화면 좌표를 결정하려고합니다. 라이브러리는 OpenGL의 일부 기능을 구현하는 것으로 보이지만, 특히 gluProject 기능이 빠져 있습니다. 이는 내가 정확히 그렇게 쉽게 할 수있게 해줄 것입니다.gluProject on NDS?
저는 DS의 레지스터에 저장된 투영 matricies를 사용하여 화면 좌표를 수동으로 계산하는 동안 좋았 습니다만, 투영 행렬을 만들려고 할 때조차도별로 행운이 없었습니다. OpenGL의 문서를 바탕으로 처음부터. 여기 내가 사용하려고 해요 코드는 다음과 같습니다
void get2DPoint(v16 x, v16 y, v16 z, float &result_x, float &result_y)
{
//Wait for the graphics engine to be ready
/*while (*(int*)(0x04000600) & BIT(27))
continue;*/
//Read in the matrix that we're currently transforming with
double currentMatrix[4][4]; int i;
for (i = 0; i < 16; i++)
currentMatrix[0][i] =
(double(((int*)0x04000640)[i]))/(double(1<<12));
//Now this hurts-- take that matrix, and multiply it by the projection matrix, so we obtain
//proper screen coordinates.
double f = 1.0/tan(70.0/2.0);
double aspect = 256.0/192.0;
double zNear = 0.1;
double zFar = 40.0;
double projectionMatrix[4][4] =
{
{ (f/aspect), 0.0, 0.0, 0.0 },
{ 0.0, f, 0.0, 0.0 },
{ 0.0, 0.0, ((zFar + zNear)/(zNear - zFar)), ((2*zFar*zNear)/(zNear - zFar)) },
{ 0.0, 0.0, -1.0, 0.0 },
};
double finalMatrix[4][4];
//Ugh...
int mx = 0; int my = 0;
for (my = 0; my < 4; my++)
for (mx = 0; mx < 4; mx++)
finalMatrix[mx][my] =
currentMatrix[my][0] * projectionMatrix[0][mx] +
currentMatrix[my][1] * projectionMatrix[1][mx] +
currentMatrix[my][2] * projectionMatrix[2][mx] +
currentMatrix[my][3] * projectionMatrix[3][mx] ;
double dx = ((double)x)/(double(1<<12));
double dy = ((double)y)/(double(1<<12));
double dz = ((double)z)/(double(1<<12));
result_x = dx*finalMatrix[0][0] + dy*finalMatrix[0][1] + dz*finalMatrix[0][2] + finalMatrix[0][3];
result_y = dx*finalMatrix[1][0] + dy*finalMatrix[1][1] + dz*finalMatrix[1][2] + finalMatrix[1][3];
result_x = ((result_x*1.0) + 4.0)*32.0;
result_y = ((result_y*1.0) + 4.0)*32.0;
printf("Result: %f, %f\n", result_x, result_y);
}
그곳에서 DS는 내부적으로 고정 소수점 표기법을 사용하여 작동과 관련된 변화를 많이하고 내가 작업 할 두 배에 해당 변환해야합니다. 내가 얻는 것은 다소 정확할 것 같습니다. 화면을 바라 보는 평면 쿼드를 사용하면 픽셀이 완벽하게 변환되지만, 회전은 어색합니다. 또한, 나는 스크린 너비/높이를 설명하는 투영 행렬로 가고 있기 때문에, 사용하고자하는 마지막 단계는 전혀 옳지 않은 것처럼 보입니다. 프로젝션 매트릭스가 나를 위해 화면 해상도까지 단계를 달성하면 안됩니까?
저는이 모든 것에 익숙하지 않습니다. 매트릭스 수학에 대한 공정한 이해를 가지고 있지만, 3D 그래픽에 들어가기를 원하는만큼 능숙하지는 않습니다. 여기에있는 누군가가 모델의 정점의 3D, 비 변형 좌표를 감안할 때 OpenGL의 gluProject 함수를 사용하지 않고 화면 좌표를 실제로 나타낼 수있는 방법을 알고 있습니까? 제 코드에 빠져있는 것이 뻔뻔스럽게 보이는 것을 볼 수 있습니까? (나는 가능한 한 명확히 할 것이다, 나는 그것이 거칠다는 것을 알고있다, 이것은 내가 연구하고있는 프로토 타입이며, 청결은 최우선 순위는 아니다)
감사합니다.
추신 : 내가 이해하는 바로는, DS의 레지스터에서 가져온 currentMatrix는 이어야합니다.은 정확한 투영, 변환 및 회전 행렬을 제공해야합니다. 정확하게 사용될 행렬이어야합니다. 적어도 GBATEK의 사양에 따라 DS의 자체 하드웨어로 변환합니다. 실제로는 투영 좌표가 실제로 적용된 것 같지 않습니다. 내 문제와 관련이 있다고 생각합니다. 그러나 투영 계산 자체가 다른 결과를 생성하지 않으므로 확실하지 않습니다.
와우! 나는 내가 몇 걸음을 잊어 버릴지도 모른다고 생각했다. 네, 고마워요, 오늘 밤 이걸 시험 할게요.^_^ –
+1, 뷰포트 수학이 나에게 틀린 것처럼 보일지라도. x '와 y'는 [-1 1] 범위에 있으므로 곱하기 전에 [0-1]로 되돌려 놓아야합니다. – Bahbar
아, 물론 .. .. 나는 그것을 바꿀 것입니다! –