Bezier曲线OpenGL根据二维空间移动三维空间

yqkkidmi  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(186)

我试着逻辑地思考以下问题:
在3D空间中以表示2D用户生成的贝塞尔曲线的方式移动对象。
现在,用户可以创建自己的贝塞尔曲线(如右图所示--我通过着色器渲染它,并可以访问每个控制点的x,y)。

我似乎想不出一种方法来转换这个二维曲线到三维空间运动。试图实现以下:

从大量的谷歌搜索,我确实找到了一些资源,但他们都有关于如何将二维点转换为三维空间的信息,这不是我想要的。
感谢任何试图帮助,目前失去。我不需要代码,但更多的实际帮助,在处理这样的问题。
伟大的一天。

bvhaajcl

bvhaajcl1#

在二维平面中,一个点由它的两个基向量的一个或多个组合来定义。(如果两个基向量不正交,则可能有更多的组合)
要将点投影到三维平面上,需要将二维向量b1b2嵌入到三维空间中,并应用平移t(如果需要)。通常,此矩阵如下所示:

[ b1x b2x tx ]
[ b1y b2y ty ]
[ b1z b2z tz ]

然后你用上面的矩阵乘以(x,y,1)。如果你乘以(x,y,0),平移会被忽略,这通常不是你想要的。
幸运的是,如果你选择一个与轴对齐的平面,这就简单多了。如果我们选择z=0的平面,那么基向量是(1,0,0)和(0,1,0),平移是(0,0,0)。矩阵变成

[ 1 0 0 ]
[ 0 1 0 ]
[ 0 0 0 ]

乘以这个矩阵就是(x,y,0)。
换句话说,您可以简单地执行以下操作:

vec2 bezier_2d = bezier(t);
vec3 bezier_3d = vec3(bezier_2d.x, bezier_2d.y, 0);
vec3 box_pos = original_pos + bezier_3d * scale;

其中bezier(t)计算给定时间步长的贝塞尔函数的值。

相关问题