Алгоритм расчета координат текстурной плитки в 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 - высоты точек). Чтобы избежать несоответствия, обязательно копируйте координаты при следующей ячейке.