12

我正在开发一款独立视频游戏,并且一直在假设因为我的控制器上的拇指杆具有圆形运动范围,它返回“圆形”坐标;也就是说,笛卡尔坐标被限制在一个圆形区域(半径为 1)。实际上,坐标是“正方形”;例如,右上角的摇杆位置注册为 x=1,y=1。当我将坐标从笛卡尔坐标转换为极坐标时,幅度可能会超过 1 - 这意味着玩家可以沿对角线移动比垂直或水平移动更快。

因此,为了澄清,我想根据方向和幅度记录模拟摇杆的位置,其中幅度在 0 和 1 之间。摇杆返回方形平面上的坐标,因此只需将坐标从笛卡尔坐标转换为极坐标还不够。我想我需要转换坐标空间,但那是我猴脑的极限。

4

3 回答 3

19

请参阅将正方形映射到圆。映射也有一个很好的可视化。你得到:

xCircle = xSquare * sqrt(1 - 0.5*ySquare^2)
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2)
于 2009-10-25T19:40:17.520 回答
14

映射不是唯一的。这个问题还有很多其他的解决方案。

例如,此映射也将起作用

u = x √(x² + y² - x²y²) / √(x² + y²)

v = y √(x² + y² - x²y²) / √(x² + y²)

其中(u,v)是圆盘坐标,(x,y)是方坐标。

一张图片胜过一千个单词,所以这里有一些图片来说明映射及其逆的非唯一性。

圆形布雷迪束


平方波士顿凯尔特人队

For a C++ implementation对于其他映射,请访问
http://squircular.blogspot.com/2015/09/fg-squircle-mapping.html
有关映射结果的更多图像, 请参见http://squircular.blogspot.com

另请参阅“对圆盘求平方的分析方法”,以了解讨论不同映射方程的证明和推导的论文。

于 2016-02-13T22:03:24.663 回答
0

将每个值除以幅度以将所有值归一化为单位向量,例如

magn = sqrt(x * x + y * y);
newx = magn > 1.0 ? x / magn : x;
newy = magn > 1.0 ? y / magn : y;

但是,这可能会产生削减幅度而不是对内部值进行归一化的效果。也就是说,对于“完全”推入左上角的控制器和几乎完全推入左上角的控制器,您将获得相同的值。同一方向。

于 2009-10-25T19:36:47.760 回答