Libgdx近战攻击碰撞检测

时间:2015-01-06 00:53:35

标签: java android 3d libgdx collision

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

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

检查碰撞的两个对象是否不是问题,因为可以从Bullet库中轻松检测到。我想要的可能是以下内容,但我不确定如何实施:

  • 将剑作为碰撞对象,或
  • 实施检查是否只有骑士“盒子”的前部与另一个物体相撞,或
  • 在骑士角色前面创建一个单独的隐形虚拟框,并在发生碰撞时将其作为基础。

您是否知道可以执行此操作的任何参考(如果上述建议的解决方案甚至可行)?或者如果有更好的解决方案,请告诉我。

我想避免的事情:骑士攻击而另一个物体落在之后仍然被击中。

提前致谢。

2 个答案:

答案 0 :(得分: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.

这可能不是理想的解决方案,但它确实是一种廉价的解决方案,而且可能效果很好。

答案 1 :(得分: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);
                    }

希望如果您遇到同样的问题,这会对您有所帮助。如果有改进或问题,请随时进行更改。