Я пытаюсь разработать простое игровое приложение для Android, используя OpenGL в качестве своей базы.Пока что у меня есть базовая настройка с некоторыми формами и классом объектов, который создает квадрат.Камеру можно перемещать, касаясь и перетаскивая, и увеличивая масштаб двумя пальцами.Я пытался взглянуть на многие учебные пособия о том, как использовать gluUnProject для получения сенсорных координат и преобразования их в мировые координаты.До сих пор я получал очень смешанные результаты, такие как неточные координаты, когда касание достигает краев экрана.Вот база моего кода обнаружения касания для справки:
public int selectEntity(float x, float y)
{
//x and y parameters are the raw touch coordinates
for(GameObj entity: entities)
{
System.out.println("Coordinates of touch before matrix transformation: X: " + x + ", Y: " + y);
y = mView[3] - y; //flipping y to match y origin
System.out.println("Coordinates of touch after flipping Y: X: " + x + ", Y: " + y);
//I have used two matrices to hold unprojected transforms:
//nearPos is calculated using nearPlane value of 1
//farPos is calculate using farPlane value of 10
float[] nearPos = new float[4];
float[] farPos = new float[4];
//I pass the MVPMatrix as the 4th parameter currently, although
//everywhere else that I've seen, the modelView matrix is used,
//but I have no idea how that is acquired. I have tried using
//GLES11 to fetch it but that gave me no results. I have also
//tried passing the View Matrix, but that gave worse results.
//mView holds [0,0,width,height] of screen
boolean unprojectedNear = (GLU.gluUnProject(x, y, 1,
mMVPMatrix, 0, mProjectionMatrix, 0,
mView, 0, nearPos, 0) == GLES20.GL_TRUE);
boolean unprojectedFar = (GLU.gluUnProject(x, y, 10,
mMVPMatrix, 0, mProjectionMatrix, 0,
mView, 0, farPos, 0) == GLES20.GL_TRUE);
if (unprojectedNear && unprojectedFar)
{
System.out.println("Converted point coords at farpos: X: " + farPos[0]/farPos[3] + ", Y: " + farPos[1]/farPos[3] + ", Z(?): " + farPos[2]/farPos[3] );
System.out.println("Converted point coords at nearpos: X: " + nearPos[0]/nearPos[3] + ", Y: " + nearPos[1]/nearPos[3] + ", Z(?): " + nearPos[2]/nearPos[3] );
//dividing by the w component
nearPos[0] /= nearPos[3];
nearPos[1] /= nearPos[3];
nearPos[2] /= nearPos[3];
nearPos[3] /= nearPos[3];
farPos[0] /= farPos[3];
farPos[1] /= farPos[3];
farPos[2] /= farPos[3];
farPos[3] /= farPos[3];
//It is to my belief that the correct (x,y) world coordinates should be contained in either
//(nearPos[0],nearPos[1]), or in (farPos[0],farPos[1])
}
//I have tried to use farPos instead of nearPos here with inconcusive results
if(entity.touched(nearPos[0], nearPos[1]))
{
System.out.println("I AM AN OBJECT AND I HAVE BEEN TOUCHED");
}
}
return -1;
}
Я не слишком знаком со сложностями OpenGL, но я думаю, что моя проблема может заключаться в том, что я не могу должным образом импортировать матрицу modelView.Сама концепция все еще смущает меня, это просто умножение модели объекта на матрицу вида?Не будет ли достаточно пройти матрицу вида?Кроме того, я планирую сделать свою игру в 2D, так что в этом случае мне действительно нужно беспокоиться об использовании значений в дальнем и ближнем плане из-за ортогональной проекции?
Если какой-либо другой кусок моегокод поможет лучше понять эту проблему, я буду рад ее предоставить.
Спасибо.