【问题标题】:Deform a Mesh in Unity to Align Reference Points at Runtime在 Unity 中变形网格以在运行时对齐参考点
【发布时间】:2021-12-23 12:37:52
【问题描述】:

经过 2 天的研究和尝试不同的教程/方法试图掌握这个问题,我已经放弃了。

我在这个 youtube 视频中解释了我正在努力实现的目标...... https://youtu.be/GJ6Du0EENhc - 7 分钟

这个简化的问题: 在我的测试场景中,我在容器内有一架飞机。容器内还有一个名为“modelref”的球体,其位置与平面相交。容器外面是另一个名为“realworldref”的球体。

我想要做的是按下一个按钮,模型参考将移动到真实世界参考的位置。同时,它应该从平面上拖动顶点,以便将最接近模型引用的顶点一直拉到新位置,效果消散到半径“影响区域”(最终定义为一个盒子对撞机)。

我尝试过的: 我做了一些简单的步骤(省略影响半径),但我的大脑无法掌握方向、矢量、大小等......所以平面的顶点甚至没有在正确的方向上移动正确的距离。

这是我当前在 modelref 上的脚本:

    public void HandleInput() //responds to mouse click
    {
    Vector3 heading = (realWorldRef.transform.position - this.transform.position);
    float distance = heading.magnitude;
    Vector3 dir = heading / distance;

    this.transform.position = realWorldRef.transform.position;
    MeshDeformer deformer = colliderOfMeshToDeform.GetComponent<MeshDeformer>();

    if (deformer)
    {
        deformer.DeformByDirectionAndDistance(heading, dir, distance);
    } 
  }

那么这是 MeshDeformer 脚本:

公共类 MeshDeformer : MonoBehaviour {

Mesh deformingMesh;
Vector3[] originalVertices, displacedVertices;

void Start()
{
    deformingMesh = GetComponent<MeshFilter>().mesh;
    originalVertices = deformingMesh.vertices;
    displacedVertices = new Vector3[originalVertices.Length];
    for (int i = 0; i < originalVertices.Length; i++)
    {
        displacedVertices[i] = originalVertices[i];
    }
}

internal void DeformByDirectionAndDistance(Vector3 heading, Vector3 normalisedDir, float distance)
{
    for (int i = 0; i < displacedVertices.Length; i++)
    {
        MoveVerticesByDirectionAndDistance(i, heading, normalisedDir, distance);
    }
}

private void MoveVerticesByDirectionAndDistance(int i, Vector3 heading, Vector3 normalisedDir, float distance)
{
    displacedVertices[i] += normalisedDir * distance; //this is the bit that is wrong...
    deformingMesh.vertices = displacedVertices;
    deformingMesh.RecalculateNormals();
}
}

目前,平面的所有顶点都在移动,但移动量很小,而且看起来方向并不正确。在第一阶段,我只是尝试将平面的所有顶点移动到与重新定位以匹配 realworldRef.transform 时 modelRef 移动完全相同的距离和方向。

在此之后,我会尝试添加一个“影响区域”,它会随着与原始模型参考位置的距离而下降。因此,最近的顶点会移动整个距离,而距离较远的顶点则移动较少。

非常感谢任何帮助。

【问题讨论】:

    标签: c# unity3d mesh


    【解决方案1】:

    方向在世界空间,所以如果你想沿着它移动顶点,你应该先将它转换到模型空间。

    var dir2 = modelObject.transform.InverseTransformVector(dir.normalized * distance);
    

    modelObject 是网格过滤器组件附加的对象。 distance 是您要在世界空间中移动的距离。

    现在您可以按照新方向移动顶点。

    displacedVertices[i] += dir2;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      相关资源
      最近更新 更多