SceneKit - 如何在另一个节点内反弹一个节点(鱼缸里的鱼)

Posted

技术标签:

【中文标题】SceneKit - 如何在另一个节点内反弹一个节点(鱼缸里的鱼)【英文标题】:SceneKit - How to bounce a node within another node (fish in fish bowl) 【发布时间】:2016-11-20 11:47:09 【问题描述】:

我正在从 .dae (Collada) 文件渲染场景。在场景中我有 4 个节点。

大节点是一个形状奇特的矩形“盒子”。我需要其他节点在这个节点内反弹,就像鱼缸里的鱼一样。

我的矩形节点设置如下:

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                            SCNPhysicsShapeTypeKey, SCNPhysicsShapeTypeConcavePolyhedron, nil];

SCNPhysicsShape *shape = [SCNPhysicsShape shapeWithNode:self.box1 options:dictionary];

SCNPhysicsBody *body = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeStatic shape:shape];

self.box1 = [self.scene.rootNode childNodeWithName:@"box1" recursively:NO];
self.box1.physicsBody = body;

我的小节点只是带有动态物体的简单形状。

一切都会反弹并相互碰撞。我的问题是较小的节点只会在较大的“盒子”节点的顶部反弹。好像盒子上有一个盖子。我无法让较小的节点进入“框”内的空白区域。因此,就像较小的“鱼”节点无法进入碗中,因为它们会撞到看不见的盖子上,然后躺在上面。

我希望这是有道理的......我的大脑正在试图弄清楚这一点。

【问题讨论】:

【参考方案1】:

盒子上有一个“盖子”。它是一个凸盒子,没有任何凹面,这正是你所需要的,一个凹盒子形状作为你的“碗”。

要创建它,您需要制作一个带有“孔”的“盒子”,方法是构建一个盒子的五个面并让一侧(顶部)打开。一定要给每一边相当大的宽度/深度,这样较小的物体就不会简单地从一帧穿过到下一帧。

【讨论】:

谢谢。这就是我最终做的。我希望 Scenekit 可以使用 3D 模型的真实形状。 [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeStatic shape:shape],只需将 shap 参数设置为 nil。这将获得更相似的几何图形,由 sceneKit 自动创建。

以上是关于SceneKit - 如何在另一个节点内反弹一个节点(鱼缸里的鱼)的主要内容,如果未能解决你的问题,请参考以下文章

SceneKit - 在另一个 SCNNode 上添加 SCNNode

SCENekit:未隐藏节点的问题

在 viewDidLoad 期间应用的 SceneKit 节点旋转无效

SceneKit:如何将节点的移动限制在本地的一个轴上,而不是整个世界

如何在 SceneKit 中将 allowCameraControl 与相机节点一起使用

如何设置 SceneKit 碰撞检测