2016-11-24 1 views
0

Моя проблема заключается в следующем: Я определил треугольник с 3 точками.Получить положение любой точки в треугольнике

Система координат определяется следующим образом:

  • X-оси головы до правой
  • головок
  • Y-оси вверх
  • Z-оси головы из моего экрана

Это самая распространенная система координат, используемая в OpenGL (я думаю). Теперь я получил свой треугольник. Значения X и Z каждой точки различны. Мне нужно найти координату Y на моем треугольнике, задав координату X и Z. Кто написал этот метод и называется он barryCentric (точка а, точка Ь, точка с, точкой поз) (я уверен, что он имел в виду «барицентрического», но хорошо.

public static float barryCentric(Vector3f p1, Vector3f p2, Vector3f p3, Vector3f pos) { 
     float det = (p2.z - p3.z) * (p1.x - p3.x) + (p3.x - p2.x) * (p1.z - p3.z); 
     float l1 = ((p2.z - p3.z) * (pos.x - p3.x) + (p3.x - p2.x) * (pos.y - p3.z))/det; 
     float l2 = ((p3.z - p1.z) * (pos.x - p3.x) + (p1.x - p3.x) * (pos.y - p3.z))/det; 
     float l3 = 1.0f - l1 - l2; 
     return l1 * p1.y + l2 * p2.y + l3 * p3.y; 
    } 

Я не уверен, если этот метод имеет смысл. Кроме того, он использует значение pos.y, так что я думаю, это не то, что я хочу. кто-нибудь знает алгоритм, который может помочь мне с моей проблемой?

Привет, Финн

ответ

1

Этот метод имеет смысл , это реализация barycentric interpolation - процедура находит барицентрические координаты точки (x, z) в треугольнике - l1, l2, l3 здесь, u, w, v на связанной странице.

Но реализация содержит ошибки - вы правы, что не следует использовать неизвестные pos.y. Более того, это абсурд - вычитание z из y. Поэтому поменяйте pos.y на pos.z:

float l1 = ((p2.z - p3.z) * (pos.x - p3.x) + (p3.x - p2.x) * (pos.z - p3.z))/det; 
    float l2 = ((p3.z - p1.z) * (pos.x - p3.x) + (p1.x - p3.x) * (pos.z - p3.z))/det; 
+0

ty great :), который мне очень помогает! –

Смежные вопросы