尝试获取光线投射击中的表面的法向量时出现问题

Issue when trying to get the normal vector of the surface hit by a raycast

我想要一个通过更新其位置(不想在这里使用物理学)来移动的射弹从墙上反弹。

所以我正在做的是检测碰撞,然后使用光线投射来获取墙壁的法线,然后使用 vector3.reflect 来了解新的方向。据我所知,我不能使用碰撞法线,因为它是物体的法线,而不是墙,对吧?

代码看起来像这样:

        point = collision.contacts[0].point;
        dir = bullet.transform.forward;
        point -= dir; // to step back a bit, for the raycast

        // this raycast is represented by the blue gizmo lines in the image below
        if (Physics.Raycast(point, dir, out RaycastHit hitInfo, 10f, ~LayerMask.GetMask("EnemyBullet", "PlayerBullet"))) {

            // this is the collider surface normal
            // it's represented by the red lines in the image below
            var normal = hitInfo.normal;

            // this part is not important, what matters is finding out why the normal above is going up, and not away from the wall.
            Vector3 reflect = Vector3.Reflect(-bullet.transform.forward, normal).Y(bullet.transform.position.y);
            Debug.Log(reflect);
            return reflect;
        }

        return Vector3.zero;

(在这里放大了光线投射和正常版本:https://i.imgur.com/TBSy4vb.png?1

这里是问题的视频:https://www.youtube.com/watch?v=zq5jL2-I1Kg

你能看出上面代码中的明显错误吗?如果您需要更多信息,请询问。

(抱歉,我无法发表评论,我的回答可能是错误的) 我几乎可以肯定这是以下代码的问题:

point = collision.contacts[0].point;
dir = bullet.transform.forward;
point -= dir; // to step back a bit, for the raycast

你真的确定退后一步吗?我觉得它时而后退,时而前进。

试试这个:

point = collision.contacts[0].point;
dir = -info.contacts[0].normal;
point -= dir;

它应该正确地后退,然后你的光线投射应该有一个正确的方向。 我从:collisions, getting the normal 也许有帮助。

我发现了问题。

1 - Vector3.Reflect(bullet.transform.forward, normal).Y(bullet.transform.position.y)。我应该将 y 位置设置为 0,而不是子弹变换 y 位置。

2 - 在我的代码中,当我应该使用 transform.rotation = Quaternion.LookRotation(newDirection)

时,我使用 Vector3.Reflect 的 return 值和 transform.lookAt(vector)

但总的来说,我简化了代码很多,它似乎工作得很好。当它碰撞时,我只是在弹丸的向前方向进行光线投射,它工作正常。