如何计算三维多边形的向下倾斜矢量?

时间:2010-12-06 23:45:43

标签: collision-detection 3d

我正在为3D平台电脑游戏编写碰撞检测系统。所有基础都运作良好。但是当角色落在陡坡多边形上时,我需要它们向下滑动多边形的斜坡。我可以完成大部分工作,但是我无法找到如何计算与它们碰撞的给定多边形的斜率相匹配的向下矢量。我搜索了许多论坛,包括这个论坛,但找不到答案。

每个多边形由世界空间中的3个顶点(x,y,z)组成。

我也有每个多边形的曲面法线,并熟悉点和交叉积。

我还可以通过获取面法线和世界向上矢量的点积的弧度来计算多边形的简单角度值,其给出多边形的斜率与水平地面的角度,如60度。如果角度比60度更陡,我决定角色应该滑下斜坡。但是我需要向下的矢量与多边形的斜率相匹配,所以我可以随着时间的推移将它们的位置应用到它上面,然后向下滑动。

我相信斜率矢量应垂直于曲面法线,但我不知道如何根据我的信息计算它。

感谢您的帮助......

3 个答案:

答案 0 :(得分:3)

你还需要指定一个'向下'向量。

然后我相信你要求的是将该向下矢量标准化投影到由三角形法线定义的平面中。

nonUnitAnswer = down - dot(down, triangleNormal) * triangleNormal; // could be 0
answer = normalize_safe(nonUnitAnswer);

(你会注意到正面的点意味着你有一个向下的聚合物,对于你的滑动场景,你可能想要以不同的方式处理)

(此外,点的大小可能与您想要滑动的数量相对应,和/或如果您想完全滑动则有一些截止值)

答案 1 :(得分:0)

如果你想要一个独立于玩家速度的矢量,只需找到三角形的中心并从中获得一个矢量到最低的顶点。省略对退化案例的测试看起来像是:

Vertex center = Sum(vertex[0], vertex[1], vertex[2]) / 3;
Vertex lowest = Min(vertex[0], vertex[1], vertex[2]); // min of your up/down coordinate
Vector slopeVector = Normalize(lowest - center);

编辑: 这对于等边三角形或者期望的“低”点不在顶点方向上的三角形不适用。更通用的解决方案可能是围绕由三角形中心定义的轴和最高点和最低点之间的三角形一侧的点旋转法线90度。

理想情况下,你不是独立计算这个,而是计算在许多三角形内插的整体斜率梯度,就像计算插值顶点法线一样。

答案 2 :(得分:0)

我现在手头没有数学,但是如果通过按正常平面(通过移除向上矢量)找到2D方向,留下二维方向/幅度怎么办?您甚至可以通过使用1 - UpVector和标准化法线(1 - 平坦地形法线= 0,1 - 纯垂直悬崖= 1)来作弊并获得斜率。

您可以使用Y分量来确定斜率何时足够陡以应用2D曲线。

我不知道它是否完全准确,但它至少会给你一个快速的近似值。