我试图建立一个滚动的大理石类游戏。我已经决定从Cocos3D转换为SceneKit所以我可能有关于代码片段的原始问题。
这是我的CMMotionManager设置。问题是当我改变设备方向时,重力方向也会改变(不适当地调整到设备方向)。此代码仅适用于横向左方向。
-(void) setupMotionManager
{
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
motionManager = [[CMMotionManager alloc] init];
[motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error)
{
CMAcceleration acceleration = [accelerometerData acceleration];
float accelX = 9.8 * acceleration.y;
float accelY = -9.8 * acceleration.x;
float accelZ = 9.8 * acceleration.z;
scene.physicsWorld.gravity = SCNVector3Make(accelX, accelY, accelZ);
}];
}
此代码来自苹果的大理石演示。我把它从Swift翻译成了Obj-C。
如果我希望它在Landscape Right中工作,我需要将最后一行更改为
scene.physicsWorld.gravity = SCNVector3Make(-accelX, -accelY, accelZ);
这提出了另一个问题......如果在SceneKit中Y为Up,为什么不需要更改的accelZ变量?所以我的问题是CMMotionManager坐标如何与场景坐标相关?