问题标签 [scnscene]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
654 浏览

ios - SceneKit:用一个手势围绕点旋转相机,同时允许相机以不同的手势旋转

假设 SceneKit 场景提供类似于 Minecraft 的视角。有一台相机。相机节点就像人的“头”,而它的父节点就像“身体”。相机节点是父节点的子节点,称为“userNode”。

目标:

  • 让用户用一根手指平移来旋转相机。换句话说,相机位置保持固定,但“头部”旋转并让用户观看场景,就像转了一圈一样。

  • 让用户用两根手指平移以围绕给定点旋转相机。换句话说,相机位置和旋转现在会发生变化,以便让用户从不同角度查看同一点。

到目前为止,下面的代码实现了单指平移行为。问题是如何合并两指平移行为。

选项 1:按照这个答案,它解释了如何环绕相机。然而,这似乎不是最理想的,因为场景中已经有一个摄像机节点,并且需要额外的节点,同时还要在不同摄像机之间移动场景的视点。

选项 2:计算相机的新位置和旋转,这样可以避免添加另一个相机节点和另一个轨道节点。这感觉像是更好的答案,但可能更复杂。

问题:

1) 在 SceneKit 中是否有更简单的方法来完成此任务?

2)如果不是,上面的两个选项是否只有两个选项,如果是,哪个选项更好?

3) 对于选项 2,更新userNode或“body”的位置似乎很简单:只需计算沿给定中心原点的圆的新位置,即轨道点)。对于“头”,除了更新(或“头”)的rotation属性之外,还有什么需要注意的吗?cameraNode似乎将相机定向为始终面向轨道点可能会更复杂,因为有一部分 SceneKit API 专用于它,例如,SCNLookAtConstraint.

0 投票
1 回答
475 浏览

ios - 如何使用来自 Blender 的 .dae (COLLADA) 文件在 SceneKit 中创建用户生成的动画

我正在尝试为 SceneKit 中 SCNScene 对象的特定部分设置动画(在我的情况下,我想为手的手指设置动画)。我很容易从 Blender 中导入带有相应骨骼的 .dae (COLLADA) 文件,以在模型上生成关节。

我的目标是使用用户生成的 0 到 1 之间的值在 iOS 上为这些骨骼设置动画。想象一个 UISlider,您可以在其中来回滚动并看到特定手指根据滑块的值移动。

这是需要的动画截图

假装动画的图像

我尝试通过调用像 Apple 的 Fox 示例这样的动画文件来为模型设置动画:

问题是这是一个全局动画,而不仅仅是食指。此外,它始终是“预定义”动画,而不是由用户输入控制的动画。最终我想混合动画(例如同时移动食指和拇指显示手势)

这可能吗?我很挣扎,因为我不知道如何操作网格的特定部分。我开始研究 MetalKit,但我不清楚这就是解决方案。

任何帮助将非常感激。

0 投票
1 回答
154 浏览

ios - 使用同一相机在不同深度添加多个 SCNView

我正在使用 SceneKit 添加带有 3D 战场的纸牌游戏。

战场有一个深度,其中 3D 对象的顶部是城堡的顶部,而底层在 z 轴上更下方,代表地面。

当玩家手中有卡片时,我想在可能的顶层将它们绘制为 UIViews,我已经能够通过添加我的 GameControllerView 来做到这一点,它具有卡片的 UIViews 作为子视图,将其直接放置在3D场景的顶部。

卡 UI 放置在战场 3d 场景的顶部

我想在 3D 对象内绘制不同深度(z 轴)的卡片 UIView——有时将它们绘制在地面上的图层上,有时将它们绘制在顶部的图层上。

通过将 childNodes 添加到主场景的 rootNode 中,我已经能够在战场的不同深度添加更多 3D 元素,如下所示:

但我特别需要添加 UIViews 而不是更多的 SCNScenes。

如何在底部深度设置一个 SCNView,在其上绘制 UI 视图,设置另一个增长到更高 z 轴深度的 SCNView,在其上绘制 UIView,并让它们共享相同的相机/屏幕?

0 投票
1 回答
670 浏览

ios - 在 SceneKit 中的触摸位置创建 SCNCylinder 不准确

我正在尝试在 SceneKit 中使用SCNCylinder. 我希望将圆柱体放置在场景中用户点击屏幕的位置。

我目前的方法有效,但由于某种原因,圆柱体没有准确地放置在触摸位置。根据屏幕的不同部分,圆柱体有时位于触摸位置的中间,有时偏离很大。我希望屏幕截图能很好地说明问题。

在 screenpos 创建 SCNCylinder 时的偏移量

我目前有一个SCNSphere相机所在的位置。通过用球体对屏幕接触点进行命中测试,我检索到一条朝向命中测试的射线。然后我取光线的法线向量并将圆柱体沿乘以 6 的向量定位。

有谁知道这种方法的问题是什么以及为什么我会遇到这种偏移行为?

这就是我目前创建的方式SCNCylinder

0 投票
1 回答
318 浏览

ios - SceneKit:围绕任意点进行轨道运行而无需相机跳跃或将锚点移动到中心?

目标是围绕场景中任意但可见的点运行。

当用户平移时,相机应该围绕这个锚点移动和旋转。

如果锚点位于屏幕中间,这将非常有效。

但是,如果锚点偏离中心(例如,在屏幕的左边缘),相机会在将锚点带入中心时瞬间跳跃。

下面的代码修复了跳跃问题,但它使用户迷失方向,因为锚点缓慢地移动到中心。

相机移动与平移手势相关联。

关于如何解决这个问题的任何想法?

0 投票
1 回答
797 浏览

ios - 如何定位一个 SCNNode 以覆盖整个 SCNView?

我对 SceneKit 非常陌生,非常感谢您的帮助!
我的 UIView 中有一个 200x200 大小的 SCNView,它位于超级视图的中心。我想在里面放一个 SCNCylinder,这样 SCNCylinder 就可以覆盖整个 SCNView。我读到 Scenekit 的所有这些视图都是以米为单位定义的,那么如何在屏幕尺寸和 SCNCylinder 之间建立关系。

我试过了:

但这在我的 coinScene 和 ibOutletScene 之间留有余量。如何删除这个空间?

我也尝试添加相机:

但是我看到了随机行为,并且 coinNode 被隐藏了!我应该如何定位我的相机?或者有没有其他方法可以从我的 ibOutletScene 中删除多余的空间?

编辑:如果我不添加相机,这就是它的外观。红色场景和绿色硬币之间有一个边缘。我尝试了多种尺寸的硬币,但除非我添加相机,否则我无法删除此边距。但是,如果我添加相机,我会遇到另一个问题,在这个截图下面提到。 红色是场景和绿色硬币,如何去除两者之间的边距

如果我不添加相机,硬币上的旋转动画效果很好,但是如果我添加相机,旋转会放大然后随着动画再次变小。如何在不增加尺寸的情况下沿其轴旋转它?我正在使用以下代码来旋转硬币:相同的代码在没有相机的情况下也可以正常工作,但在添加相机后会放大硬币。签出快照。

在此处输入图像描述

0 投票
2 回答
1141 浏览

scenekit - 我从 SCNScene 创建了 MDLAsset。如何提取 MDLMesh、MDLCamera(s) 和 MDLLight?

我正在努力尝试遍历MDLAsset通过加载SCNScene文件 (.scn) 创建的实例。

我想识别和提取MDLMeshs 以及相机和灯光。我认为没有直接的方法可以做到这一点。

例如,我在 MDLAsset 上看到了这个实例方法:

这是我用的吗?

我已经在 SceneKit 建模器中仔细标记了事物。我可以不参考那些理想的吗?当然,有一本我可以访问的 ids/labels 字典。我在这里想念什么?

更新 0

由于完全缺乏 Apple 文档,我不得不求助于 Xcode 调试器中的场景图。叹息...

在此处输入图像描述

一些东西。我看到了MDLMeshMDLSubmesh这就是我所追求的。获取它的遍历方法是什么?灯光和相机也是如此。

我还需要知道顶点描述符的布局,以便与我的着色器同步。我可以在 parsed 上强制使用特定的顶点布局SCNScene吗?

0 投票
1 回答
212 浏览

scenekit - 我有一个 SCNScene 实例。如何提取每个 SCNGeometry 实例?

Metal编写的应用程序中,Swift我想从实例中提取SCNGeometry实例SCNScene以继续并构建MDLMesh。我没有看到提取几何图形的 API 调用(相机和灯光类似)。我该怎么做呢?

0 投票
2 回答
2584 浏览

ios - 更改 SCNScene 比例

我正在尝试使用SCNNode以下代码缩小我的对象:

但问题是对象的比例根本没有改变!怎么了 ?

0 投票
3 回答
1734 浏览

ios - 检查 SCNNode SCNAction 是否完成

我创建了一个玩家可以在其中移动的 SceneKit 3D 迷宫世界。像跳跃这样的一些动作涉及上下移动相机,同时在几秒钟的时间内改变观察方向。在此期间,我想忽略用户的点击和滑动,这通常会导致其他类型的运动,如转身和向前移动。

我可以创建一个与跳跃持续时间相匹配的计时器并设置一个布尔值,但我希望有一种更简单的方法来检查相机的 SCNNode。

是否有一种简单的方法可以查看相机的 SCNNode 是否不再运行 SCNAction 进行跳转,以便我可以在其他点击和滑动操作之前添加此逻辑?

或者也许有一个 SCNAction 可以设置我可以在跳跃序列的开始和结束时放置的 Bool?

这是我的跳转代码:

谢谢

格雷格