Подтвердить что ты не робот

Проблема обнаружения столкновений на основе пикселов с OpenGLES 2.0 под Android


Это мой первый пост здесь, поэтому извиняйтесь за любые ошибки.
Я разрабатываю простую игру с использованием 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]);
};
4b9b3361

Ответ 1

Приветствия,

сначала отметьте, что в вашем коде есть ошибка. Вы не можете использовать Matrix.multiplyMV() с исходным и целевым векторами, являющимися одинаковыми (функция будет правильно вычислять координату x, которую она будет переписывать в исходном векторе. Однако для вычисления y, z и w требуется исходный x координаты - которые в свою очередь ошибочны). Также обратите внимание, что вам было бы проще использовать граничные сферы для первого этапа столкновения обнаружения, так как они не требуют, чтобы такой сложный код выполнял преобразование матрицы.

Затем обнаружение столкновения. Вы не должны читать из растровых изображений или текстур. Вы должны сделать, чтобы построить силуэт для вашего объекта (это довольно легко, силуэт - это всего лишь список позиций). После этого вам нужно построить выпуклые объекты, которые заполняют (не выпуклый) силуэт. Это может быть достигнуто, например. алгоритм обрезания уха. Он может быть не самым быстрым, но его очень легко реализовать и будет выполняться только один раз. Когда у вас есть выпуклые объекты, вы можете преобразовать их координаты с помощью матрицы и обнаруживать столкновения с вашим миром (есть много хороших статей о пересечениях лучей-треугольников, которые вы можете использовать), и вы получаете такую ​​же точность, как если бы вы использовали пиксель обнаружение столкновения на основе.

Надеюсь, это поможет...