记录一个iOS使用陀螺仪3d效果的抖动问题

使用陀螺仪的时候,遇到一个问题,就是在拖动scrollView滚动的时候,3d效果的图片会抖动

实现3d效果的代码

- (void)updateWithGravityX:(double)gravityXgravityY:(double)gravityYgravityZ:(double)gravityZ
{//因为在斜向上45度角的时候,gravity的值是-0.5,设计要求以这个位置为基准,所以要减去-0.5gravityY -= (-0.5);gravityY *= 2;//最大的便宜量是maxoffset,所以gravityY最大为1gravityY = MIN(1, MAX(-1, gravityY));gravityX *= 2;gravityX = MIN(1, MAX(-1, gravityX));double timeInterval = sqrt(pow((gravityX - lastGravigyX),2) + pow((gravityY - lastGravityY), 2)) * deviceMotionUpdateInterval;NSString *animationKey = @"positionAnimation";CGPoint newBackImageViewCenter = self.backImageView.center;newBackImageViewCenter.x = (newBackImageViewCenter.x - gravityX * maxOffset);newBackImageViewCenter.y = (newBackImageViewCenter.y + gravityY * maxOffset);CABasicAnimation *backImageViewAnimation = [CABasicAnimation animationWithKeyPath:@"position"];backImageViewAnimation.fromValue = [NSValue valueWithCGPoint:backImageViewCenter];backImageViewAnimation.toValue = [NSValue valueWithCGPoint:newBackImageViewCenter];backImageViewAnimation.duration = timeInterval;backImageViewAnimation.fillMode = kCAFillModeForwards;backImageViewAnimation.removedOnCompletion = NO;[self.backImageView.layer removeAnimationForKey:animationKey];[self.backImageView.layer addAnimation:backImageViewAnimation forKey:animationKey];CGPoint newFrontImageViewCenter = self.frontImageView.center;newFrontImageViewCenter.x += gravityX * maxOffset;newFrontImageViewCenter.y -= gravityY * maxOffset;CABasicAnimation *frontImageViewAnimation = [CABasicAnimation animationWithKeyPath:@"position"];frontImageViewAnimation.fromValue = [NSValue valueWithCGPoint:frontImageViewCenter];frontImageViewAnimation.toValue = [NSValue valueWithCGPoint:newFrontImageViewCenter];frontImageViewAnimation.duration = timeInterval;frontImageViewAnimation.fillMode = kCAFillModeForwards;frontImageViewAnimation.removedOnCompletion = NO;[self.frontImageView.layer removeAnimationForKey:animationKey];[self.frontImageView.layer addAnimation:frontImageViewAnimation forKey:animationKey];CGPoint newSecondFrontImageViewCenter = self.smallMovementView.center;if (self.smallMovementView == self.secondFrontImageView) {newSecondFrontImageViewCenter.x += gravityX * maxOffset/3;newSecondFrontImageViewCenter.y -= gravityY * maxOffset/3;} else if (self.smallMovementView == self.middleImageView) {newSecondFrontImageViewCenter.x -= gravityX * maxOffset/3;newSecondFrontImageViewCenter.y += gravityY * maxOffset/3;}CABasicAnimation *secondfrontImageViewAnimation = [CABasicAnimation animationWithKeyPath:@"position"];secondfrontImageViewAnimation.fromValue = [NSValue valueWithCGPoint:secondFrontImageViewCenter];secondfrontImageViewAnimation.toValue = [NSValue valueWithCGPoint:newSecondFrontImageViewCenter];secondfrontImageViewAnimation.duration = timeInterval;secondfrontImageViewAnimation.fillMode = kCAFillModeForwards;secondfrontImageViewAnimation.removedOnCompletion = NO;[self.smallMovementView.layer removeAnimationForKey:animationKey];[self.smallMovementView.layer addAnimation:secondfrontImageViewAnimation forKey:animationKey];backImageViewCenter = newBackImageViewCenter;frontImageViewCenter = newFrontImageViewCenter;secondFrontImageViewCenter = newSecondFrontImageViewCenter;
}

由 以上代码可以知道,我们的图片抖动就是图片的位置突变造成的,
而我们scrollview滚动的时候有突变,不滚动的时候没有突变。
我们打印位置的变化,发现打印太频繁,就修改了时间1/40 为 1 ,
发现我们我们如果不拖动,执行的位置改变没有突变的。但是时候
打印仍然比较频繁,我就讲时间改为10 ,这时候发现了一个问题,
就是不管我们拖动不拖动,每次改变的大小都很大超过了16,
发现如下想象
请添加图片描述

由此可以推断,是我们设置的陀螺仪更新频率不够大,导致
我们移动了很大距离之后,才更新位置,导致发生了突变现象,
而更新位置就是在陀螺仪的回调方法中实现的,就是说,我们
移动了很大的位置,陀螺仪才进行了回调,这才导致抖动。
如果陀螺仪的回调很频繁,那么我们移动了很小的距离,陀螺仪就会
回调,这个时候就不会有抖动的效果。
由此可以想到修改陀螺仪的时间
由于最新的苹果手机更新频率是120hz,
所以这里设置成了1/120

    deviceMotionUpdateInterval = 1 / 120.0;
- (CMMotionManager *)motionManager
{if (!_motionManager) {_motionManager = [[CMMotionManager alloc] init];_motionManager.deviceMotionUpdateInterval = deviceMotionUpdateInterval;}return _motionManager;
}

由此我们还可以得出一个结论,如果我们发现了抖动显现,
就可以推推测有可能 是位置发生了突变

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/132669.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【win10】怎么删除休眠文件

电脑c盘天天爆红,每天可用空间都变少,或者电脑晚上不关机,只锁屏后息屏,第二天发现电脑关机了,可能就是休眠功能惹得鬼。 以下是关闭休眠功能步骤:   1、这个隐藏的系统文件hiberfil.sys,体积…

浅谈C++|STL之算法函数篇

一.遍历常用算法 1.1for_each 在 C 中&#xff0c;for_each 是一个算法函数&#xff0c;位于 <algorithm> 头文件中。它接受一个范围&#xff08;容器或迭代器对&#xff09;以及一个函数对象&#xff08;函数指针、函数、lambda 表达式等&#xff09;&#xff0c;用于…

LiveNVR监控流媒体Onvif/RTSP功能-支持海康摄像头海康NVR通过EHOME协议ISUP协议接入分发视频流或是转GB28181

LiveNVR支持海康NVR摄像头通EHOME接入ISUP接入LiveNVR分发视频流或是转GB28181 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关…

ARMv8架构简介

ARMv8-A架构和处理器 ARMv8-A架构 ARMv8‑A 架构是针对应用程序配置文件的最新一代 ARM 架构。 ARMv8 这个名称用于描述整体架构,现在包括 32 位执行状态和 64 位执行状态。它引入了使用 64 位宽寄存器执行的能力,同时保持与现有 ARMv7 软件的向后兼容性。 ARMv8‑A 架构引…

如何获取美团的热门商品和服务

导语 美团是中国最大的生活服务平台之一&#xff0c;提供了各种各样的商品和服务&#xff0c;如美食、酒店、旅游、电影、娱乐等。如果你想了解美团的热门商品和服务&#xff0c;你可以使用爬虫技术来获取它们。本文将介绍如何使用Python和BeautifulSoup库来编写一个简单的爬虫…

SpringBoot运行原理

目录 SpringBootApplication ComponentScan SpringBootConfiguration EnableAutoConfiguration 结论 SpringbootApplication&#xff08;主入口&#xff09; SpringBootApplication public class SpringbootConfigApplication {public static void main(String[] args) {…

机器学习 day33(误差分析、添加数据)

误差分析 我们可以手动查看分类错误的子集样本&#xff08;通常为100个&#xff09;&#xff0c;并统计他们的错误类型在所有错误类型中&#xff0c;选择一种或几种最常见的错误&#xff0c;进行改进。这可以最高效的改进你的模型误差分析的一个限制是&#xff1a;它只能很好…

CRC(循环冗余校验码的校验方法)

5个关键点&#xff1a; 1.信息码&#xff1a;即给出要校验的二进制码 2.生成多项式&#xff1a;一般多项式会给&#xff0c;从最高位的指数位数就可以得到有几个校验码&#xff1b;如果没给多项式&#xff0c;肯定会给个多项式二进制码&#xff0c;根据它来推就行&#xff08;…

【深度学习】 Python 和 NumPy 系列教程(十六):Matplotlib详解:2、3d绘图类型(2)3D散点图(3D Scatter Plot)

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 0. 设置中文字体 1. 线框图&#xff08;Wireframe Plot&#xff09; 2. 3D散点图&#xff08;3D Scatter Plot&#xff09; 一、前言 Python是一种高级编程语言&#xff0c;由Guido van Ross…

【Java基础】- RMI原理和使用详解

【Java基础】- RMI原理和使用详解 文章目录 【Java基础】- RMI原理和使用详解一、什么RMI二、RMI原理2.1 工作原理图2.2 工作原理 三、RMI远程调用步骤3.1 RMI远程调用运行流程图3.2 RMI 远程调用步骤 四、JAVA RMI简单实现4.1 如何实现一个RMI程序4.2 JAVA实现RMI程序 一、什么…

微信小程序项目开发Day1

没接触过&#xff0c;直接看视频学习&#xff1a; 千锋教育微信小程序开发制作前端教程&#xff0c;零基础轻松入门玩转微信小程序_哔哩哔哩_bilibili千锋教育微信小程序开发制作前端教程&#xff0c;零基础轻松入门玩转微信小程序共计56条视频&#xff0c;包括&#xff1a;学…

数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病...

全文链接&#xff1a;http://tecdat.cn/?p23061 这个数据集&#xff08;查看文末了解数据免费获取方式&#xff09;可以追溯到1988年&#xff0c;由四个数据库组成。克利夫兰、匈牙利、瑞士和长滩。"目标 "字段是指病人是否有心脏病。它的数值为整数&#xff0c;0无…

MyVector 的实现

myVector #include <iostream> #include <vector>int size20;using namespace std;template <typename type> class myvector {int size;type value;type *arr;public://无参构造myvector(){};//有参构造myvector(int s,type v):size(s),value(v){arrnew in…

jq弹窗拖动改变宽高

预览效果 <div classtishiMask><div class"tishiEm"><div id"coor"></div><div class"topNew ismove"><span class"ismove">提示</span><p onclick"closeTishi()"></p&…

使用 LoRA 和 QLoRA 对大型语言模型进行参数高效的微调

概述 随着我们深入研究参数高效微调 (PEFT) 的世界,了解这种变革性方法背后的驱动力和方法变得至关重要。在本文中,我们将探讨 PEFT 方法如何优化大型语言模型 (LLM) 对特定任务的适应。我们将揭开 PEFT 的优点和缺点,深入研究 PEFT 技术的复杂类别,并破译两种卓越技术的内…

OpenAI开发系列(二):大语言模型发展史及Transformer架构详解

全文共1.8w余字&#xff0c;预计阅读时间约60分钟 | 满满干货&#xff0c;建议收藏&#xff01; 一、介绍 在2020年秋季&#xff0c;GPT-3因其在社交媒体上病毒式的传播而引发了广泛关注。这款拥有超过1.75亿参数和每秒运行成本达到100万美元的大型语言模型&#xff08;Large …

springboot集成excel导入导出

1、引入依赖 <dependency><groupId>com.pig4cloud.excel</groupId><artifactId>excel-spring-boot-starter</artifactId><version>1.2.7</version> </dependency> 2、导出 ResponseExcel(name "测试列表") Post…

FFmpeg深入学习

文章目录 前言一、FFmpeg 基础指令二、FFmpeg 应用之视频播放器1、音视频播放流程2、音视频同步 三、FFplay 播放器1、FFmpeg 播放器的整体框架2、ffplay 的初体验及快捷键3、ffplay 模块划分4、ffplay 原理及流程 四、FFmpeg 编解码及转码1、FFmpeg 转码全流程简介2、FFmpeg 转…

JetBrains设置inline hint的背景色、前景色

如题。修改IDE的hint前景色和背景色。 修改后结果&#xff1a;

redis深度历险 1 - Redis基础数据结构-001

Redis有5种基础数据结构&#xff0c;分别为: string (字符串)、list(列表)、set (集合)、hash (哈希&#xff09;和zset (有序集合)。熟练掌握这5种基本数据结构的使用是Redis 知识最基础也最重要的部分&#xff0c;它也是在 Redis面试题中问到最多的内容。 1 字符串 string …