iOS通过内置重力和陀螺仪实现物理仿真碰撞试验

最近公司用cocos2d开发了一款类似于打砖块的游戏,后来想着用iOS是否能实现相同的原理,毕竟苹果爸爸还是很强大的。

仿真碰撞效果图.gif

1.0 陀螺仪在iOS中的使用

iPhone、iPad、iWatch都有内置的陀螺仪,也都可以让开发者进行调用。同样,用一张图展现一下:

在手机上,仅用加速度计没办法测量或重构出完整的3D动作,测不到转动的动作的,加速计只能检测轴向的线性动作。但陀螺仪则可以对转动、偏转的动作做很好的测量,这样就可以精确分析判断出使用者的实际动作。而后根据动作,可以对手机做相应的操作。

2.仿真物理碰撞试验

仿真物理碰撞试验需要我们实现iOS自带的三种行为,(UIDynamicItemBehavior)物理仿真行为、(UIGravityBehavior)重力行为、(UICollisionBehavior)碰撞行为,下面我们来记录一下各种行为的知识点。

 2.1 iOS UIKit动力学    动力学配置(UIDynamicItemBehavior)

 UIDynamicItemBehavior它的作用像是一个扩展,可以为一个动态元素设置更多较为具体的动力学属性。

属性

2.1.2 弹性系数

用于碰撞行为的动态元素的弹性量。默认值为0,数值越大,碰撞行为越激烈。

@property(readwrite,nonatomic)CGFloatelasticity;

2.1.2 摩擦系数

用于两个发生摩擦的动态元素。默认值为0,当值为1.0时为强烈摩擦。

@property(readwrite,nonatomic)CGFloatfriction;

2.1.3 相对质量密度

用于动态元素相对密度。其连同动态元素大小,决定动态元素的有效质量。其参与的动力学行为包括摩擦、碰撞、推动等...

@property(readwrite,nonatomic)CGFloatdensity;

 2.2  iOS 重力行为(UIGravityBehavior)

2.2.1 重力矢量方向与坐标轴x的夹角,例如垂直向下:π/2;

@property (readwrite, nonatomic) CGFloat angle;

2.2.2重力加速度的倍数

@property (readwrite, nonatomic) CGFloat magnitude;

 2.3  iOS 碰撞行为(UICollisionBehavior)

 2.3.1 边界碰撞

表示是否以当前坐标系边界作为检测碰撞的边界。此时_dynamicItem1View运动到self.view的边界时就会发生碰撞。

@property(nonatomic,readwrite)BOOLtranslatesReferenceBoundsIntoBoundary;

2.3.2碰撞类型

UICollisionBehaviorModeItems// 边界碰撞

UICollisionBehaviorModeBoundaries// 边界碰撞

// 碰撞所有UICollisionBehaviorModeEverything// 碰撞所有

@property(nonatomic,readwrite)UICollisionBehaviorModecollisionMode;

综合以上三种物理行为,我们就能实现仿真物理碰撞试验,一下为部分重要代码:


//创建现实动画 设定动画模拟区间

    _dynamicAnimator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];


//创建物理仿真行为

    _dynamicItemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[]];

    _dynamicItemBehavior.elasticity = 0.5;

    _dynamicItemBehavior.friction = 0;

    _dynamicItemBehavior.density = 1;

//重力行为

    _gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[]];

//初始化全局管理对象

    CMMotionManager *manager = [[CMMotionManager alloc] init];

    self.motionManager= manager;

    //判断传感器是否可用

    if ([self.motionManager isDeviceMotionAvailable]) {

        ///设备 运动 更新 间隔

        manager.deviceMotionUpdateInterval = 0.01;

        ///启动设备运动更新队列

 [self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]

                                                withHandler:^(CMDeviceMotion*_Nullablemotion,NSError*_Nullableerror) {

                                                    doublegravityX = motion.gravity.x;

                                                    doublegravityY = motion.gravity.y;

                                                    //计算手机倾斜角度

                                                    doublexy =atan2(gravityX, gravityY);

                                                    // 计算相对于y轴的重力方向

                                                    _gravityBehavior.angle= xy-M_PI_2;

                                                }];

    }


 //碰撞行为

    _collisionBehavior = [[UICollisionBehavior alloc]initWithItems:@[]];

    _collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;

  //将行为添加到物理仿动画中

    [_dynamicAnimator addBehavior:_dynamicItemBehavior];

    [_dynamicAnimator addBehavior:_gravityBehavior];

    [_dynamicAnimator addBehavior:_collisionBehavior];

2.4 通过绘制贝塞尔曲线来设置碰撞边界 //通过添加贝塞尔曲线,自定义添加碰撞边界

    UIBezierPath* path = [UIBezierPath bezierPathWithRect:CGRectMake(20, 20, 100, 80)];

    path.lineWidth=5.0;

    path.lineCapStyle = kCGLineCapRound; //线条拐角

    path.lineJoinStyle = kCGLineJoinRound; //终点处理

    _collisionBehavior.collisionMode = UICollisionBehaviorModeEverything;

    [_collisionBehavior addBoundaryWithIdentifier:@"path1" forPath:path];


设置碰撞的贝塞尔曲线边界.gif
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容