问题标签 [scenekit]

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 投票
3 回答
12656 浏览

ios - 从 Blender 导出到 COLLADA/.dae 格式以在 SceneKit 中使用时包括纹理

我可以使用 COLLADA/.dae 格式导出在 Blender 中创建的网格以在 SceneKit 中使用 - 但是在 iOS 设备上没有显示纹理。

此外,OS X 上的预览不会打开从 Blender 导出的任何 COLLADA 文件 - 但侧边栏预览确实显示了网格。出口需要哪些选项才能完成这项工作?

0 投票
2 回答
1652 浏览

ios8 - SceneKit - 遮挡剔除

我在 iOS 8 上使用 SceneKit 已经有一段时间了,最​​近,我遇到了需要检测节点是否没有出现在视口上的情况。遮挡剔除可能是一种可能的解决方案。因此,SceneKit 是否提供任何遮挡剔除选项,如果没有,我可能想尝试哪些其他建议?谢谢!

0 投票
1 回答
340 浏览

ios - SceneKit:相对于身体的物理世界

我有一艘船,一切都以它为中心,一切都相对于它移动。这是一款第一人称射击游戏。现在,当我开火,飞船加速时,它赶上了子弹。我希望物理世界相对于船的速度移动,这样子弹基本上不受船速的影响。

物理引擎正在做正确的事情,但对我的游戏来说不是正确的事情。

我有其他元素在船移动时相对于船移动,现在它们移动正确,所以不要让船静止并移动它周围的世界中的所有其他东西。我没有看到直接的方法来做到这一点,也许有间接的方法?也许我可以手动接管子弹的定位。我想使用物理引擎的其他部分进行碰撞等,所以不想完全手动完成,但如果这是唯一的选择。

还有人有什么建议吗?

0 投票
3 回答
4014 浏览

ios - SceneKit:如何在没有碰撞的情况下检测接触

我正在寻找最好的方法(性能方面)来检测在 SceneKit 物理世界中不碰撞(不相互反弹)的两个对象之间的接触。

我看到 SpriteKit 有 acontactTestBitMask和 acollisionBitMask用于物理体,而 SceneKit 只有后者。因此,当对象在 SceneKit 中有联系时,必须有另一种首选方式来获得通知。我想为每个对象调用 contactTestBetweenBody:andBody:options:每个帧不是最好的方法吗?

更新 在 iOS 9.0 中,Apple 添加contactTestBitMaskSCNPhysicsBody. 所以这个问题很快就会过时。

0 投票
1 回答
336 浏览

ios - 当枢轴在另一个节点的几何图形内时节点移动

我的场景包含;
场景根部的静态物体

一个动态体,其轴属性位于 (0,-1200,0)

由于两个节点都是 rootNode 的子节点,因此枢轴位于静态节点的中心。这个想法是运行一个 SCNAction,它围绕 _firstNode 围绕它的 X 轴旋转 _secondNode,并根据需要围绕它的 Y 轴旋转 applyTorque。

这段代码目前很好,问题是当 _firstNode 保持静态时,它会将 _secondNode.pivot 推到 _firstNode 几何体的表面。然而,简单地将_firstNode 的physicsBody 带走也不能解决问题。

0 投票
3 回答
10128 浏览

ios - 如何正确使用 iOS (Swift) SceneKit SCNSceneRenderer unprojectPoint

我正在使用 iOS 上的 SceneKit 开发一些代码,在我的代码中,我想确定全局 z 平面上的 x 和 y 坐标,其中 z 为 0.0,x 和 y 由轻按手势确定。我的设置如下:

如你看到的。我有一个三角形,高 4 个单位,宽 4 个单位,并设置在以 x, y (0.0, 0.0) 为中心的 z 平面 (z = 0) 上。相机是默认的 SCNCamera,它看起来在负 z 方向,我把它放在 (0, 0, 15)。zNear 和 zFar 的默认值分别为 1.0 和 100.0。在我的 handleTap 方法中,我获取点击的 x 和 y 屏幕坐标,并尝试找到 z = 0.0 的 x 和 y 全局场景坐标。我正在调用 unprojectPoint。

unprojectPoint 的文档表明

取消投影 z 坐标为 0.0 的点会返回近剪裁平面上的点;取消投影 z 坐标为 1.0 的点会返回远裁剪平面上的点。

虽然它没有具体说明近平面和远平面之间的点之间存在线性关系,但我已经做出了这个假设并将 screenZ 的值计算为 z = 的近平面和远平面之间的百分比距离0 平面位于。要检查我的答案,我可以在三角形的角附近单击,因为我知道它们在全局坐标中的位置。

我的问题是,当我开始更改相机上的 zNear 和 zFar 剪裁平面时,我没有得到正确的值并且没有得到一致的值。所以我的问题是,我该怎么做?最后,我将创建一个新的几何图形并将其放置在与用户单击位置相对应的 z 平面上。

在此先感谢您的帮助。

0 投票
4 回答
3335 浏览

ios - 如何制作具有不同纹理的 SCNNode 的新实例

我将 COLLADA 文件中的网格加载到 SceneKit 中。假设我有一个立方体,其材质具有一定的纹理。然后在代码中,我想制作这个 SCNNode 的新副本——我clone到目前为止已经使用过——然后我需要设置一个新的纹理。这就是问题所在,因为如果我获得其中一个克隆立方体的命名材质并更新其纹理 ( thematerialofmycube.diffuse.contents = @"somefile.png"),将为立方体的所有实例设置相同的纹理。clone显然不会深度复制几何、材料和纹理之类的东西。所以我尝试的是制作几何体本身的副本,并尝试制作新材质,为新材质设置新纹理,并将该材质添加到新几何体的材质数组中,同时移除旧材质. 似乎没有直接的方法可以这样做(材料被命名,但存在于一个数组中,因此理论上几种材料可以具有相同的名称 - 这会导致从数组中添加/删除一些庞大的对象),以及何时我这样做了,新的纹理出现了,但它们倒置了,而且材料的顺序似乎不正确,因为我用“背面”纹理代替了正面纹理,反之亦然。我希望我不必在我的 3d 编辑器中绘制所有这些东西,

我具体做的是在我的 3d 编辑器中画了一张王牌,并将其导出到 COLLADA。现在我有 52 个 png 的王牌面——显然我需要替换新的王牌实例的面。

0 投票
3 回答
2629 浏览

ios - 手势识别器和 SceneKit

有没有办法在 SceneKit 中捕捉单个网格的触摸(触地、触地等),或者真的SCNNode是 s?

0 投票
0 回答
450 浏览

ios - SceneKit 中相机移动引起的叠加

我的 SceneKit 应用程序中有以下代码可以在碰撞后移动相机:

但是,我遇到了一个问题,即移动相机有时会导致动画之前的帧在最后一帧中显示为叠加层,如下所示: 在此处输入图像描述

相反,它应该如下所示: 正确渲染

但是,这种情况并非每次都发生,并且(对我而言)没有明确的原因为什么它有时会发生而不是其他情况。谁能引导我朝着正确的方向前进?

谢谢!

0 投票
2 回答
2761 浏览

3d - 围绕自身中心旋转 SCNText 节点(Swift - Scenekit)

我正在尝试旋转一些 3D 文本。如何围绕自身中心而不是左边缘旋转它?我尝试将文本对齐设置为居中,但这也无济于事。