C# 爬升系统的网格边缘检测

C# 爬升系统的网格边缘检测,c#,unity3d,virtual-reality,C#,Unity3d,Virtual Reality,我正在做一个虚拟现实游戏,里面有一些攀岩技巧。玩家将能够抓取边缘,我希望使用动态边缘检测,而不是我现在正在做的,在我希望玩家能够抓取的边缘上放置碰撞器。这样做需要很长时间,并且不允许任何程序网格生成 我知道这样的事情可以通过着色器实现,但是因为它们不返回任何数据,所以这不是一个选项。我还有别的办法吗?即使是一种在网格中标记边而不是使用碰撞器的方法也很好。下面是我将如何做的。这是一种固执己见的做法,不一定是最佳做法。您的里程可能会有所不同 忘记对撞机,除非你的水平很小。这里太贵了。我喜欢使用碰撞器

我正在做一个虚拟现实游戏,里面有一些攀岩技巧。玩家将能够抓取边缘,我希望使用动态边缘检测,而不是我现在正在做的,在我希望玩家能够抓取的边缘上放置碰撞器。这样做需要很长时间,并且不允许任何程序网格生成


我知道这样的事情可以通过着色器实现,但是因为它们不返回任何数据,所以这不是一个选项。我还有别的办法吗?即使是一种在网格中标记边而不是使用碰撞器的方法也很好。

下面是我将如何做的。这是一种固执己见的做法,不一定是最佳做法。您的里程可能会有所不同

  • 忘记对撞机,除非你的水平很小。这里太贵了。我喜欢使用碰撞器进行经典物理刚体碰撞。我不认为它们总是与行走或攀爬等运动交互的最佳匹配,尤其是在联合体中,而且经常使用对撞机来检测简单的线-面相交是过分的

  • 分析网格(在运行时,例如,在水平加载期间)并拉出可抓取的边/面。这些将是您攀爬的导航航路点。请注意,您必须定义什么构成“可抓取”边或面,我认为这主要取决于面方向,可以从面法线获得

  • 如果标高较大或复杂,请将这些面进一步分组为体积树结构(oct树、k-d,可以帮助您定位附近的边)

  • 当玩家攀爬时,测试玩家的手和附近可攀爬面的交叉点。只有当玩家“抓住”他认为可以攀爬的边缘时,你才能依靠玩家在这里的动作,进行最耗时的测试


  • 在这个系统下,攀岩本质上是一个小型平台。手必须从一个平台“跳跃”到另一个平台,以实现进一步的垂直运动。

    我将这样做。这是一种固执己见的做法,不一定是最佳做法。您的里程可能会有所不同

  • 忘记对撞机,除非你的水平很小。这里太贵了。我喜欢使用碰撞器进行经典物理刚体碰撞。我不认为它们总是与行走或攀爬等运动交互的最佳匹配,尤其是在联合体中,而且经常使用对撞机来检测简单的线-面相交是过分的

  • 分析网格(在运行时,例如,在水平加载期间)并拉出可抓取的边/面。这些将是您攀爬的导航航路点。请注意,您必须定义什么构成“可抓取”边或面,我认为这主要取决于面方向,可以从面法线获得

  • 如果标高较大或复杂,请将这些面进一步分组为体积树结构(oct树、k-d,可以帮助您定位附近的边)

  • 当玩家攀爬时,测试玩家的手和附近可攀爬面的交叉点。只有当玩家“抓住”他认为可以攀爬的边缘时,你才能依靠玩家在这里的动作,进行最耗时的测试


  • 在这个系统下,攀岩本质上是一个小型平台。手必须从一个平台“跳跃”到另一个平台,以实现进一步的垂直移动。

    您是否可以使用
    Mesh.bounds
    然后在编辑器中选择您想要攀爬的边?@jiveturkey我不明白Mesh.bounds在这里有什么帮助。它只是实际模型周围的一个框。您正在尝试确定网格的边?是的,我希望能够管理它们,例如使用水平边。您希望在运行时特别标识可爬升边吗?在构建时没有安装工作?你的世界几何体有多规则(例如,Minecraft风格或更逼真/不规则的3D)?你是否可以使用
    Mesh.bounds
    ,然后在编辑器中选择你想要攀爬的边?@jiveturkey我不明白Mesh.bounds在这里有什么帮助。它只是实际模型周围的一个框。您正在尝试确定网格的边?是的,我希望能够管理它们,例如使用水平边。您希望在运行时特别标识可爬升边吗?在构建时没有安装工作?你的世界几何结构有多规则(例如,Minecraft风格或更真实/不规则的3D)?“grabbable”指的是任何类似于壁架的东西,其中一个面是平的,另一个面是成角度的(理想情况下,我可以定义角度范围)。你知道有什么算法可以帮我找到这样的边吗?我想我自己可以弄清楚,但是如果有人已经做了,那就太好了。在最简单的情况下,两个面沿着一条边相邻,你可以从面法线得到每个面的方向,并进行比较。在最复杂的情况下——一个真实世界可抓取几何体的不规则三维凹面或凸面部分,尽管我在上面说过,碰撞机可能是最好的,因为任意3D形状检测的算法复杂。但如果可能的话,我会根据需要创建对撞机,因为化身接近或试图抓取几何体。最佳解决方案将取决于您对世界几何的“特殊知识”。例如,如果您作为世界创建者,知道所有可抓取边都将具有向上指向的面(法线(0,1,0))和垂直向外指向的面法线,这将简化问题。或者,如果你知道你需要不规则的几何体,也许你可以接受一系列的法线,因为它们都大致指向“向上”,允许你的真实世界的几何体带有轻微的斜面和坡度等。你也可以使用混合的方法:“干净边”的线平面交点和时髦几何体的碰撞器我指的是任何类似led的东西