尝试获取光线投射击中的表面的法向量时出现问题
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
白色的 Gizmo 线是墙的法线,从玩家向墙的光线投射获得。它的意思是作为一个参考,一个调试工具。如您所见,方向正确
蓝线表示我从上面的代码 (Physics.Raycast(point, dir
) 进行的光线投射。他们好像穿墙就好了
现在的问题是:红线是我在上面的代码中从 var normal = hitInfo.normal;
得到的法线。我本来希望它们与白色小发明线在同一方向...
你能看出上面代码中的明显错误吗?如果您需要更多信息,请询问。
(抱歉,我无法发表评论,我的回答可能是错误的)
我几乎可以肯定这是以下代码的问题:
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)
但总的来说,我简化了代码很多,它似乎工作得很好。当它碰撞时,我只是在弹丸的向前方向进行光线投射,它工作正常。
我想要一个通过更新其位置(不想在这里使用物理学)来移动的射弹从墙上反弹。
所以我正在做的是检测碰撞,然后使用光线投射来获取墙壁的法线,然后使用 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://www.youtube.com/watch?v=zq5jL2-I1Kg
白色的 Gizmo 线是墙的法线,从玩家向墙的光线投射获得。它的意思是作为一个参考,一个调试工具。如您所见,方向正确
蓝线表示我从上面的代码 (
Physics.Raycast(point, dir
) 进行的光线投射。他们好像穿墙就好了现在的问题是:红线是我在上面的代码中从
var normal = hitInfo.normal;
得到的法线。我本来希望它们与白色小发明线在同一方向...
你能看出上面代码中的明显错误吗?如果您需要更多信息,请询问。
(抱歉,我无法发表评论,我的回答可能是错误的) 我几乎可以肯定这是以下代码的问题:
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)
但总的来说,我简化了代码很多,它似乎工作得很好。当它碰撞时,我只是在弹丸的向前方向进行光线投射,它工作正常。