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)旋转它们.
我一直在想这个,想到了以下几点:
但是,我真的很困惑这个数学部分.我读到了关于点积的但是返回了一个标量,我不知道如何在这种情况下应用.
有人能指出我正确的方向吗?
[编辑]提供有关情况的更多信息:
我需要构建一个浮点缓冲区,其中包含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)
编辑
这里有这个方法构造的网格.它不漂亮,恕我直言: