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

因此,为了澄清,我想用方向和幅度来记录模拟拇指操纵杆的位置,其中幅度在0和1之间。拇指操纵杆返回方形平面上的坐标,因此只需转换坐标笛卡尔到极地是不够的。我想我需要转换坐标 space ,但这会压迫我的猴子大脑的极限。

有帮助吗?

解决方案

请参阅将广场映射到圆圈。映射还有一个很好的可视化。你得到:

xCircle = xSquare * sqrt(1 - 0.5*ySquare^2)
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2)

其他提示

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

例如,此映射也可以使用

  

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

     

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

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

一张图片胜过千言万语,所以这里有一些图片来说明映射的非唯一性及其反转。


对于其他映射的C ++实现,请转到
http://squircular.blogspot.com/2015/09/fg-squircle -mapping.html 结果 有关映射结果的更多图像,请参见 http://squircular.blogspot.com

另请参阅“平移光盘的分析方法”,讨论使用样张讨论不同映射方程的论文和派生。

将每个值除以幅度,以将所有值标准化为单位矢量,例如

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

然而,这可能具有削减幅度而不是对内部值进行归一化的效果。也就是说,对于推动“完全”按下的控制器,您将得到相同的值。进入左上角,控制器几乎完全推向同一方向。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top