我目前正在努力在游戏中创建基于2D矢量的运动,我需要一些帮助来弄清楚我的数学运算。在每个刻度上,我都基于操纵杆上的x和y轴创建基本方向向量。轴的值很正常,范围是-1到1。但是,问题在于计算幅度。如果我在某个方向上的法向运动的上限为1,那么当我创建此新矢量时,该幅度通常会大于1。对于游戏,这会产生问题,因为我希望在各个方向上行走都具有相同的方向速度。
我对此的解决方案之一就是将幅度限制为1。这似乎很简单,但是我觉得我正在采取一条捷径来正确解决此问题。我是在解决这个错误,是否允许沿着对角线更快地移动实际上是正确的动作?谢谢
最佳答案
如果您想要恒定的速度,则应将向量归一化
double dx = read_x();
double dy = read_y();
double L = sqrt(dx*dx + dy*dy);
dx /= L; dy =/ L;
但是,如果您想变速,则问题确实在于操纵杆允许在对角线上有更大的速度。
将长度限制为1(即仅保护
if (L > 1)
后面的规范化除法)可能是可以的,但是只有通过实验才能知道。另一种选择是通过用扩展长度缩放长度来规范方向的长度,以便当操纵杆处于极限位置时,输入将具有单位长度,但沿方向从0缩放到该值,而不是夹紧:
在代码中:
double dx = read_x();
double dy = read_y();
double L = sqrt(dx*dx + dy*dy);
if (L > 0) {
double angle = atan2(dy, dx);
double kx = fabs(cos(angle));
double ky = fabs(sin(angle));
double k = std::max(kx, ky);
kx /= k; ky /= k;
double ext = sqrt(kx*kx + ky*ky);
dx /= ext; dy /= ext;
}
您可以在操作here中看到这些公式。
确实只有通过您的游戏进行测试才能给出答案,但是从直觉上来说,我想说钳制效果更好。
关于c++ - 2D vector 运动和幅度不一致,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38865608/