矢量数学。夹点到样条曲线的 x,y 内?
Vector Math. Clamp point to within x,y of spline?
你能帮我解决这个矢量数学问题吗?
我有一个游戏角色 Camera_Rail,它有一条样条线。样条曲线上的每个点都有一个上向量和右向量,创建一个垂直平面。样条和 X,Y 边界共同描述了 space 中的方形面条。
我想要一个函数:ClampPointWithinBounds(Spline, X, Y, ProposedPoint) returns ClampedPoint
这是我的计划,但还有一些??? :
- 找到最接近 ProposedPoint 的 SplinePoint(完成)
- 将样条点设为 0,0 (???) 的 ProposedPoint 转换为 ProposedPoint2D
- 将 ProposedPoint2d 钳制到 X、Y 边界(完成)
- 将 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 中所需的多个触发调用更快。
你能帮我解决这个矢量数学问题吗?
我有一个游戏角色 Camera_Rail,它有一条样条线。样条曲线上的每个点都有一个上向量和右向量,创建一个垂直平面。样条和 X,Y 边界共同描述了 space 中的方形面条。
我想要一个函数:ClampPointWithinBounds(Spline, X, Y, ProposedPoint) returns ClampedPoint
这是我的计划,但还有一些??? :
- 找到最接近 ProposedPoint 的 SplinePoint(完成)
- 将样条点设为 0,0 (???) 的 ProposedPoint 转换为 ProposedPoint2D
- 将 ProposedPoint2d 钳制到 X、Y 边界(完成)
- 将 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 中所需的多个触发调用更快。