矢量数学,在2个向量之间的平面上找到coördinates

Wil*_*Kru 3 math 3d opengl-es vector angle

我试图沿样条线生成一个3d管.我有样条曲线的坐标(x1,y1,z1 - x2,y2,z2 - 等),你可以在图中看到黄色.在那些点我需要生成圆,其顶点将在以后的体育场连接.圆圈需要垂直于花键的两个线段的"角",以形成正确的管.请注意,为了便于说明,这些段保持较低.

[显然我不允许发布图片所以请在此链接查看图片] http://img191.imageshack.us/img191/6863/18720019.jpg

我能够在样条的每个点处计算每个环的顶点,但它们都在相同的平面上,即相同的角度.我需要根据他们的"腿"(例如A和B到C)旋转它们.

我一直在想这个,想到了以下几点:

  • 两个线段可以看作2个向量(在图A和B中)
  • 角落(在图示C中)是需要计算顶点环的地方
  • 我需要找到所有顶点所在的平面
  • 然后,我可以使用此平面(=向量?)从中心点计算新向量,即C
  • 并使用radius*sin和cos找到它们的x,y,z

但是,我真的很困惑这个数学部分.我读到了关于点积的但是返回了一个标量,我不知道如何在这种情况下应用.

有人能指出我正确的方向吗?

[编辑]提供有关情况的更多信息:

我需要构建一个浮点缓冲区,其中包含3个描述顶点位置的组,并将由OpenGL ES连接,给定另一个带索引的缓冲区以形成多边形.

为了给管形状,我首先创建了一个浮点数组,其中3-组描述了3d空间中的控制点.

然后连同段密度的变量,我将这些控制点传递给一个函数,该函数使用这些控制点来创建CatmullRom样条曲线,并以另一个浮点数组的形式返回它,这些浮点数组包含3个描述顶点的组. catmull rom样条.

在每个顶点上,我想创建一个顶点环,它的密度也可以不同(每个环的平滑度/顶点数).

所有以前的顶点(控制点和描述catmull rom样条的那些顶点)都将被丢弃.

只有形成管环的顶点才会传递给OpenGL,而OpenGL又将这些顶点连接起来形成最终的管.

我能够创建catmullrom样条,并在其顶点的位置创建环,但是,它们都在相同角度的平面上,而不是遵循样条路径.

[/编辑]

谢谢!

Dr.*_*ius 10

假设您有一个参数曲线,例如:

xx[t_] := Sin[t];
yy[t_] := Cos[t];
zz[t_] := t;  
Run Code Online (Sandbox Code Playgroud)

这使: 替代文字

我们的曲线的切向量由每个方向的导数形成.在我们的例子中

Tg[t_]:= {Cos[t], -Sin[t], 1}  
Run Code Online (Sandbox Code Playgroud)

该向量的正交平面解决了隐式方程:

Tg[t].{x - xx[t], y - yy[t], z - zz[t]} == 0  
Run Code Online (Sandbox Code Playgroud)

在我们的例子中,这是:

-t + z + Cos[t] (x - Sin[t]) - (y - Cos[t]) Sin[t] == 0  
Run Code Online (Sandbox Code Playgroud)

现在我们在那个平面上找到一个圆,以曲线为中心.即:

c[{x_, y_, z_, t_}] := (x - xx[t])^2 + (y - yy[t])^2 + (z - zz[t])^2 == r^2  
Run Code Online (Sandbox Code Playgroud)

求解两个方程,得到圆的等式:

替代文字

HTH!

编辑

通过绘制很多圆圈,你可能得到一个(效率不高)管:

替代文字

或者使用优秀的图形3D库:

替代文字

编辑

既然你坚持:)这里是一个计算交汇处圆圈的程序.

a = {1, 2, 3}; b = {3, 2, 1}; c = {2, 3, 4};
l1 = Line[{a, b}];
l2 = Line[{b, c}];

k = Cross[(b - a), (c - b)] + b; (*Cross Product*)
angle = -ArcCos[(a - b).(c - b)/(Norm[(a - b)] Norm[(c - b)])]/2;
q = RotationMatrix[angle, k - b].(a - b);
circle[t_] := (k - b)/Norm[k - b] Sin@t + (q)/Norm[q] Cos@t + b;

Show[{Graphics3D[{
    Red, l1,
    Blue, l2,
    Black, Line[{b, k}],
    Green, Line[{b, q + b}]}, Axes -> True],
  ParametricPlot3D[circle[t], {t, 0, 2 Pi}]}]
Run Code Online (Sandbox Code Playgroud)

替代文字

编辑

这里有这个方法构造的网格.它不漂亮,恕我直言:

替代文字