經過 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();
}
}
目前,平面的所有頂點都在移動,但移動量很小,而且方向似乎不正確。在第一階段,我只是嘗試將平面的所有頂點移動到與 modelRef 在重新定位以匹配 realworldRef.transform 時移動的完全相同的距離和方向。
在此之后,我會嘗試添加一個“影響區域”,該區域會隨著與原始模型參考位置的距離而下降。,因此最近的頂點移動整個距離,遠離的頂點移動較少。
任何幫助最受贊賞。
uj5u.com熱心網友回復:
方向在世界空間中,所以如果你想沿著它移動頂點,你應該先把它轉換到模型空間。
var dir2 = modelObject.transform.InverseTransformVector(dir.normalized * distance);
modelObject是網格過濾器組件附加的物件。distance是您想要在世界空間中移動的距離。
現在您可以使用新方向移動頂點。
displacedVertices[i] = dir2;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/392535.html
