从方向向量中找到所需的象限
Finding required quadrants from direction vector
我的游戏有一个 2d tilemap,我希望它最初对玩家隐藏,然后在他们移动时显示它。假设我已经暴露了玩家周围的一圈瓷砖,我只想暴露象限的边缘。
我假设它是正确的,例如当玩家向上移动时暴露 Q1 和 Q2,仅当玩家向左移动时暴露 Q2,等等。
我想我已经解决了公开代码,我遇到的问题是在初始化时想出一个优雅的解决方案。
我想已经创建了一个象限数组,当玩家在 xy 方向移动和通过时,我需要显示这些象限。
我可以创建单独的调用来为 8 个可能的方向中的每一个手动执行此操作,如下所示:
private void CreateUpDirection()
{
directionDetails[Vector2Int.up.x + 1, Vector2Int.up.y + 1] = new DirectionDetail(quadrantDetails[Constants.QUADRANT_ONE],
quadrantDetails[Constants.QUADRANT_TWO]);
}
但有没有办法通过 xy 矢量值本身确定正确的象限,这样我就可以做这样的事情?
CreateDirectionDetail(Vector2Int.up);
CreateDirectionDetail(Vector2Int.up + Vector2Int.left);
CreateDirectionDetail(Vector2Int.up + Vector2Int.right);
CreateDirectionDetail(Vector2Int.left);
CreateDirectionDetail(Vector2Int.right);
CreateDirectionDetail(Vector2Int.down);
CreateDirectionDetail(Vector2Int.down + Vector2Int.left);
CreateDirectionDetail(Vector2Int.down + Vector2Int.right);
我希望我已经说得够清楚了。谢谢
这让我很困扰,所以我尝试了一种不同的方法,我不再考虑象限,而是专注于角度。我发现 atan2 可以从方向向量给我我需要的角度,所以我不需要担心查找。
这是一个例子:
float radians = Mathf.Atan2(vector.x, vector.y);
int angle = (int)(Mathf.Rad2Deg * radians);
int fov = 180;
int centreAngle = ((360 + angle) % 360);
int startAngle = ((360 + centreAngle) - fov / 2) % 360;
int endAngle = ((360 + centreAngle) + fov / 2) % 360;
我调用 atan2(x,y) 而不是 atan2(y,x) 所以零度从 +y 而不是 +x 开始。视野是我要检查的弧度的任意值。
这是 8 个方向中每个方向的结果:
X: 0 Y: 1 angle: 0 centreAngle: 0 startAngle: 270 endAngle: 90
X: -1 Y: 1 angle: -45 centreAngle: 315 startAngle: 225 endAngle: 45
X: 1 Y: 1 angle: 45 centreAngle: 45 startAngle: 315 endAngle: 135
X: -1 Y: 0 angle: -90 centreAngle: 270 startAngle: 180 endAngle: 0
X: 1 Y: 0 angle: 90 centreAngle: 90 startAngle: 0 endAngle: 180
X: 0 Y: -1 angle: 180 centreAngle: 180 startAngle: 90 endAngle: 270
X: -1 Y: -1 angle: -135 centreAngle: 225 startAngle: 135 endAngle: 315
X: 1 Y: -1 angle: 135 centreAngle: 135 startAngle: 45 endAngle: 225
我的游戏有一个 2d tilemap,我希望它最初对玩家隐藏,然后在他们移动时显示它。假设我已经暴露了玩家周围的一圈瓷砖,我只想暴露象限的边缘。
我假设它是正确的,例如当玩家向上移动时暴露 Q1 和 Q2,仅当玩家向左移动时暴露 Q2,等等。
我想我已经解决了公开代码,我遇到的问题是在初始化时想出一个优雅的解决方案。
我想已经创建了一个象限数组,当玩家在 xy 方向移动和通过时,我需要显示这些象限。
我可以创建单独的调用来为 8 个可能的方向中的每一个手动执行此操作,如下所示:
private void CreateUpDirection()
{
directionDetails[Vector2Int.up.x + 1, Vector2Int.up.y + 1] = new DirectionDetail(quadrantDetails[Constants.QUADRANT_ONE],
quadrantDetails[Constants.QUADRANT_TWO]);
}
但有没有办法通过 xy 矢量值本身确定正确的象限,这样我就可以做这样的事情?
CreateDirectionDetail(Vector2Int.up);
CreateDirectionDetail(Vector2Int.up + Vector2Int.left);
CreateDirectionDetail(Vector2Int.up + Vector2Int.right);
CreateDirectionDetail(Vector2Int.left);
CreateDirectionDetail(Vector2Int.right);
CreateDirectionDetail(Vector2Int.down);
CreateDirectionDetail(Vector2Int.down + Vector2Int.left);
CreateDirectionDetail(Vector2Int.down + Vector2Int.right);
我希望我已经说得够清楚了。谢谢
这让我很困扰,所以我尝试了一种不同的方法,我不再考虑象限,而是专注于角度。我发现 atan2 可以从方向向量给我我需要的角度,所以我不需要担心查找。
这是一个例子:
float radians = Mathf.Atan2(vector.x, vector.y);
int angle = (int)(Mathf.Rad2Deg * radians);
int fov = 180;
int centreAngle = ((360 + angle) % 360);
int startAngle = ((360 + centreAngle) - fov / 2) % 360;
int endAngle = ((360 + centreAngle) + fov / 2) % 360;
我调用 atan2(x,y) 而不是 atan2(y,x) 所以零度从 +y 而不是 +x 开始。视野是我要检查的弧度的任意值。
这是 8 个方向中每个方向的结果:
X: 0 Y: 1 angle: 0 centreAngle: 0 startAngle: 270 endAngle: 90
X: -1 Y: 1 angle: -45 centreAngle: 315 startAngle: 225 endAngle: 45
X: 1 Y: 1 angle: 45 centreAngle: 45 startAngle: 315 endAngle: 135
X: -1 Y: 0 angle: -90 centreAngle: 270 startAngle: 180 endAngle: 0
X: 1 Y: 0 angle: 90 centreAngle: 90 startAngle: 0 endAngle: 180
X: 0 Y: -1 angle: 180 centreAngle: 180 startAngle: 90 endAngle: 270
X: -1 Y: -1 angle: -135 centreAngle: 225 startAngle: 135 endAngle: 315
X: 1 Y: -1 angle: 135 centreAngle: 135 startAngle: 45 endAngle: 225