2015-01-06 59 views
2

我有一个3D场景与3D模型实例;我想做碰撞检测。我目前正在学习本教程(http://blog.xoppa.com/using-the-libgdx-3d-physics-bullet-wrapper-part1/)。但是,我想要的是更复杂一点。Libgdx近战攻击碰撞检测

有一个角色(一个knight.g3db模型,是来自Libgdx基本3d模型类的示例代码的一部分),它可以用剑攻击。我还有另一个模型实例,我想用剑“攻击”。

检查两个碰撞对象是否不是问题,因为这可以很容易地从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

除非,我猜可能只是得到Vector3的x和z坐标(因为我使用Y坐标)? – hadez30

+0

您可以从V3.x和V3.z创建一个V2。但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); 
        } 

希望这可以帮助你,如果你遇到了同样的问题。如果有改进或与此有关的问题,请随时进行更改。