Я уже давно борется с этим. Я пытаюсь определить координаты экрана вершин в модели на экране моего NDS, используя devKitPro. Похоже, что библиотека реализует некоторые функции OpenGL, но, в частности, отсутствует функция gluProject, которая, как я полагаю, позволяет мне сделать именно это, легко.gluProject на NDS?
Я уже давно пытаюсь вычислить координаты экрана с помощью матриц проекции, которые хранятся в регистрах DS, но мне не повезло даже при попытке построить матрицу проецирования с нуля на основе документации 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-трансформированные координаты вершин модели, а также учитывая, какие матрицы будут применены к нему, чтобы на самом деле придумать координаты экрана, не используя функцию gluProject OpenGL? Можете ли вы увидеть что-то явно очевидное, что мне не хватает в моем коде? (Я уточню, когда это возможно, я знаю, что это грубо, это прототип, над которым я работаю, чистота не является высоким приоритетом)
Спасибо!
PS: Как я понимаю, currentMatrix, что я тяну из регистров ДСА, должны быть давая мне комбинированную проекционную, перевод, и матрицу вращения, так как она должна быть точной матрицей, которая будет использоваться для перевод на собственное оборудование DS, по крайней мере, согласно спецификациям в GBATEK. На практике, похоже, на самом деле нет привязанных к нему проекционных координат, которые, я полагаю, имеют какое-то отношение к моим проблемам. Но я не уверен, так как вычисление самой проекции не приводит к разным результатам.
Ничего себе! Я думал, что могу забыть о некоторых шагах. Я, спасибо, проверит это сегодня вечером.^_^ –
+1, хотя математика в видовом экране выглядит неправильно. x 'и y' находятся в диапазоне [-1 1], поэтому их необходимо вернуть до [0-1] до умножения – Bahbar
О, да .. конечно .. Я это изменим! –