指向倾斜方向 - iPhone

13
在我的cocos2d游戏中,我有一个玩家精灵,并希望它朝我倾斜iPhone的方向移动。我可以处理它,最难的部分是:
如何使我的精灵旋转以指向我倾斜的方向?这在应用商店上的“Tilt to Live”游戏中非常好地表示。我想要完全像那样的控件。
我的精灵(对于不熟悉cocos2d的人来说)确实具有旋转值,如果这有所帮助。
谢谢。
1个回答

12

如果您不喜欢上面的方法,这里有一种更简单的方法来得到一个合理的结果!

将iPad放在面前,让LR表示左/右倾斜,TA表示朝向你/远离你的倾斜。所以LR从-90到90,TA从-90到90。(TA为负数时是向您的腹部倾斜。)

在屏幕上显示这两个数字,并移动设备,确保您一开始就掌握了正确的姿势。如果没有做到这一点,您将无法执行任何操作。

solutionAngle就像一个指针一样,顺时针旋转,12点方向远离你。

按照以下决策链:

如果LR和TA都是零,则机器是平的。作出相应的反应。

如果LR是平的(0),答案要么是0要么是180,这取决于TA的正负。

如果TA是平的(0),答案要么是90要么是270,这取决于LR的正负。

否则:

adjustmentAngle = arctan( sin(TA) / sin(LR) )

// (NB, that should run from -90 to +90)

if ( LR > 0 ) finalResult = 90 - adjustmentAngle

if ( LR < 0 ), finalResult = 270 + adjustmentAngle

我认为这就做到了!希望对你有所帮助!

IMO......一定要平滑处理结果,以获得良好的感觉。

.

设置角度...

“目前唯一让我不确定的事情(关于你自己的想法)是如何将其应用于我的播放器?我只需将玩家旋转值设为adjustmentAngle吗?”.. 嗨Josh,是的,只需使用上述计算出的最终角度来设置旋转即可!幸运的是,它就是这么简单。

如果您需要在度数和弧度之间进行转换,只需复制粘贴每个人都使用的这些代码行:

#include <math.h>
static inline float degreestoradians (double degrees) {return degrees * M_PI/180;}
static inline float radianstodegrees (double degrees) {return degrees * 180/M_PI;}

.

坐标轴在哪里?...

顺便提一下,这是一张非常方便的图示,你可能想要收藏起来:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAcceleration_Class/Reference/UIAcceleration.html

.

从加速计转换为角度...

"加速计不会直接提供角度的原始数据。 那么如何从原始数据中获取角度呢?"

完全正确,我忘记提到这一点了,非常抱歉。这是一个日常问题...

distanceFactor = square root of (x^2 + y^2 + z^2)
angle X axis = acos ( x / distanceFactor )
angle y axis = acos ( y / distanceFactor )
angle z axis = acos ( z / distanceFactor) )

在继续之前,您必须通过在屏幕上编写三个角度并将其移动来进行“物理单元测试”,也就是测试您编写的那部分内容!

以下是从SO中获取的众多答案之一:UIAccelerationValue angle

顺便说一句,您可以通过仅采用原始x和y值的比率而不是两个正弦函数的比率(在“adjustmentAngle”表达式中)来获得粗略结果...但是现在不用担心这个。

最后!

重要提示:读者应注意,令人惊叹的新Core Motion系统可以根据您的需求处理很多问题。赶快去看看吧!

希望对您有所帮助!


谢谢你提供的选择!也许你可以看一下这个?它来自真正的Tile to Live开发者,但我不知道如何应用他给出的代码。如果你能解释一下我如何实际使用它,而不仅仅是了解其含义,我将非常感激!http://www.paradeofrain.com/2010/07/lessons-learned-in-tilt-controls/ - Josh Kahane
加速度计不提供角度的原始数据。如何将原始数据(通常为-1到1,除非设备被强制移动)转换为-90到90的范围,考虑到如果您将设备保持在45度角,则原始数字将不是0.5,而更像是0.7。 - Jonathan.
抱歉,我没有尝试编写您的示例,因为我知道一旦找出链接代码将是理想的。 我知道工作代码在链接页面底部,但我误解了它应用于玩家精灵的方式。 我将尝试您的第二个想法(我不使用Unity),目前我唯一不确定的事情(关于您自己的想法)是我如何将其应用于我的玩家? 我只需将玩家旋转值设置为adjustmentAngle吗? - Josh Kahane
你有成功运行这段代码吗?我遇到了完全相同的问题,如果有任何代码可以帮助我,那太棒了! - Kyle Goslan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接