• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - map 设备倾斜到物理世界重力?

[复制链接]
菜鸟教程小白 发表于 2022-12-13 00:13:55 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在构建一个“大理石”迷宫游戏来学习 spritekit 基础知识。

我想将游戏的重力映射到设备的倾斜度。我一直在试图弄清楚如何做到这一点,但我只能成功地映射 y 轴:

class func obtainGravity(motionManager: CMMotionManager) {
    var vec = CGVectorMake(0, 0)
    if let attitude = motionManager.deviceMotion?.attitude? {
        let y = CGFloat(-attitude.pitch * 2 / M_PI) // This works, it returns 1/-1 when the device is vertical (1 when the home button is upside down)
        let x = CGFloat(attitude.roll * 2 / M_PI) // This doesn't work
        physicsWorld.gravity = CGVectorMake(x, y)
    }
}   

我可以映射 Y 轴,使球“向上”或“向下”(相对于纵向模式),但我不明白如何映射 X 轴(从设备侧面拉动)。

例如,当将设备平放在 table 上时 (x, y) 应该是 (0,0),当把它放在桌面屏幕向下时它也应该是 (0,0) 但是姿态.roll 返回-179。此外,如果我保持设备垂直(在纵向模式下)并打开我的脚保持设备静止,重力应该保持(x:0,y:1)但是 x 会继续变化,因为它基于姿态.roll

如何做到这一点?



Best Answer-推荐答案


最直接的方法是获取加速度计更新,而不是设备运动更新,并直接从那里读取重力矢量——这正是加速度计捕获的内容:设备坐标系中的重力测量。

遗憾的是,我是一个 Swift 厚实的人,因此无法提供示例代码,但您希望提供一个类型为 CMAccelerometerHandler 的 block ,它将接收一个 CMAccelerationData您可以获得 CMAcceleration 结构体,即直接获得要应用的重力矢量。

if let data = motionManager.accelerometerData? {
    vec = CGVectorMake(CGFloat(data.acceleration.x), CGFloat(data.acceleration.y))
}

关于ios - map 设备倾斜到物理世界重力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25069161/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap