【发布时间】: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 移动完全相同的距离和方向。
在此之后,我会尝试添加一个“影响区域”,它会随着与原始模型参考位置的距离而下降。因此,最近的顶点会移动整个距离,而距离较远的顶点则移动较少。
非常感谢任何帮助。
【问题讨论】: