Подбор текстур в мире для наложения изображения с использованием сетчатых UV - PullRequest
0 голосов
/ 01 июня 2018

Последние несколько дней я работал над программированием эффекта, который я видел в игре под названием Катакомбы Соляриса .Чтобы проверить эффект, я создал эту демонстрацию:

  1. Это изображение накладывается на экран: (масштабируется в соответствии с разрешением) Наложение изображения радуги .
  2. При нажатии пробела экранные координаты вершин игровой сетки преобразуются в UV и применяются к сетке с той же текстурой.

Когдакамера обращена к четырехугольнику под перпендикулярным углом, эффект выглядит следующим образом: пример перпендикулярной камеры .

По-другому объяснить, если верхняя левая координата четырехугольника равна 30%через экран по горизонтали и 40% по экрану по вертикали, я надеюсь, что при создании UV для вершины (0,3, 0,4) текстура будет идеально соответствовать наложению (как видно на рисунке).

Теперь, эффект работает только в том случае, если камера может смотреть и под другими углами, поэтому вот изображение камеры при небольшом повороте (вокруг оси Y) после обновления текстуры: Пример не перпендикулярной камеры .

Как вы можете видеть, текстура почти выравнивается, но немного искажена, особенно вокруг треугольных границ сетки, как показано здесь вite: Треугольники сетки .

Вот код, который я использую для обновления текстуры

void UpdateTexture() {
    // test is the rainbow Texture2D
    // r is the Renderer
    r.material.mainTexture = test;

    // m is the Quad mesh
    Vector3[] vert = m.vertices;
    Vector2[] uv = m.uv;

    // We will go through each vertex of the mesh
    for(int i = 0; i < uv.Length; i++) {
        // Find where the world position of that vertex is
        Vector3 worldPosition = transform.TransformPoint(vert[i]);
        // Convert that into a screen position based on our camera
        Vector2 screenPosition = CameraToTexture.cam.WorldToScreenPoint(worldPosition);
        // Put that within the range 0...1 as a UV
        Vector2 uvPosition = new Vector2(screenPosition.x / CameraToTexture.cam.pixelWidth, screenPosition.y / CameraToTexture.cam.pixelHeight);
        // Save that UV into our temp array
        uv[i] = uvPosition;
    }

    // Apply to the UV array of the mesh
    m.uv = uv;
} 

Мои вопросы:

  1. Почему текстура искривлена ​​по границам треугольника?
  2. Почему эффект работает по-разному, когда камера не под прямым углом?
  3. Как это исправить?/ Что я могу посмотреть, чтобы лучше понять, что происходит?

Если понадобится дополнительная информация, я, вероятно, смогу ее предоставить.

...