【问题标题】:Vector Math. Clamp point to within x,y of spline?矢量数学。夹点在样条线的 x,y 范围内?
【发布时间】:2021-10-01 14:36:24
【问题描述】:

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

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

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

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

  1. 找到最接近 ProposedPoint 的 SplinePoint(完成)
  2. 将 ProposedPoint 转换为 ProposedPoint2D,SplinePoint 位于 0,0 (???)
  3. 将 ProposedPoint2d 限制到 X、Y 边界(完成)
  4. 将 ClampedPoint2d 转换为 3d 中的 ClampedPoint 并返回。 (???)

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

如何从 3d2d 转换回来,有没有更好的方法?我正在使用 UE4。

谢谢!

【问题讨论】:

    标签: vector unreal-engine4 vector-graphics


    【解决方案1】:

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

    半径为 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,我会考虑使用 Trig 函数:

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多