【问题标题】:Render circles along a 3d curves沿 3d 曲线渲染圆
【发布时间】:2015-10-28 21:46:43
【问题描述】:

我正在尝试围绕 3d 曲线的每个点渲染圆圈。基本上试图为曲线创建一个管状结构。但是如图所示,圆的方向是错误的。下面是我在计算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;

【问题讨论】:

  • 圆必须由法线和副法线向量构成。
  • 我不确定我是否在关注你。能详细点吗?
  • 目前它们似乎是由切线和法线向量构建的。
  • 目前它们是在循环中使用此构建的 float x = 0.1f*cos(dt * i); float y = 0.f; float z = 0.1f*sin(dt * i);
  • 然后交换两个坐标。

标签: c++ opengl computational-geometry curve glm-math


【解决方案1】:

最简单的方法是使用 Frenet-Serret 框架,通常称为 TBN 框架或 TBN 矩阵。方法如下:

  1. 对曲线上的两个点进行采样。我们称它们为“当前”和“下一个”。
  2. 如下构造 Frenet 框架:

    vec3 T = normalize( next - current );
    vec3 B = normalize( cross( T, next + current ) );
    vec3 N = normalize( cross( B, T ) );
    
  3. 计算你的二维圆,类似于:

    float x = cos( angle );
    float y = sin( angle );
    
  4. 现在,使用 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/

【讨论】:

  • 谢谢!您的解释和随附的链接很棒!只是我需要更好地理解这一点的数学。
  • 如果你有解析曲线,无论是样条曲线还是其他类型的数学函数,我认为解析计算方向向量要好得多。取两点之间的差异只是一个近似值。如果您有曲线的参数表示,则方向向量仅由坐标的参数函数的导数给出。
  • @RetoKoradi:你说得对,分析解决方案更准确,但我认为它不一定更好。例如,如果您正在构建一个网格,并且想要对其应用法线贴图着色器,您会希望切线沿着曲面运行。这篇文章中的算法将确保是这种情况。更准确的切线和法线不会对光照计算产生巨大的视觉差异,但您可能会看到法线贴图伪影。因此,分析方法是否更好取决于您的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多