【问题标题】:Unity change vertex normals on collisionUnity在碰撞时改变顶点法线
【发布时间】:2018-01-13 06:34:35
【问题描述】:

当球在地板上滚动时,我想改变地板的顶点法线方向。我只是需要一些关于如何实现这一目标的指导。

到目前为止,这是我前进的方向:

  1. 在开始时复制地板的所有顶点法线。
  2. 在碰撞时获取接触点和光线投射/球体投射/箱形投射以获取受影响的顶点。 (设置变量偏移量来控制我希望受投射影响的顶点数量)
  3. 查找与顶点相关的法线。
  4. 将受影响的法线平行旋转到球最近的表面点。
  5. 当球离开受影响的地板顶点时,慢慢地将地板法线恢复到原始方向。 (设置一个变量来控制法线旋转回原方向的移动速度)

我只需要帮助确定使用哪种类型的铸件以及如何旋转法线平行于球的表面。这是针对移动平台的,因此性能是必须的。

提前致谢。

【问题讨论】:

    标签: c# unity3d normals


    【解决方案1】:

    以下是修改法线的方法:

    Mesh mesh = GetComponent<MeshFilter>().mesh;
    Vector3[] vertices = mesh.vertices;
    Vector3[] normals = mesh.normals;
    

    您可能希望使用vertices 列表来确定要修改哪些索引(可能还需要从本地空间转换为世界空间)。然后,您可以从世界空间坐标投射到球的中心,1 并使用raycasthit.normal 来确定与球的角度。

    那里的一些巧妙的向量数学计算出你的飞机的新法线:

    1. hit.normalVector3.Up 之间找到vector perpendicular:这个向量将平行于平面。 如果两个向量是平行的,转储出来:你的法线没有改变(或者应该返回到它的原始值,这将是与寻找球体的光线投射相同的向量)。

    2. 找到垂直于该向量的向量和hit.normal:该向量将成为您的新法线。

    1 实际上,你会想知道你应该瞄准距离球中心多远,否则,你会得到最极端的球偏移离飞机越来越远。因此,您希望球在 X 和 Z 上的位置,但在 Y 平面上的固定偏移量。这不会太难计算。

    【讨论】:

    • 嗯...你有一些东西在那里。
    • 我可以将球的当前边界复制到一个临时的新边界并稍微缩放。然后将温度范围向下偏移到地板的一半。从那里我可以找到全局的顶点位置。遍历顶点并查看它们是否在临时边界内。这样我就可以知道哪些法线会受到影响。此外,如果法线不在边界内但被更改,我可以将它们旋转回原来的位置。我将不得不研究和测试如何获得垂直向量。
    • 这将消除我对光线投射的需要。
    • @JeroenvanLangen 阅读我的脚注。
    • @Draco18s "慢慢地将地板法线返回到原来的方向。" 暗示应该有跨帧的东西。就像球滚得很快,如果在(例如)草丛中留下痕迹。所以应该有一些东西可以跟踪每个顶点的法线。
    【解决方案2】:

    我会尝试类似:

    为法线创建纹理。每个像素都是顶点的法线(如网格)。计算 3d 球与纹理中法线位置之间的对应坐标,并在每帧上绘制一个球/圆/精灵(如精灵)。然后您可以使用计算着色器将它们缓慢地恢复为默认的向上向量。

    【讨论】:

    • 感谢您的回复。这种方法对于移动应用程序来说听起来很费力。如果我错了,请纠正我,但我还没有机会学习 CG 脚本。实际地板的表面大约有一到两打顶点。我认为操纵顶点的法线会更好。
    • 如果只使用dozen 顶点,包含法线的纹理会非常小。我认为这将在手机上完美运行。它会比检查 cpu 上的每个顶点法线并在每一帧上传它更好。
    • 我不明白为什么这不能只通过一个非常简单的顶点着色器来完成。将球心和半径作为常数传递,从那里计算一切都非常简单,甚至可以按像素计算。
    • @BriceV。这条评论“当球离开受影响的地板顶点时,慢慢地将地板法线返回到原始方向”,这意味着法线的状态必须保存在某个地方。无论是球的路径还是地板的法线。这意味着在 cpu 上,必须更改所有顶点法线并在每一帧上载,或者直接在 gpu 上使用计算机着色器更改它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多