SceneKit是一个高级框架,用于为iOS,OS X,tvOS和watchOS构建3D用户界面,数据可视化和休闲游戏。
如何在 Swift 中将碰撞位掩码设置为 SceneKit 中的 `all`
我需要将一个SCNNode的collisionBitMask设置为默认值,即所有位设置。 事实证明这是相当棘手的,以下是我迄今为止的研究: CollisionBitMask 是 Int 类型(不是...
我需要设置节点的物理体。当我有一个自定义枢轴但没有缩放或旋转时,我可以简单地通过枢轴的反转来变换形状,如下所示: 让 boxGeo = SCNBox...
我有一个名为navigation.scn的文件,其中有3个模型spaceship.usdz Earth.usdz和moon.usdz。我目前用我的代码看不到任何一个 3。我还在我想看的地方放置了一个相机....
SceneKit 在 RealityKit 中的“allowsCameraControl”等效项
在 SceneKit SDK 中,要允许控制相机移动,您需要将名为 .allowsCameraControl 的参数设置为 true。 var scnView = SCNView(frame: .zero) scnView.allowsCameraControl = true 什么
我试图找到碰撞时两个物体之间的接触区域(重叠区域矩形)。在 Scenekit 中,我收到有关碰撞物理世界的回调(_ world: SCNPhysicsWorld, didBegin
如何将相机放置在 SceneKit 中 SK3DNode 内的 3D 模型中心
我希望能够在 SK3DNode 内居中放置 3D 模型。我有以下代码: 公共扩展 SK3DNode { static func forModel(_ 模型: SCNNode, 大小: CGSize) -> SK3DNode { 让...
我正在使用 SceneKit 制作 3D 棋盘游戏。棋盘本身是平坦的,但上面的棋子是 3D 的。我想放置相机,使其以这样的角度向下看板: ...
如何继承 SCNNode 并使用采用 MDLObject 的 init?
我需要子类化 SCNNode 并使用采用 MDLObject 的 init(这不是指定的 init)。 公共类 MyModelNode: SCNNode { 公共变量 geo: SCNGeometry! 私有函数 dfs(节点:
我使用 SK3DNode 在屏幕上显示一些 3D 模型文件。它们的尺寸不同,但我想在屏幕上显示它们或多或少相同的尺寸。 我有以下代码: 公共扩展
我正在使用示例代码:https://github.com/laanlabs/SCNTechniqueGlow。此代码使用 SCNTechnique 使 3d 模型发光。 现在我想将发光功能移至框架而不是......
我正在按照一些示例代码(https://github.com/laanlabs/SCNTechniqueGlow)使用SCNTechnique向3D模型添加边框。代码将技术设置为SCNView: scnView.technique = 技术
我有一个场景套件节点,我想为其添加发光效果。 让 newScene = SCNScene(命名为:“art.scnassets/cubeOne.scn”)! let newNode = (newScene.rootNode.childNode(withName: "cubeOne...
我有以下最小可重现代码: 类 GameViewController: UIViewController { 覆盖 func viewDidLoad() { super.viewDidLoad() 如果让 view = self.view as! SKView? ...
我有这个最小的可重现代码: 类 GameViewController: UIViewController { 覆盖 func viewDidLoad() { super.viewDidLoad() 如果让 view = self.view as! SKView? { ...
我正在尝试在 SceneKit 几何修改器中获取 RGB 值,并使用该值来定位我的几何体。 这是我的着色器中的内容。 #包括 #包括 我正在尝试在 SceneKit 几何修改器中获取 RGB 值,并使用该值来定位我的几何体。 这是我的着色器中的内容。 #include <metal_stdlib> #include <simd/simd.h> #include <metal_texture> #pragma arguments texture2d terrainRGB; #pragma transparent #pragma body constexpr sampler textureSampler(coord::normalized, address::clamp_to_edge, filter::nearest, mip_filter::nearest); float4 elevation = terrainRGB.sample(textureSampler, _geometry.texcoords[kSCNTexcoordCount-1]); float r = elevation.r * 256; float g = elevation.g * 256; float b = elevation.b * 256; float rgbExpression = (r * 256.0 * 256.0) + (g * 256.0) + b; float e = -10000.0 + (rgbExpression * 0.1); _geometry.position.z = e; 然后我像这样设置我的几何图形。 let geo = geo = SCNGeometry(...) let texture = SCNMaterialProperty(contents: img) geo.setValue(texture, forKeyPath: "terrainRGB") 如果我将高程编码为几何法线,则使用法线而不是纹理来获取高程,此代码可以正常工作。 但我不想使用法线,因为这会改变光源在我的场景中的工作方式。 我不知道应该将什么数据类型传递给 geo.setValue() 才能在着色器中与 texture2d 一起使用。 或者我还应该对修改后的几何体进行其他操作以传递纹理并能够在修改器中对其进行采样。 事实证明,我需要做三件事才能完成这项工作。 我需要将 MTLTexture 传递给 SCNMaterialProperty 而不是 UIImage。 我需要在 SCNMaterialProperty 上设置过滤器,以匹配几何修改器中 sampler 上的过滤器。 (我不确定其他组合是否有效,这正是我必须对我的案例所做的。) 我必须将我的图像转换为CGColorSpace.genericRGBLinear。 我的 sRGB 色彩空间图像。 我不太清楚为什么我必须这样做。 我设置了一个顶点着色器来使用 RealityKit 执行完全相同的操作,并且它与 sRGB 图像配合得很好。 这是我在 SCNGeometry 上设置纹理的最终代码。 if let cgImg = image.cgImage, let colorSpace = CGColorSpace(name: CGColorSpace.genericRGBLinear), let textureImg = cgImg.copy(colorSpace: colorSpace), let d = self.sceneDevice { //an MTLDevice do { let textureLoader = MTKTextureLoader(device: d) let texture = try textureLoader.newTexture(cgImage: textureImg) let scnTexture = SCNMaterialProperty(contents: texture) scnTexture.minificationFilter = .nearest scnTexture.magnificationFilter = .nearest scnTexture.wrapS = .clamp scnTexture.wrapT = .clamp geo.setValue(scnTexture, forKeyPath: "terrainRGB") } catch { print("Error: \(error)") } }
SCNTransaction 不会在场景加载时运行,除非先点击场景
我正在以编程方式创建 SceneKit,并且我想重点关注使用下面的此方法添加的所有节点。并将它们包装在 SCNTransaction 中以动画化运动。 @objc 功能
SCNNode 边界框在 SceneKit 中缩放或旋转后未更新
我有这个代码: 让盒子= SCNBox(宽度:1,高度:2,长度:4,chamferRadius:0.2) box.firstMaterial?.diffuse.contents = UIColor.yellow box.firstMaterial?.emission.contents = UIColor.
RealityView iOS 18 如何使用触摸拖动手势精确移动实体
使用 iOS 18 RealityView 非常方便地替换 SceneKit 创建 3d 但当涉及到使用 2d 触摸和拖动移动 3d 实体时,我面临一个问题,我无法做出准确的移动,就像
我创建了一个简单的项目来尝试 SceneKit,添加了一个包含一个男人角色和一个相机的场景。 问题是代码在模拟器和设备上的行为不同。 当
SceneKit/ARKit 地板反射反射CategoryBitMask
我需要在场景中有一个地板,它只能反射一些物体,而不是全部。我用这样的方式创建了一个地板: 让地板 = SCNFloor() 地板.firstMaterial!.lightingModel = .constant