Я пишу игру для Android, используя Java и OpenGL. Я могу идеально отобразить все на экране, но когда я пытаюсь проверить, сталкиваются ли два объекта или нет, мой алгоритм обнаруживает столкновение до того, как оно произойдет на экране.
Вот как я проверяю столкновение:
for(int i=0; i<enemies.size(); i++) {
float enemyRadius = enemies.elementAt(i).worldSpaceBoundingSphereRadius();
float[] enemyPosition = enemies.elementAt(i).getWorldSpaceCoordinates();
for(int j=0; j<qubieBullets.size(); j++) {
float bulletRadius = bullets.elementAt(j).worldSpaceBoundingSphereRadius();
float[] bulletPosition = bullets.elementAt(j).getWorldSpaceCoordinates();
float[] distanceVector = Vector3f.subtract(enemyPosition, bulletPosition);
float distance = Vector3f.length(distanceVector);
if(distance < (enemyRadius + bulletRadius)) {
enemies.remove(i);
qubieBullets.remove(j);
i--;
j--;
// Reset enemy position
}
}
}
Когда вражеский куб (представленный сферой для обнаружения столкновений) приближается к игроку, игрок стреляет пулей (также кубом, представленным сферой) во врага. Я ожидаю, что враг сбрасывается, когда пуля попадает в него на экране, но это происходит гораздо раньше.
Методы расчета положения и радиуса в мировом пространстве:
public float[] getWorldSpaceCoordinates() {
float[] modelSpaceCenter = {0.0f, 0.0f, 0.0f, 1.0f};
float[] worldSpaceCenter = new float[4];
Matrix.multiplyMV(worldSpaceCenter, 0, getModelMatrix(), 0, modelSpaceCenter, 0);
return new float[] {worldSpaceCenter[0]/worldSpaceCenter[3], worldSpaceCenter[1]/worldSpaceCenter[3], worldSpaceCenter[2]/worldSpaceCenter[3]};
}
public float worldSpaceBoundingSphereRadius() {
float[] arbitraryVertex = new float[] {1.0f, 1.0f, 1.0f, 1.0f};
float[] worldSpaceVector = new float[4];
Matrix.multiplyMV(worldSpaceVector, 0, getModelMatrix(), 0, arbitraryVertex, 0);
float[] xyz = new float[] {worldSpaceVector[0]/worldSpaceVector[3], worldSpaceVector[1]/worldSpaceVector[3], worldSpaceVector[2]/worldSpaceVector[3]};
return Vector3f.length(xyz);
}
Это мой код или математика неверны? Я не могу придумать больше ничего, чтобы попробовать, и было бы полезно, если бы кто-нибудь мог указать мне правильное направление.
getModelMatrix()
не преобразует его без вращения), вы можете упростить вычисление радиуса доrad = sqrt( 3 * (x/2) * (x/2) )
, гдеx
— длина одного ребра куба. Кроме того, я предполагаю, что ранние столкновения, которые вы заметили, ОЧЕНЬ ранние, потому что при использовании сфер для обнаружения столкновений кубов это все равно произойдет. - person Foggzie   schedule 16.12.2015