2010-12-06 48 views
0

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

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

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

我也可以通过获取面法线和世界向量的点乘积的arccos来计算多边形的简单角度值,它给出多边形的坡度与地平面的角度,如60度。如果角度超过60度,我决定角色应该滑下斜坡。但是我需要与多边形的斜率相匹配的向下矢量,所以我可以随着时间的推移将它们的位置应用于它,从而滑落。

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

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

回答

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度。

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

0

我现在手边没有数学,但是如果通过按正常平面(通过去除向上的矢量)找到二维方向,留下二维方向/大小怎么办?您甚至可以通过使用具有标准化法线的1-UpVector(1-平坦地形法线= 0,1-纯粹垂直悬崖= 1)来骗取和获得坡度。

您可以使用Y分量来决定何时斜率足够大以应用2D分量。

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

3

您还需要指定“向下”向量。

那么我相信你所要求的是下降矢量到三角形法线所定义的平面中的归一化投影。

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

(你会注意到,该点为正意味着你有一个向下的多,这对于你的滑动情况下,你可能要处理不同)

(进一步,点的大小可能对应于你想要滑动多少,和/或如果你想滑动的话,可以选择一些截止点)

+0

+1我以前是这样做的。如果您将向下矢量的大小设置为等于您的引力,那么非标准化的nonUnitAnswer矢量将成为在下坡方向上作用的引力的组成部分 - 这是一个有用的值。 – 2010-12-08 03:07:37