Я пытаюсь сделать круги вокруг каждой точки 3d кривых. В основном, пытаясь создать трубчатую структуру для кривой. Но ориентация круга неверна, как показано на рисунке. Ниже приведены мои расчеты для матрицы Model объекта круга после вычисления кадра frenet. Куда я иду не так?
Для справки: зеленая линия — касательная, синий — нормальная, а красный — бинормальный.
Frenet Frame Calculations
:
glm::vec3 pointback = curve_points[i-1];
glm::vec3 pointmid = curve_points[i];
glm::vec3 pointforward = curve_points[i+1];
glm::vec3 forward_tangent_vector = glm::vec3(glm::normalize(pointforward - pointmid)) ;
glm::vec3 backward_tangent_vector = glm::vec3(glm::normalize(pointmid - pointback)) ;
glm::vec3 second_order_tangent = glm::normalize(forward_tangent_vector - backward_tangent_vector);
glm::vec3 binormal = glm::normalize(glm::cross(forward_tangent_vector, second_order_tangent));
glm::vec3 normal = glm::normalize(glm::cross(binormal, forward_tangent_vector));
Model Matrix for Circle calculations
glm::mat3 tbn = glm::mat3(forward_tangent_vector,binormal,normal);
glm::vec3 normal_axis = glm::vec3(0, 1, 0);
//normal_axis = forward_tangent_vector;
glm::vec3 circleNormal = glm::normalize(tbn * normal_axis);
glm::vec3 rotationAxis = glm::cross(normal_axis, circleNormal);
float rotationAngle = glm::acos(glm::dot(normal_axis, circleNormal));
R = glm::rotate(R, glm::degrees(rotationAngle), rotationAxis);
T = glm::translate(T, pointmid);
glm::mat4 Model = T*R;
Самый простой способ сделать это — использовать кадры Френе-Серре, более известные как кадры TBN или матрица TBN. Вот как:
Построить каркас Frenet следующим образом:
vec3 T = normalize( next - current );
vec3 B = normalize( cross( T, next + current ) );
vec3 N = normalize( cross( B, T ) );
Рассчитайте ваш 2D круг, подобный этому:
float x = cos( angle );
float y = sin( angle );
Теперь используйте рамку Frenet для вычисления правильной ориентации:
vec3 tangent = T;
vec3 normal = normalize( B * x + N * y );
vec3 vertex = current + B * x + N * y; // note: not normalized!
Простое объяснение можно найти здесь:
http://www.blackpawn.com/texts/pqtorus/
Других решений пока нет …