Алгоритм расчета координат текстурной плитки в 3d модели, созданный на основе карты высот

Я конвертирую карту высот в 3d модель, у меня есть небольшая текстура, которая должна представлять 4 точки (то есть 2 треугольника). Проблема заключается в том, что мозаичная структура текстуры слишком велика, если разница в высоте между точками слишком велика. Я хотел бы выложить свою текстуру, чтобы избежать сильного растяжения, но у меня проблема с реализацией алгоритма общего случая. Я сделал фотографии, чтобы представить, что я имею в виду:

коллаж с фотографиями, которые я сделал

в этих примерах я использую только половину текстуры (1 треугольник), все координаты текстуры я устанавливаю вручную.

помогите пожалуйста найти алгоритм расчета текстурных координат в общем случае

код:

class procedure GraphicEngine.AddHeightmapQuad(X, Y, Z1, Z2, Z3, Z4: Double);
const
  Length = 1;
var
  Vertices: PVertex;
  v1, v2, v3, v4: TD3DVector;
begin
  OleCheck(Triangles.Lock(TrianglesCount * 3 * SizeOf(TVertex), 2 * 3 * SizeOf(TVertex), Pointer(Vertices), 0));
  Dec(Vertices);

  Vertices[1]:= TVertex.Create(X         , Y         , Z1,  0,  0);
  Vertices[2]:= TVertex.Create(X + Length, Y         , Z2,  1,  0);
  Vertices[3]:= TVertex.Create(X         , Y + Length, Z3,  0,  1);

  Vertices[4]:= TVertex.Create(X + Length, Y         , Z2,  1,  0);
  Vertices[5]:= TVertex.Create(X         , Y + Length, Z3,  0,  1);
  Vertices[6]:= TVertex.Create(X + Length, Y + Length, Z4,  1,  1);

  D3DXVec3Subtract(v1, Vertices[2].vec, Vertices[1].vec);
  D3DXVec3Subtract(v2, Vertices[3].vec, Vertices[1].vec);

  D3DXVec3Subtract(v3, Vertices[4].vec, Vertices[6].vec);
  D3DXVec3Subtract(v4, Vertices[5].vec, Vertices[6].vec);

  Vertices[2].U:= Sqrt(1 + Sqr(v1.z));
  Vertices[3].V:= Sqrt(1 + Sqr(v2.z));

  Vertices[4].U:= Sqrt(1 + Sqr(v4.z));
  Vertices[5].V:= Sqrt(1 + Sqr(v3.z));

  Vertices[6].U:= Sqrt(1 + Sqr(v4.z));
  Vertices[6].V:= Sqrt(1 + Sqr(v3.z));     

  Inc(TrianglesCount, 2);

  OleCheck(Triangles.Unlock);
end;

1 ответ

Вы можете вычислить точное растяжение текстуры, вычислив фактический размер треугольника. Еще проще, вы можете просто вычислить длину ребер, чтобы скорректировать координаты. Зафиксируйте одну точку в текстуре как 0,0, затем следующую вместо 0, 1 было бы 0, sqrt(1 + (h1 - h2)^2) и то же самое для другой точки сетки (h1 и h2 - высоты точек). Чтобы избежать несоответствия, обязательно копируйте координаты при следующей ячейке.

Другие вопросы по тегам