假设我有一个球在桌子上移动,我想评估它在墙壁上的反射。
假设它将具有给定的运动矢量:
我知道结束位置是遵循这个逻辑的红点。为了简单起见,让我们假设表格为4x2,并以(0,0)为中心。我的评估位置的代码是:
ball.position += ball.movement;
if(ball.position.x > 2) ball.position.x = 2 - (ball.position.x - 2);
else if(ball.position.x < -2) ball.position.x = -2 + (-2 - ball.position.x);
if(ball.position.y > 1) ball.position.y = 1 - (ball.position.y - 1);
else if(ball.position.y < -1) ball.position.y = -1 + (-1 - ball.position.y);
我想知道是否有一种更短/更快/更聪明的方法来进行此评估,而不是4条if-else
语句。
注意,反射后必须更改movement
分量。所以
ball.movement.vx = abs(ball.position.x) > 2 ? -ball.movement.vx: ball.movement.vx;
similar for y
还请注意,更可靠的模型包括反射矩的preliminary calculation而不是事后改变
用于if-else
的语句可以通过使用Mathf.Abs
减少为两个,例如进行检查
Mathf.Abs
简单地变成
if(x < -2)
else if(x > 2)
然后在两种情况下都可以使用if(Mathf.Abs(x) > 2)
。并且在划船者中也要立即夹紧位置,请使用Vector2.Reflect
Vector2.Reflect