2015-01-06 2 views
2

У меня есть 3D-сцена с экземплярами трехмерной модели; и я хочу сделать обнаружение столкновений. В данный момент я следую этому руководству (http://blog.xoppa.com/using-the-libgdx-3d-physics-bullet-wrapper-part1/). Однако, я хочу немного сложнее.Libgdx Атака столкновения ближнего боя

Существует символ (модель knight.g3db, которая является частью образца кода из базового класса 3D класса Libgdx), и она может атаковать мечом. У меня также есть еще один пример модели, который я хочу «атаковать» мечом.

Проверка того, что два объекта для столкновения не являются проблемой, поскольку это легко обнаружить из библиотеки Bullet. То, что я хотел бы, возможно, следующий, но я не уверен, как реализовать:

  • Есть меч в качестве объекта столкновения, или
  • Выполнить проверку, если только переднюю часть «ящика» рыцарь сталкивается с другим объектом, или
  • Создайте отдельную невидимую виртуальную коробку перед символом рыцаря и используйте ее в качестве основы, если есть столкновение.

Есть ли какие-либо ссылки, которые вы знаете, которые могут это сделать (если возможно, предлагаемые решения возможны)? Или, если есть лучшее решение, сообщите мне.

То, что я пытаюсь избежать: рыцарь атакует, а другой объект - позади и все еще получает удар.

Заранее спасибо.

ответ

1

Если вы просто хотите избежать попадания врагов в спину, вы можете проверить, столкнулись ли вы с ними. Я возьму его, у вас есть направление Вектор для движения, проверьте разницу в вращении этого вектора против вектора, рассчитанного на основе вашей позиции и врага.

Что-то вроде этого (Отказ от ответственности: из головы, не уверен, что если эту работу, и просто чтобы дать вам идею):

float yourAngle = direction.angle(); 
float enemyAngle = new Vector2(enemyPos.x - playerPos.X, enemyPos.y - playerPos.y).angle(); 

if (yourAngle - enemyAngle < 30 && yourAngle - enemyAngle > -30) //enemy within a 60 degree cone in front of you. 

Это не может быть идеальным решением, но он уверен, это дешевое решение и это может работать очень хорошо.

+0

Спасибо за это, решение кажется прямым. Я искал что-то вроде .angle(). Как это будет работать с Vector3 или ModelInstances? Поскольку я работаю с 3D-пространством. – hadez30

+0

Если, я думаю, можно просто получить x и z (так как я использую Y-up) координаты Vector3? – hadez30

+0

Вы можете просто создать V2 из своих V3.x и V3.z. но это должно быть возможно и с V3, возможно, рывком/рулоном? Но мой 3D-опыт ограничен. – Madmenyo

0

Это то, что я использовал, чтобы проверить, если объект противник находится в «поле зрения» героя (Рабочий код):

/** 
* 
* @param localAngle - the current yaw of the Player 
* @param angleTarget - the angle between the player and the target receipent of the attack -- use RotationHelper.angle() method 
* @param offset - the difference in localAngle(hero) and angleTarget(enemy) 
* @return 
*/ 
public static float angleDifference(float localAngle, float angleTarget, int offset) { 
    float newLocalAngle = (convert180to360(localAngle) + offset) % 360; 
    AppLog.log("ANGLE_DIFFERENCE2", "localAngle(yaw, degrees, with offset): " + newLocalAngle + ", angleTarget: " + angleTarget); 

    float result = 180 - Math.abs(Math.abs(newLocalAngle - angleTarget) - 180); 
    AppLog.log("ANGLE_DIFFERENCE2", "result : " + result); 
    AppLog.log("ANGLE_DIFFERENCE2", "=================================="); 
    return result; 
} 

public static float angle(Vector3 vectorA, Vector3 vectorB) { 
    return new Vector2(vectorB.x - vectorA.x, (-vectorB.z) - (-vectorA.z)).angle(); 
} 


public static float convert180to360(float originalAngle) { 
    float newAngle = 0; 
    if(originalAngle < 0) { 
     newAngle = (originalAngle + 180) + 180; 
    } else { 
     newAngle = originalAngle; 
    } 

    return newAngle; 
} 

Благодаря @Menno Gouw для идеи о получении угла от Vector3.

И ниже код, как я использовал эти вспомогательные методы:

   float angleTarget = RotationHelper.angle(hero.transform.getTranslation(hero.tmpVector), enemy.transform.getTranslation(enemy.tmpVector)); 
        float angleDifference = RotationHelper.angleDifference(hero.transform.getRotation(playerObject.tmpRotation).nor().getYaw(), angleTarget, CHARACTER_TO_WORLD_ROTATION_OFFSET); 
        AppLog.log("ANGLE_DIFFERENCE2", " angle from point hero to enemy): " + angleTarget); 

        if(angleDifference < VIEW_ANGLE_THRESHOLD) { //use 'angleDifference < VIEW_ANGLE_THRESHOLD' 

         enemy.hurt(hero.stats.damage); 
         AppLog.log("HERO_STATE", "Enemy monkey hit!"); 
        } 

        if(enemy.stats.hp <= 0) { 
         AppLog.log("ENEMY_STATE", "Dead monkey"); 
         //TODO: Remove monkey from game 
         enemy.die(); 
         instances.removeValue(gameObject, true); 
        } 

Надеется, что это поможет вам, если вы встречая тот же вопрос. Не стесняйтесь вносить изменения, если есть улучшения или проблемы с этим.

Смежные вопросы