Как бы вы изменили положение двух матриц? - PullRequest
1 голос
/ 13 июня 2019

В моем коде я создаю 2 матрицы, которые хранят информацию о двух разных сетках, используя следующий код:

Mesh mesh;
MeshFilter filter;

public SphereMesh SphereMesh;
public CubeMesh CubeMesh;

public Material pointMaterial;
public Mesh pointMesh;

public List<Matrix4x4> matrices1 = new List<Matrix4x4>();
public List<Matrix4x4> matrices2 = new List<Matrix4x4>();

[Space]
public float normalOffset = 0f;
public float globalScale = 0.1f;
public Vector3 scale = Vector3.one;

public int matricesNumber = 1; //determines which matrices to store info in

public void StorePoints()
{
    Vector3[] vertices = mesh.vertices;
    Vector3[] normals = mesh.normals;
    Vector3 scaleVector = scale * globalScale;

    // Initialize chunk indexes.
    int startIndex = 0;
    int endIndex = Mathf.Min(1023, mesh.vertexCount);
    int pointCount = 0;

    while (pointCount < mesh.vertexCount)
    {
        // Create points for the current chunk.
        for (int i = startIndex; i < endIndex; i++)
        {
            var position = transform.position + transform.rotation * vertices[i] + transform.rotation * (normals[i].normalized * normalOffset);
            var rotation = Quaternion.identity;
            pointCount++;

            if (matricesNumber == 1)
            {
                matrices1.Add(Matrix4x4.TRS(position, rotation, scaleVector));
            }

            if (matricesNumber == 2)
            {
                matrices2.Add(Matrix4x4.TRS(position, rotation, scaleVector));
            }
            rotation = transform.rotation * Quaternion.LookRotation(normals[i]);
        }

        // Modify start and end index to the range of the next chunk.
        startIndex = endIndex;
        endIndex = Mathf.Min(startIndex + 1023, mesh.vertexCount);
    }
}

GameObject начинается как сетка Cube, и этот код хранит информацию о сеткев matrices1.В другом месте в коде, не показанном, у меня есть это так, что Сетка изменяется на Сферу и затем меняет matricesnumber на 2, затем запускает код выше, чтобы сохранить информацию о новой сетке Сферы в matrices2.

Кажется, это работает, так как я могу использовать код вроде Graphics.DrawMesh(pointMesh, matrices1[i], pointMaterial, 0); для рисования 1 меша на вершину меша Куба.И я могу использовать ту же линию (но с matrices2[i]), чтобы нарисовать 1 сетку на вершину сетки Сферы.

Вопрос: Как мне нарисовать сетку для каждой вершинысетка Cube (информация хранится в matrices1) на экране, а затем сделать эти сетки вершин Lerp в положениях вершин сетки Sphere (информация хранится в matrices2)?

Я пытаюсьвзломать его такими вещами, как

float t = Mathf.Clamp((Time.time % 2f) / 2f, 0f, 1f);
matrices1.position.Lerp(matrices1.position, matrices2.position, t);

, но, очевидно, это неверный код.Какое может быть решение?Спасибо.

1 Ответ

3 голосов
/ 13 июня 2019

Matrix4x4 обычно используется только в особых случаях для прямого вычисления матриц преобразования.

Вы редко используете матрицы в скриптах;чаще всего использование Vector3s, Quaternions и функциональность класса Transform более просты.Простые матрицы используются в особых случаях, например при настройке нестандартной проекции камеры.

В вашем случае мне кажется, что на самом деле вам нужно только как-то хранить и получать доступ к position, rotation и scale.

Я бы посоветовал вообще не использовать Matrix4x4, а просто что-то простое, например,

// The Serializable makes them actually appear in the Inspector
// which might be very helpful in you case
[Serializable]
public class TransformData 
{ 
    public Vector3 position;
    public Quaternion rotation; 
    public Vector3 scale; 
}

Тогда с

public List<TransformData> matrices1 = new List<TransformData>();
public List<TransformData> matrices2 = new List<TransformData>();

вы могли бы просто перепрыгнуть

var lerpedPosition = Vector3.Lerp(matrices1[index].position, matrices2[index].position, lerpFactor);

И если вам нужно это как Matrix4x4, вы все равно можете создать его в режиме ad-hoc, например,

var lerpedMatrix = Matrix4x4.Translation(lerpedPosition);

или использовать значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...