Как найти z по произвольным координатам x, y внутри треугольника, если у вас есть вершины треугольника - PullRequest
3 голосов
/ 01 апреля 2011

Учитывая вершины V1 (x1,y1,z1), V2 (x2,y2,z2), V3 (x3,y3,z3) треугольника T, я должен найти координату z точки по ее координате x, y, если я знаю, что (x,y) лежит в проекции треугольника Tp (x1,y1), (x2,y2), (x3,y3).

На самом деле, плоскость треугольника в 3D определяется уравнением: Ax+By+Cz+D=0, и я могу найти z = (D-Ax-By)/C Проблема в том, что A, B, C, D слишком дороги для вычисления во время выполнения:

A = y1(z2-z3) + y2(z3-z1) + y3(z1-z2)
B = z1(x2-x3) + z2(x3-x1) + z3(x1-x2)
C = x1(y2-y3) + x2(y3-y1) + x3(y1-y2)
D = -x1(y2*z3 – y3*z2) – x2(y3*z1 – y1*z3) – x3 (y1*z2 – y2*z1)

Можно ли рассчитать A, B, C, D с помощью, скажем, шейдеров opengl?Существуют ли оптимизированные алгоритмы для нахождения плоских коэффициентов?

1 Ответ

6 голосов
/ 01 апреля 2011

Техника называется барицентрическими координатами, но вики-странице довольно сложно следовать - Смотри http://www.alecjacobson.com/weblog/?p=1596

float calcY(vec3 p1, vec3 p2, vec3 p3, float x, float z) {
        float det = (p2.z - p3.z) * (p1.x - p3.x) + (p3.x - p2.x) * (p1.z - p3.z);

        float l1 = ((p2.z - p3.z) * (x - p3.x) + (p3.x - p2.x) * (z - p3.z)) / det;
        float l2 = ((p3.z - p1.z) * (x - p3.x) + (p1.x - p3.x) * (z - p3.z)) / det;
        float l3 = 1.0f - l1 - l2;

        return l1 * p1.y + l2 * p2.y + l3 * p3.y;
}

Код от http://www.gamedev.net/topic/597393-getting-the-height-of-a-point-on-a-triangle/ - внимательно относитесь к компьютерной графике против математического использования Y Z

пс. Я не знаю ни одной более быстрой версии, использующей шейдеры. Одним из быстрых грязных решений является визуализация треугольника с использованием цветов, основанных на высоте вершин, и выбор цвета пикселя у X, Y - на практике это никогда не заканчивается намного быстрее на настольном компьютере, не знаю об opengl -es

...