如何仅从法向量获取下向量?

3
我有一个运行中的3D游戏。红色矩形是我的玩家,位于某种坡道或屋顶上。他没有旋转。现在当他落在这样的坡道上时,我可以通过RaycastHit normal获得绿色向量。 但我想要得到的是紫色向量,这样我就可以给我的玩家速度滑下去。我如何获得那个向量,或者用所给的变量是不可能的? 紫色向量是最接近Vector3.down且切线与屋顶相切的向量。

enter image description here

编辑:我想我已经知道如何获取那个向量了,但我仍然不明白如何计算它。在第二张图片中给出了向量a和b。现在我需要得到向量c,它与从a到b的方向垂直成90度。

enter image description here

我已经弄清楚了。如果有人想知道:我只是这样使用Vector3.RotateTowards:

rigid.velocity = Vector3.RotateTowards(hit.normal, -transform.up, Mathf.PI / 2, 0);

你需要做的是计算你着陆的表面的斜率(就像数学概念中的斜率一样)。搜索“unity slope”即可找到一些结果。 - CakePlusPlus
那并没有对我的问题有太大帮助,但我现在已经自己解决了。 - made3
1
如果你已经解决了问题,应该发布一个答案而不是修改问题。 - Iggy
我甚至还不知道你想要哪些向量... 通过你的二维图纸很难理解 ^^ - derHugo
@made3 答案不应该放在问题正文中,而应该作为答案添加在下面,以便用户可以投票评价每个答案的帮助程度。考虑在下面添加您解决问题的方法,并从问题正文中删除答案。如果您发现自己的答案最有帮助,则可以并且应该接受自己的答案!更多信息请参见此处 - Ruzihm
1个回答

2
你需要的向量是垂直于最靠近重力方向(通常为Vector3.down)的表面法线的向量。你可以使用向量叉积来找到它:将表面法线与重力方向进行叉乘即可。"最初的回答"
Vector3 surfaceNormal;
Vector3 directionOfGravity = Vector3.down;
Vector3 slopeSideways = Vector3.Cross(directionOfGravity, surfaceNormal);
if (slopeSideways != Vector3.zero)
{
    Vector3 slopeDown = Vector3.Cross(surfaceNormal, slopeSideways).normalized;
}
else
{
    // surface is normal to the direction of gravity, there is no downwards slope.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接