Введение в программирование трехмерных игр с DX9

       

Вычисляем два вектора, совпадающих



Рисунок 13.12. (а) Вычисляем два вектора, совпадающих со сторонами треугольника. (б) Высота вычисляется путем линейной интерполяции u на dx и v на dz


Обратите внимание, что поскольку нас интересует только значение высоты, мы можем выполнять интерполяцию только для компоненты y и игнорировать остальные компоненты. В этом случае высота определяется по формуле A + dxuy + dzvy.

Итак, вот заключительная часть кода метода Terrian::getHeight:

if(dz < 1.0f - dx) // верхний треугольник ABC { float uy = B - A; // A->B float vy = C - A; // A->C

height = A + d3d::Lerp(0.0f, uy, dx) + d3d::Lerp(0.0f, vy, dz); } else // нижний треугольник DCB { float uy = C - D; // D->C float vy = B - D; // D->B

height = D + d3d::Lerp(0.0f, uy, 1.0f - dx) + d3d::Lerp(0.0f, vy, 1.0f - dz); } return height; }

Функция Lerp выполняет линейную интерполяцию вдоль одномерной линии и ее реализация выглядит так:

float d3d::Lerp(float a, float b, float t) { return a - (a*t) + (b*t); }



Содержание раздела