【问题标题】:How do I calculate the downward slope vector of a 3D polygon?如何计算 3D 多边形的下坡向量?
【发布时间】:2010-12-06 23:45:43
【问题描述】:

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

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

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

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

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

感谢您的帮助...

【问题讨论】:

    标签: collision-detection 3d


    【解决方案1】:

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

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

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

    (您会注意到,正点表示您有一个向下的多边形,对于您的滑动场景,您可能希望以不同的方式处理)

    (此外,点的大小可能会对应于您想要滑动的程度,和/或如果您想要滑动的某个截止点)

    【讨论】:

    • +1 我过去就是这样做的。如果您将向下向量的大小设置为等于重力,则未归一化的 nonUnitAnswer 向量将是作用在下坡方向的重力分量 - 一个有用的值。
    【解决方案2】:

    如果您想要一个独立于玩家速度的向量,只需找到三角形的中心并从该中心获取一个向量到最低顶点。省略对退化情况的测试,它看起来像:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-12-29
        • 1970-01-01
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 2023-04-07
        • 2012-07-31
        相关资源
        最近更新 更多