【问题标题】:Libgdx Melee Attack Collision DetectionLibgdx 近战攻击碰撞检测
【发布时间】:2015-03-03 15:15:39
【问题描述】:

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

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

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

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

是否有任何您知道可以做到这一点的参考资料(如果上述建议的解决方案甚至可能)?或者如果有更好的解决方案,请告诉我。

我要避免的事情是:骑士攻击而另一个物体在后面并且仍然被击中。

提前致谢。

【问题讨论】:

    标签: java android 3d libgdx collision


    【解决方案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.
    

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

    【讨论】:

    • 感谢您,解决方案似乎很简单。我在寻找类似 .angle() 的东西。不过,它将如何与 Vector3 或 ModelInstances 一起使用?因为我正在使用 3D 空间。
    • 除非,我猜有可能只获得 Vector3 的 x 和 z(因为我使用的是 Y-up)坐标?
    • 您可以从您的 V3.x 和 V3.z 创建一个 V2。但是V3也应该可以,也许偏航/滚动?但我的 3D 体验有限。
    • 酷。谢谢,我想这就是我要找的。接受了答案(虽然我还没有实现):)
    • if (PlayerForward.cpy().rot(player.transform).hasSameDirection(EnemyForward.cpy().rot(enemy.transform)) { ... } 其中 PlayerForward 和 EnemyForward 是指示哪一侧是(未旋转的)正面的方向向量,例如Vector3.Z 或新的 Vector3(0,0,-1);。请注意,为了示例,我使用了cpy(),您应该重新使用临时向量。
    【解决方案2】:

    这些是我用来检查敌人是否在英雄的“视野”内的内容(工作代码):

    /**
     *
     * @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);
                        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多