矢量数学。夹点到样条曲线的 x,y 内?

Vector Math. Clamp point to within x,y of spline?

你能帮我解决这个矢量数学问题吗?

我有一个游戏角色 Camera_Rail,它有一条样条线。样条曲线上的每个点都有一个上向量和右向量,创建一个垂直平面。样条和 X,Y 边界共同描述了 space 中的方形面条。

我想要一个函数:ClampPointWithinBounds(Spline, X, Y, ProposedPoint) returns ClampedPoint

这是我的计划,但还有一些??? :

  1. 找到最接近 ProposedPoint 的 SplinePoint(完成)
  2. 将样条点设为 0,0 (???) 的 ProposedPoint 转换为 ProposedPoint2D
  3. 将 ProposedPoint2d 钳制到 X、Y 边界(完成)
  4. 将 ClampedPoint2d 转换为 3d 中的 ClampedPoint 并 return。 (???)

或者,我可以直接在 3d 中计算 ClampingVector space,但我没有这方面的计划。

如何从 3d<->2d 来回转换,有没有更好的方法?我用的是UE4.

谢谢!

“找到最接近 ProposedPoint 的 SplinePoint(完成)。” 我们将这些Vector3的分别称为SP和PP。

A circular/spherical 半径 R 的边界最简单: P = (SP - PP).Normalize() * R; 或展开:

L = Sqrt((SP.X - PP.X) * (SP.X - PP.X) + (SP.Y - PP.Y) * (SP.Y - PP.Y) + (SP.Z - PP.Z) * (SP.Z - PP.Z));
P = ((SP.X - PP.X)/L,(SP.Y - PP.Y)/L,(SP.Z - PP.Z)/L) * R;

对于范围为 (X1,Y1,Z1) 框大小 1/2 的限制边界,使用 R = X1 * X1 + Y1 * Y1 + Z1 * Z1,可能的最远距离。

最终钳位结果=(Min(Abs(P.X),X1) * Sign(P.X), Min(Abs(P.Y),Y1) * Sign(P.Y), A.Z = Min(Abs(P.Z),Z1) * Sign(P.Z))

对于 2D,我会考虑使用三角函数:

P = (SP - PP);// ignoring Z
Ang = ATan2(P.Y, P.X);
X = X1 * Cos(Ang);
Y = Y1 * Sin(Ang);

三角函数的开销不值得扩展到 3D。因为单个 Sqrt() 调用通常比 3D 中所需的多个触发调用更快。