- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我创建了一个 SCNSphere,所以现在它看起来像是一颗行星。这正是我想要的。我的下一个目标是允许用户使用平移手势识别器旋转球体。他们可以围绕 X 或 Y 轴旋转它。我只是想知道我该怎么做。这是我目前所拥有的。
origin = sceneView.frame.origin
node.geometry = SCNSphere(radius: 1)
node.geometry?.firstMaterial?.diffuse.contents = UIImage(named: "world.jpg")
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(CategoryViewController.panGlobe(sender:)))
sceneView.addGestureRecognizer(panGestureRecognizer)
func panGlobe(sender: UIPanGestureRecognizer) {
// What should i put inside this method to allow them to rotate the sphere/ball
}
最佳答案
我们有一个 ViewController,它包含一个包含我们的球体的节点 sphereNode
。要旋转球体,我们可以使用 UIPanGestureRecognizer
.由于识别器会报告我们的手指在屏幕上移动的总距离,因此我们会缓存报告给我们的最后一个点。
var previousPanPoint: CGPoint?
let pixelToAngleConstant: Float = .pi / 180
func handlePan(_ newPoint: CGPoint) {
if let previousPoint = previousPanPoint {
let dx = Float(newPoint.x - previousPoint.x)
let dy = Float(newPoint.y - previousPoint.y)
rotateUp(by: dy * pixelToAngleConstant)
rotateRight(by: dx * pixelToAngleConstant)
}
previousPanPoint = newPoint
}
我们计算 dx
和 dy
self 们上次调用识别器以来我们的手指在每个方向上移动了多少像素。使用 pixelToAngleConstant
,我们将像素值转换为一个角度(以 randians 为单位)以旋转我们的球体。使用更大的常量以获得更快的旋转。
手势识别器返回一个状态
,我们可以使用它来确定手势是开始、结束还是手指已经移动。当手势开始时,我们将手指位置保存在 previousPanPoint
中。当我们的手指移动时,我们调用上面的函数。当手势结束或取消时,我们清除我们的 previousPanPoint
。
@objc func handleGesture(_ gestureRecognizer: UIPanGestureRecognizer) {
switch gestureRecognizer.state {
case .began:
previousPanPoint = gestureRecognizer.location(in: view)
case .changed:
handlePan(gestureRecognizer.location(in: view))
default:
previousPanPoint = nil
}
}
我们如何旋转球体?函数 rotateUp
和 rotateRight
只是调用我们更通用的函数,rotate(by: around:)
不仅接受角度而且接受轴旋转。rotateUp
绕 x 轴旋转,rotateRight
绕 y 轴旋转。
func rotateUp(by angle: Float) {
let axis = SCNVector3(1, 0, 0) // x-axis
rotate(by: angle, around: axis)
}
func rotateRight(by angle: Float) {
let axis = SCNVector3(0, 1, 0) // y-axis
rotate(by: angle, around: axis)
}
在这种情况下,rotate(by:around:)
相对简单,因为我们假设节点未平移/我们希望围绕节点局部坐标系的原点旋转。当我们查看一般情况时,一切都会稍微复杂一些,但这个答案只是一个小起点。
func rotate(by angle: Float, around axis: SCNVector3) {
let transform = SCNMatrix4MakeRotation(angle, axis.x, axis.y, axis.z)
sphereNode.transform = SCNMatrix4Mult(sphereNode.transform, transform)
}
我们从角度
和轴
创建一个旋转矩阵,并将球体的旧变换
乘以计算得到的新的转换
。
这是我创建的小演示:
这种方法有两个主要缺点。
它仅围绕节点坐标原点旋转,并且仅在节点位置为 SCNVector3Zero
它既不考虑手势的速度,也不会在手势停止时球体继续旋转。使用这种方法无法轻松实现类似于表格 View 的效果,您可以在其中滑动手指,表格 View 快速滚动然后减慢速度。一种解决方案是为此使用物理系统。
关于ios - 如何使用平移手势识别器旋转 SCNSphere,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45851641/
我将如何向 uipickerview 添加手势事件来更改选项卡?我必须创建一个自定义类,但是,我不知道如何处理 uipickerview。我当前在 uiviews 中存在手势来执行此操作,但我在使用
我需要创建一个 Activity ,当您在屏幕上拖动手指时,显示 XY 坐标(手指移动的位置)。谁能帮帮我? 最佳答案 OnTouch 您需要为想要识别拖动的任何 View 实现一个 OnTouchL
我目前正在开发手语识别应用程序,我想在其中使用隐马尔可夫模型作为分类阶段,这意味着我将对手势/姿势进行分类以获得相关的字母或单词。 我目前已经完成了检测手的第一阶段。目前我可以获得许多可用于我的机器学
我想在我的应用程序中启用 PyQT 手势。有人有一个示例或一些简短的代码可以演示在 PyQT 应用程序中使用手势控制吗? 我尝试谷歌搜索,但只能找到一篇关于自定义手势的帖子...我还没有那么远,我只是
什么 Android Api 用于在 Android 的开始屏幕上向左或向右滚动? 最佳答案 最简单的方法是检测“Fling”手势。 android API 有一个内置的检测器,用于检测基本手势,如滑
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我讨厌 Firefox 的手势,我只想点击,但如果我的 Action 在点击过程中抖动,就会一团糟! 如何禁用 Firefox 手势? 最佳答案 您需要更改配置,您可以通过键入 about:confi
我正在构建一个iOS应用程序,该应用程序需要与在Safari中来回滑动时看到的效果相同的效果。 滑动后退时,前景面板会移开,但背面的面板也会移动一点。与Yahoo Weather应用程序中的水平滚动非
我想做一些类似默认通知状态栏的东西(可从屏幕顶部扩展)。当用户在屏幕外触摸手机并将手指向下移动时,如何检测触摸? OnTouch 监听器仅在用户在屏幕上启动时工作。 最佳答案 在 html-js 中,
我有一个简单的问题,我正在尝试为 Windows Phone 制作一款大型游戏,但我仍然遇到一个重要的瓶颈/问题/性能不佳。 我用过 mango profiler,但我没有发现任何问题,事实上它在我的
我在按照此处的手势教程进行操作时遇到了一个非常奇怪的问题:http://developer.android.com/resources/articles/gestures.html . 在 Gestu
我正在尝试创建一个简单的应用程序,用户可以在其中将手指保持在屏幕上的同时向左然后向右滑动。我想计算他们总共进行了多少次滑动,包括方向的改变。我正在使用带方向的 uiswipegesture,但它只在新
我有一个问题。有一个uiview,它是通过手势控制的(可以水平移动)。虽然这个 uiview 很小,但一切都很好。 在使用 CGAffineTransformScale 缩放它之后,奇怪的事情开始了:
如何在 UIWebview 中识别用户 touch、tap 和 double tap。是否有可用的代表,例如触摸开始等? 最佳答案 这是在webview上实现单击和双击的代码 UITapGesture
我创建了一个自定义 ScrollView 类,它使用两个 subview ,它们可以滚动(启用分页)以在屏幕上当前显示任何一个 View 。 我想做的是更改它,以便第二个 View 仅在点击特定按钮时
如何向当前事件窗口发送缩放手势?我尝试创建一个 GESTUREINFO 结构,但我不知道如何正确传递该结构。到目前为止,这是我得到的。 GESTUREINFO gi; POINT pt; ZeroMe
纽约时报有一个非常有趣的翻页功能。您可以从左向右/从右向左滑动以查看其他项目(这很容易实现)。即使您没有超过阈值, View 也会随着您的手指移动并在您抬起手指后回滚到初始 View 。他们是怎么做到
我正在开发 iOS 应用。 我添加了一个 UIPinchGestureRecognizer 来监听双指张开 Action 。 [[self view]addGestureRecognizer:[[UI
我有一个允许用户平移和放大图像的应用程序。我认为,没有太多麻烦,用户可以让自己进入一种状态,他们放大了图像的一部分,并希望将所有内容重置回“基态”(即,将所有翻译和分别重新缩放回 0 和 1)。 我正
我相信你聪明的头脑和强大的机器人技能。我有点卡住了。 我有以下情况。我创建了用于学习如何使用手势和 Canvas 的应用程序。 想法很简单,当我在屏幕上点击一次,我点击的地方应该出现气泡(R.draw
我是一名优秀的程序员,十分优秀!