首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >沿三维曲线绘制圆圈

沿三维曲线绘制圆圈
EN

Stack Overflow用户
提问于 2015-10-28 21:46:43
回答 1查看 947关注 0票数 3

我试图渲染一个三维曲线的每个点周围的圆圈。基本上试着为曲线创建一个类似管状的结构。但是,圆的方向是错误的,如图像所示。下面是我对圆周对象的模型矩阵的计算,在计算了frenet框架之后。我哪里出问题了?作为参考,绿线是切线,蓝色是标准线,红色是二法线。

Frenet Frame Calculations

代码语言:javascript
复制
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

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

发布于 2015-10-29 16:35:40

最容易做到这一点的方法是使用法语-Serret框架,更常见的称为TBN框架或TBN矩阵。下面是操作步骤:

  1. 在曲线上取样两个点。让我们称它们为“当前”和“下一个”。
  2. 按照以下方式构建法语框架: vec3 T=正规化(下一个电流),vec3 B=正规化(交叉( T,下一个+电流)),vec3 N=正规化(交叉( B,T) );
  3. 计算您的2D圆,类似于以下内容: 浮子x= cos(角);浮子y= sin(角);
  4. 现在,使用Frenet框架来计算正确的方向: vec3切线= T;vec3正规=正规化(B*x+N*y );vec3顶点=当前+B*x+N* y;//注:未归一化!

一个容易理解的解释可以在这里找到:http://www.blackpawn.com/texts/pqtorus/

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33402176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档