Unity在碰撞时改变顶点法线

时间:2018-01-13 06:34:35

标签: c# unity3d normals

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

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

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

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

    提前致谢。

2 个答案:

答案 0 :(得分:1)

以下是您修改法线的方法:

<records>
  <record>
    <some-field>some content</some-field>
  </record>
</records>

您希望使用Mesh mesh = GetComponent<MeshFilter>().mesh; Vector3[] vertices = mesh.vertices; Vector3[] normals = mesh.normals; 列表来确定要修改的索引(可能还需要从本地空间转换为世界空间)。然后你可以从世界空间坐标射线投射到球的中心, 1 并使用vertices来确定与球的角度是什么。

来自那里的一些聪明的矢量数学来计算你的飞机的新法线:

  1. raycasthit.normalhit.normal之间找到vector perpendicular:此向量将与平面平行。 如果两个向量是并行的,则转出:你的法线不变(或者应该返回到它的原始值,它将与用于找到球体的光线投射相同)。

  2. 找到垂直于该向量的向量和Vector3.Up:此向量将是您的新常态。

  3. 1 实际上,你想知道你应该瞄准球的中心 down 多远,否则你就会知道当球越远离飞机时,获得最极端的偏移。所以你想要球在X和Z上的位置,但是在Y的平面上有一个固定的偏移量。这不会太难计算。

答案 1 :(得分:0)

我会尝试类似的事情:

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