Это мой первый пост здесь, поэтому извиняйтесь за любые ошибки.
Я разрабатываю простую игру с использованием OpenGL ES 2.0 и Android 2.3. Моя игровая среда, на которой я сейчас работаю, основана на двумерных спрайтах, которые существуют в трехмерном мире. Конечно, мои мировые сущности обладают информацией, такой как позиция в воображаемом мире, вращательная ценность в виде матрицы float [], обработчика текстуры OpenGL, а также дескриптора Bitmap от Android (я не уверен, что последнее необходимо, поскольку я делаю растеризация с использованием машины OpenGl, но пока она есть только для моего удобства). Это краткий справочный материал, теперь к проблематичной проблеме.
В настоящее время я застрял в обнаружении столкновений на основе пикселов, так как я не уверен, какой объект (здесь текстура OGL или Android Bitmap) мне нужно пробовать. Я имею в виду, что я уже пробовал отображать Android Bitmap, но он полностью не работал у меня - многие сбои во время выполнения в отношении чтения за пределами растрового изображения. Конечно, чтобы читать пиксели из растрового изображения, я использовал метод Bitmap.create для получения правильно повернутого спрайта. Здесь фрагмент кода:
android.graphics.Matrix m = new android.graphics.Matrix();
if(o1.angle != 0.0f) {
m.setRotate(o1.angle);
b1 = Bitmap.createBitmap(b1, 0, 0, b1.getWidth(), b1.getHeight(), m, false);
}
Еще одна проблема, которая может добавить к проблеме или даже быть главной проблемой, заключается в том, что мой прямоугольник пересечения (прямоугольник, указывающий двумерное пространство, взаимное для обоих объектов) создается из частей двух ограничивающих прямоугольников, которые были вычислены с помощью использование функциональных возможностей OpenGL Matrix.multiplyMV (код ниже). Может быть, эти два метода вычисления матриц Android и OpenGL не равны?
Matrix.rotateM(mtxRotate, 0, -angle, 0, 0, 1);
// original bitmap size, equal to sprite size in it model space,
// as well as in world space
float[] rect = new float[] {
origRect.left, origRect.top, 0.0f, 1.0f,
origRect.right, origRect.top, 0.0f, 1.0f,
origRect.left, origRect.bottom, 0.0f, 1.0f,
origRect.right, origRect.bottom, 0.0f, 1.0f
};
android.opengl.Matrix.multiplyMV(rect, 0, mtxRotate, 0, rect, 0);
android.opengl.Matrix.multiplyMV(rect, 4, mtxRotate, 0, rect, 4);
android.opengl.Matrix.multiplyMV(rect, 8, mtxRotate, 0, rect, 8);
android.opengl.Matrix.multiplyMV(rect, 12, mtxRotate, 0, rect, 12);
// computation of object bounding box (it is necessary as object has been
// rotated second ago and now it bounding rectangle doesn't match it host
float left = rect[0];
float top = rect[1];
float right = rect[0];
float bottom = rect[1];
for(int i = 4; i < 16; i += 4) {
left = Math.min(left, rect[i]);
top = Math.max(top, rect[i+1]);
right = Math.max(right, rect[i]);
bottom = Math.min(bottom, rect[i+1]);
};