问题标签 [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.
ios - 从 Blender 导出到 COLLADA/.dae 格式以在 SceneKit 中使用时包括纹理
我可以使用 COLLADA/.dae 格式导出在 Blender 中创建的网格以在 SceneKit 中使用 - 但是在 iOS 设备上没有显示纹理。
此外,OS X 上的预览不会打开从 Blender 导出的任何 COLLADA 文件 - 但侧边栏预览确实显示了网格。出口需要哪些选项才能完成这项工作?
ios8 - SceneKit - 遮挡剔除
我在 iOS 8 上使用 SceneKit 已经有一段时间了,最近,我遇到了需要检测节点是否没有出现在视口上的情况。遮挡剔除可能是一种可能的解决方案。因此,SceneKit 是否提供任何遮挡剔除选项,如果没有,我可能想尝试哪些其他建议?谢谢!
ios - SceneKit:相对于身体的物理世界
我有一艘船,一切都以它为中心,一切都相对于它移动。这是一款第一人称射击游戏。现在,当我开火,飞船加速时,它赶上了子弹。我希望物理世界相对于船的速度移动,这样子弹基本上不受船速的影响。
物理引擎正在做正确的事情,但对我的游戏来说不是正确的事情。
我有其他元素在船移动时相对于船移动,现在它们移动正确,所以不要让船静止并移动它周围的世界中的所有其他东西。我没有看到直接的方法来做到这一点,也许有间接的方法?也许我可以手动接管子弹的定位。我想使用物理引擎的其他部分进行碰撞等,所以不想完全手动完成,但如果这是唯一的选择。
还有人有什么建议吗?
ios - SceneKit:如何在没有碰撞的情况下检测接触
我正在寻找最好的方法(性能方面)来检测在 SceneKit 物理世界中不碰撞(不相互反弹)的两个对象之间的接触。
我看到 SpriteKit 有 acontactTestBitMask
和 acollisionBitMask
用于物理体,而 SceneKit 只有后者。因此,当对象在 SceneKit 中有联系时,必须有另一种首选方式来获得通知。我想为每个对象调用 contactTestBetweenBody:andBody:options:
每个帧不是最好的方法吗?
更新
在 iOS 9.0 中,Apple 添加contactTestBitMask
了SCNPhysicsBody
. 所以这个问题很快就会过时。
ios - 当枢轴在另一个节点的几何图形内时节点移动
我的场景包含;
场景根部的静态物体
一个动态体,其轴属性位于 (0,-1200,0)
由于两个节点都是 rootNode 的子节点,因此枢轴位于静态节点的中心。这个想法是运行一个 SCNAction,它围绕 _firstNode 围绕它的 X 轴旋转 _secondNode,并根据需要围绕它的 Y 轴旋转 applyTorque。
这段代码目前很好,问题是当 _firstNode 保持静态时,它会将 _secondNode.pivot 推到 _firstNode 几何体的表面。然而,简单地将_firstNode 的physicsBody 带走也不能解决问题。
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 平面上。
在此先感谢您的帮助。
ios - 如何制作具有不同纹理的 SCNNode 的新实例
我将 COLLADA 文件中的网格加载到 SceneKit 中。假设我有一个立方体,其材质具有一定的纹理。然后在代码中,我想制作这个 SCNNode 的新副本——我clone
到目前为止已经使用过——然后我需要设置一个新的纹理。这就是问题所在,因为如果我获得其中一个克隆立方体的命名材质并更新其纹理 ( thematerialofmycube.diffuse.contents = @"somefile.png"
),将为立方体的所有实例设置相同的纹理。clone
显然不会深度复制几何、材料和纹理之类的东西。所以我尝试的是制作几何体本身的副本,并尝试制作新材质,为新材质设置新纹理,并将该材质添加到新几何体的材质数组中,同时移除旧材质. 似乎没有直接的方法可以这样做(材料被命名,但存在于一个数组中,因此理论上几种材料可以具有相同的名称 - 这会导致从数组中添加/删除一些庞大的对象),以及何时我这样做了,新的纹理出现了,但它们倒置了,而且材料的顺序似乎不正确,因为我用“背面”纹理代替了正面纹理,反之亦然。我希望我不必在我的 3d 编辑器中绘制所有这些东西,
我具体做的是在我的 3d 编辑器中画了一张王牌,并将其导出到 COLLADA。现在我有 52 个 png 的王牌面——显然我需要替换新的王牌实例的面。
ios - 手势识别器和 SceneKit
有没有办法在 SceneKit 中捕捉单个网格的触摸(触地、触地等),或者真的SCNNode
是 s?
3d - 围绕自身中心旋转 SCNText 节点(Swift - Scenekit)
我正在尝试旋转一些 3D 文本。如何围绕自身中心而不是左边缘旋转它?我尝试将文本对齐设置为居中,但这也无济于事。