我需要找到一个曲面的视觉地平线的 2 个点。
我有:
- 4 个角点的 XYZ
- 2 个弯曲边缘贝塞尔点的 XYZ
我需要计算:
- 2 个水平点的 XY
- 2 个水平点的 XYZ
注意:我上次问这个问题时得到了一个解决方案,但它只找到曲线的极值,而不是水平点,它会根据两条曲线相对于彼此的位置和旋转而变化。
首先旋转曲线使角点之间的连接是水平的然后计算极值是否有效?
为了直观地测试它,您可以将示例图像旋转大约 150 度:
旋转图片 http://www.freeimagehosting.net/uploads/ad502509e9.png
请注意,这条曲线的极值并不完全在您想要的位置,但这可能是由几个因素造成的,例如您标记水平点的方式似乎并不那么精确。
你没有说你的表面是如何定义的,只是说它由两条二次贝塞尔曲线界定。有很多方法可以构建这样的表面,每种构建方法都会有不同的视野。所以这个答案将是猜测。
地平线由表面上的那些点组成,其中从相机到该点的矢量与表面相切,如下所示:
二次贝塞尔曲线具有参数方程
B( t ) = (1 - <em>t) 2 P 0 + 2(1 - <em>t) t P 1 + t 2 P 2
对 t 进行微分可以得到曲线的切线:
B′( t ) = 2( t - 1) P 0 + 2(1 - 2 t ) P 1 + 2 t P 2
这与从相机(在原点)到曲线的向量平行,如果
B( t ) × B′( t ) = 0
为t解决这个问题,您将在曲线上找到地平线上的点。如何将其扩展到整个表面的地平线取决于表面的构造方式。(也许你可以在曲面的每一端找到曲线的地平线点并用直线连接它们?)
您要寻找的实际上是轮廓,而不是地平线。
最简单的方法是找到法线指向相机的表面部分(点积为负)与法线远离相机的表面部分(点积为正)之间的边界.
使用三角形网格,您可以使用法线直接执行此操作。使用 NURBS,您可能会找到一个封闭的公式来执行此操作。