4

我正在编写一个三次贝塞尔曲线编辑器,旨在让您在 3D 世界中创建、选择和修改贝塞尔曲线。

我目前正在研究选择/挑选界面。我希望能够根据用户从屏幕空间中曲线的实际投影表示单击多远(就像素数而言)来选择曲线。

我的第一种方法是使用从相机原点投射的与曲线三次段的边界框相交的拾取射线段在 3D 中进行强力数值分析。我使用二分法搜索来找到曲线上离射线最近的点的近似值。它有效,但在用例中缺乏鲁棒性,并且还需要根据相机与曲线上点之间的距离来缩放选择距离设置。对我来说,这也不是一个足够优雅的实现。;)

我目前的想法是在近平面上手动投影曲线段,以获得可以进行数值分析的投影贝塞尔曲线。此外,之前的拾取射线参数现在将减少到一个点:用户单击视口的位置。

不幸的是,在原型制作出来之前我担心的是:贝塞尔曲线在平面上的投影并不完全是通过投影其控制点获得的曲线。在进一步阅读该主题之后(我的数学一般都很糟糕),似乎投影曲线以某种方式退化为一条表达方式不同的理性贝塞尔曲线。新曲线的视觉表示与原始曲线不匹配,看起来相当接近,但我需要像素完美匹配。

对于我的问题,我还有其他选择可以探索,例如在场景中投影一个拾取,或者在离散为poly-line后投影曲线段。不过,我想知道,是否存在通过重新参数化或使用我无法弄清楚的数学技巧更改投影曲线来解决我当前问题的快速简便的解决方案。

提前致谢。

编辑示例投影图像:http: //i.imgur.com/1XawRof.png

4

1 回答 1

2

使用适当的视图矩阵将贝塞尔曲线的控制点投影到近平面上应该会产生与您在视口中看到的相同的有理贝塞尔曲线。

问题可能源于许多问题。如果这是我的代码,这就是我会尝试的:

  • 确保正确完成对平面的投影。您需要使用世界到近平面透视投影矩阵,而不仅仅是将输入贝塞尔控制点投影到视图平面。矩阵的透视投影部分使多项式控制点变得有理。

  • 您可以创建 3d 折线并通过透视矩阵将折线投影到您的近平面。您的折线点应该是合理的,并且应该与您在视觉上看到的完全匹配(尽管对于折线,合理的点根本不会改变渲染)。这是检查投影是否正常工作的好方法。

  • 确保您的理性曲线评估工作正常。做到这一点的一个好方法是在 2d 中渲染一个有理圆弧,并确保输出点完全是圆形的。我会以数字方式执行此操作,以避免与投影/查看产生任何混淆。


因此,有几种不同的方法可以评估合理的贝塞尔曲线。我最喜欢的方法是使用简单的方程进行评估,但在同质点类型上,但我见过有人单独对权重求和,或者通过将控制点乘以基矩阵来进行评估。我猜,无论什么工作。

这是 2d 有理曲线评估的一个很好的测试。让我们从以原点为中心的圆弧开始。我们将使用 2 次有理贝塞尔曲线。这些点将存储为 [xw, yw, w]。

这三点是:

P0 = [ 1, 0, 1 ], P1 = [ 0.707107, 0.707107, 0.707107 ], P2 = [ 0, 1, 1 ]

其中 0.707107 实际上是 sqrt(2)/2

如果我们在 t=0.5 时对此进行评估,我们得到 P = [ 0.603553, 0.603553, 0.853553 ]

如果我们除掉 w,那么我们得到 P = [ 0.707107, 0.707107, 1 ]

希望有帮助.. :)

于 2013-09-25T08:59:31.293 回答