在iOS中与复杂的人物互动

时间:2015-09-29 16:02:59

标签: ios 3d 2d draw scenekit

我需要能够与其中包含许多不同部分的cilinder的表示进行交互。当用户点击小矩形时,我需要显示与特定部分(表格)相关的弹出窗口。

下一张图片展示了逼真的3D方法。但是,我再说一遍,我需要解决这个问题, 3d不是需要(虽然会非常酷)。符合功能需求的表示就足够了。

有关绘制零件的信息来自API(大小,位置等)

enter image description here

我真的不需要它是现实的。最简单的近似是在2d表示中显示一个cilinder,就像一个由可交互的小矩形构成的矩形。

所以,正如我所提到的,我认为(我认为)有两种相反的方法:现实或简化

有没有办法在中间实现一个好的解决方案?我应该研究哪些库,组件和框架?

我的研究让我进入了SceneKit,但我仍然不知道我是否能够与它进行互动。 交互是一个非常重要的部分,因为我需要在用户点击圆柱体上的任何小矩形时显示一个弹出窗口。

由于

4 个答案:

答案 0 :(得分:2)

您不需要任何特殊框架来实现这样的交互。使用标准UIKitUIView以及一点三角函数可以实现此效果。实际上,您可以使用2D数学和绘图精确绘制示例图像。我的答案不是一个确切的公式,而是考虑如何定义形状并将问题分解为可管理的步骤。

圆柱体可以由两个偏移圆圈定义,这两个圆圈代表端部件,它们的半径相连。我将使用正交投影,这意味着当深度延伸到背景中时圆柱体看起来不会变小(但如果需要,您可以适应透视)。你可以在UIView drawRect中使用CoreGraphics绘制它。

方形切片表示圆的角度块,偏移量小于圆柱体的长度,但方向相同,如下图所示(抱歉不精确的绘图)。

enter image description here

你感兴趣的这个方形切片是用红色勾勒出来的区域,在第一个圆的半径之外,在假想的第二个圆的半径内(它只是偏离第一个圆圈的任何长度你想要的片)。

要绘制此区域,您只需绘制每条弧线轮廓的路径并连接端点。

检查触摸是否在其中一个方形切片内:

  1. 检查触点是否位于a原点的a角度之间。
  2. 检查触摸点是否在内圆的半径之外。
  3. 检查触摸点是否在外圆的半径范围内。 (注意这意味着如果圆圈的间距大于半径。)
  4. 要找到一个显示弹出窗口的点,您可以平均切片上的终点或找到​​两条边之间的中间角,并偏移距离的一半。

答案 1 :(得分:1)

理论上,使用SpriteKit或UIKit Popovers在Scene Kit中执行此操作非常理想。

然而,场景套件(和Sprite Kit)似乎处于不稳定的状态,其中没有人从Apple与用户沟通人们目前与两者有关的大量问题。从iOS 8.4中相对稳定且高性能的Sprite Kit到iOS 9中的大量丢失性能似乎很常见。场景工具包似乎没有完成,因此文档和社区几乎不存在。

话虽如此......理论是这样的:

材质ID是传统3D应用程序中用于定义具有不同材质的对象区域的内容。不知何故,这些材料ID被称为"元素"在SceneKit中。我还没有找到更多相关信息。

应该可以检测"元素"在触摸物体下方,并做出相应的反应。您甚至应该能够更改该元素上材质的状态/性质,以表明它是当前选中的。

根据您的示例,如果想要一个光滑,圆润的圆柱体,请从一个仅由足够的部分组成的圆柱体开始,以描述/定义您需要的材料ID。"矩形"要触摸的部分。

稍后您可以向圆柱体添加平滑操作以使其成圆形,并且每个唯一材质ID的象限中的所有额外平滑几何体应该是响应的,无论您如何添加此额外细节以平滑圆柱体的呈现

答案 2 :(得分:1)

"简化"的想法版本:

如果this representation是okey,则可以使用UICollectionView。 由于

,每个单元格都可以有一个定义的大小
collectionView:layout:sizeForItemAtIndexPath:

然后集合中的每个单元格都可以是一个代表a的小矩形 圆筒的可触摸部分。

并使用

collectionView:(UICollectionView *)collectionView 
   didSelectItemAtIndexPath:(NSIndexPath *)indexPath

获得触摸。

这将帮助您在正确的位置显示弹出窗口:

CGRect rect = [collectionView layoutAttributesForItemAtIndexPath:indexPath].frame;

最后,您可以在此处选择相应的弹出框(如果应用必须在iPhone上运行): https://www.cocoacontrols.com/search?q=popover

不完美,但我认为这很有效!

答案 3 :(得分:0)

是的,SceneKit。

当用户执行触摸事件时,这意味着您知道屏幕上的2D坐标,因此您唯一的决定是弹出视图,甚至不存在3D模型。

首先,我们可以在逻辑上将需求分成两部分,确定触摸部分,显示正确的颜色"在每个细分中。

我认为使用3D模型是为了确定在您的情况下显示哪条数据,如果我没有弄错的话。在这种情况下,SCNView的命中测试方法将为您完成大部分工作。您应该做的是执行命中测试,取出命中节点和该节点的命中本地3D坐标,然后您可以计算此触摸击中哪个线段并做出决定。

现在如何绘制圆柱体的表面将是唯一的左边问题,对吧?有多种方法可以做,例如,简单地绘制您需要的每个图像并以编程方式将其附加到圆柱体的材料上,或将图像文件放在磁盘上并用作圆柱体的材料......

我认为这个问题基本上已经解决了。