我试着逻辑地思考以下问题:在3D空间中以表示2D用户生成的贝塞尔曲线的方式移动对象。现在,用户可以创建自己的贝塞尔曲线(如右图所示--我通过着色器渲染它,并可以访问每个控制点的x,y)。
我似乎想不出一种方法来转换这个二维曲线到三维空间运动。试图实现以下:
从大量的谷歌搜索,我确实找到了一些资源,但他们都有关于如何将二维点转换为三维空间的信息,这不是我想要的。感谢任何试图帮助,目前失去。我不需要代码,但更多的实际帮助,在处理这样的问题。伟大的一天。
bvhaajcl1#
在二维平面中,一个点由它的两个基向量的一个或多个组合来定义。(如果两个基向量不正交,则可能有更多的组合)要将点投影到三维平面上,需要将二维向量b1和b2嵌入到三维空间中,并应用平移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)计算给定时间步长的贝塞尔函数的值。
bezier(t)
1条答案
按热度按时间bvhaajcl1#
在二维平面中,一个点由它的两个基向量的一个或多个组合来定义。(如果两个基向量不正交,则可能有更多的组合)
要将点投影到三维平面上,需要将二维向量b1和b2嵌入到三维空间中,并应用平移t(如果需要)。通常,此矩阵如下所示:
然后你用上面的矩阵乘以(x,y,1)。如果你乘以(x,y,0),平移会被忽略,这通常不是你想要的。
幸运的是,如果你选择一个与轴对齐的平面,这就简单多了。如果我们选择z=0的平面,那么基向量是(1,0,0)和(0,1,0),平移是(0,0,0)。矩阵变成
乘以这个矩阵就是(x,y,0)。
换句话说,您可以简单地执行以下操作:
其中
bezier(t)
计算给定时间步长的贝塞尔函数的值。