评估表中反射的更智能方法

问题描述 投票:1回答:2

假设我有一个球在桌子上移动,我想评估它在墙壁上的反射。

假设它将具有给定的运动矢量:

enter image description here

我知道结束位置是遵循这个逻辑的红点。为了简单起见,让我们假设表格为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语句。

c# unity3d math optimization geometry
2个回答
0
投票

注意,反射后必须更改movement分量。所以

ball.movement.vx = abs(ball.position.x) > 2 ? -ball.movement.vx: ball.movement.vx;
similar for y

还请注意,更可靠的模型包括反射矩的preliminary calculation而不是事后改变


0
投票

用于if-else的语句可以通过使用Mathf.Abs减少为两个,例如进行检查

Mathf.Abs

简单地变成

if(x < -2)
else if(x > 2)

然后在两种情况下都可以使用if(Mathf.Abs(x) > 2) 。并且在划船者中也要立即夹紧位置,请使用Vector2.Reflect

Vector2.Reflect
© www.soinside.com 2019 - 2024. All rights reserved.