【问题标题】:Curve Trajectory object orientation曲线轨迹对象方向
【发布时间】:2010-12-03 22:47:50
【问题描述】:

我在 3D 环境中有一艘宇宙飞船。我使用控制点绘制了一条 B 样条曲线(转换为贝塞尔曲线以便能够绘制它)。每次调用 draw 事件时,船都在点 (0,0,0) 并被平移到曲线上的下一个坐标。现在,在进行此平移之前,我需要进行旋转,以使船的方向在该点沿曲线的切线。

通过这样做,我可以通过在曲线上找到靠近当前点的点来近似切线。我在 C++ 中使用 OpenGL

float mDifference[1][3] = {nearPoint[0][0] - currentPosition[0][0],
                           nearPoint[0][1] - currentPosition[0][1],
                           nearPoint[0][2] - currentPosition[0][2]};

float norm = sqrt(mDifference[0][0] * mDifference[0][0] 
             + mDifference[0][1] * mDifference[0][1]
             + mDifference[0][2] * mDifference[0][2]);

float tangent[1][3] = { mDifference[0][0] / norm,
                        mDifference[0][1] / norm,
                        mDifference[0][2] / norm};

//tangent = rotationVector?
spacecraftTransformGroup->setRotationVector(tangent[0][0],tangent[0][1],tangent[0][2]);

我认为旋转矢量是切线,但找不到旋转船所需的角度。如何旋转船以使其与切线对齐?

【问题讨论】:

  • 如果可以解析得出,为什么要近似切线?请记住 dy/dx = (dy/dt) / (dx/dt)。
  • 仅仅是因为我不知道 C++ 中导数的数学函数是什么。我可能会对此进行调查以使其更准确。

标签: c++ math opengl animation curve


【解决方案1】:

一个正交(即方向)矩阵由以下组成:

方向, 相切, BiTangent(上向量)。

所以,如果你有你的方向和切线,你可以交叉乘积得到你的双切线,并从 3 个方向向量(D、T、B)和位置向量(P)形成矩阵,如下所示

 Tx, Bx, Dx, Px
 Ty, By, Dy, Py
 Tz, Bz, Dz, Pz
  0,  0,  0,  1

您的对象现在沿方向向量定向...

【讨论】:

  • 对不起,我该怎么处理那个矩阵? opengl 旋转方法要求旋转矢量(1x3 数组)和角度。
  • @Mathieu - 已经很久了,但我记得 OpenGL 允许您加载预先计算的矩阵作为模型视图矩阵,而不是使用一系列旋转。
  • @ysap: GLfloat M[16]={Tx, Ty, Tz, 0, Bx, By, Bz, 0, Dx, Dy, Dz, 0, Px, Py, Pz, 1} ; glLoadMatrix(M);
【解决方案2】:

首先,请参阅this site,了解有关沿 B 样条曲线查找给定点的实际切线的信息。

其次,您可以使用atan(y/x) 来获取切线向量的角度(以弧度为单位)。假设“零”角度使您的船沿 x 轴指向,则使用该角度旋转您的船。

【讨论】:

  • 这不是只适用于二维吗?也许我可以试试这个,然后用 y 和 z 坐标之间的角度进行另一个旋转。
猜你喜欢
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2015-02-22
  • 2018-03-05
相关资源
最近更新 更多