问题标签 [scenekit-modelio]

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 投票
2 回答
244 浏览

swift - 模型 I/O – 如何使用 `makeVerticesUniqueAndReturnError()` 实例方法?

一个实例方法makeVerticesUnique()修改了网格的顶点缓冲区,因此没有顶点被多个面共享。但它在 macOS 10.13 High Sierra 和 iOS 11 中已被弃用:

现在开发者必须使用一个新的实例方法:

但它没有记录。如何使用它?

在此处输入图像描述

当我使用这个新的实例方法时,Xcode 给了我一个错误:

0 投票
0 回答
304 浏览

swift - 打印 MDLMesh 的顶点位置

我正在尝试打印MDLMesh. 我在操场上有以下代码:

它正确打印第一个顶点,然后在第二个顶点上出现段错误。我怀疑我做错了什么bindMemory

更新:

将顶点复制到Data作品中:

但我不应该复制所有顶点数据来访问顶点。

0 投票
1 回答
2164 浏览

swift - 将 ARFaceGeometry 保存到 OBJ 文件

在 iOS ARKit 应用程序中,我一直在尝试将ARFaceGeometry数据保存到 OBJ 文件中。我按照这里的解释:如何从 AVDepthData 制作 3D 模型?. 但是,未正确创建 OBJ。这是我所拥有的:

生成的 OBJ 文件如下所示:

我希望有更多的顶点,并且索引值看起来是错误的。

0 投票
1 回答
169 浏览

ios - SceneKit:已从 STL 导入的导出网格导致垃圾

我正在使用这个 gist将二进制 STL 3d 网格导入 SCNNode,它工作正常(我可以在 SCNView 中查看网格,它看起来不错)。

但是,如果我尝试将(未更改的)网格导出到 STLMDLAsset.export(to: url)SCNScene.write(to: url)OBJ 文件中,则生成的网格会损坏。

如果我加载示例ship.scn场景然后导出到 STL,一切看起来都很好。这让我觉得上面提到的 gist 如何创建 SCNNode 一定有问题,但我不知道它是什么。

实际模型: 在此处输入图像描述 STL/OBJ 导出结果: 在此处输入图像描述

0 投票
0 回答
169 浏览

ios - 我可以将 obj 和材质都加载为 MDLAsset 吗?

我有一个包含 obj、mtl 和纹理的目录。如果我做

let asset = MDLAsset(url: url)然后它加载网格,但没有纹理。现在,如果我将model.mtl文件重命名为model.abc并运行相同的代码,我会在控制台上看到以下内容

020-10-08 19:24:36.277305-0700 ModelLoader2[1607:11820939] Unable to find mtl file /Users/myname/Documents/ModelLoader2/Models/model/model.mtl

这告诉我的是MDLAsset确实找到了 mtl 文件,但它没有正确加载纹理。有没有办法让它也加载纹理?我看到一些MDLAssetResolver使用以下定义调用的协议,但在互联网上绝对没有文档,在 github 上有 0 个有用的点击

我的问题是,

  1. 加载 obj 文件的最佳方法是什么?我原本打算使用 Model I/O,以便可以导出到.usdz其他格式
  2. 模型 I/O 是否不值得花时间处理,还是应该转向其他方法?似乎有一些 WWDC 讨论将其宣传为一个强大的框架,但到目前为止,由于缺乏文档,它似乎毫无用处。
0 投票
0 回答
59 浏览

ios - 我可以将 SKScene 用于 SceneKit 中加载的 Obj 文件的材质吗?

我的目标是能够点击特定模型并为表面着色。我已经设法使用通用 SCNSphere、SCNBox 等来做到这一点。

我是这样设置的,它基本上适用于 SCNSphere 等:

在此处输入图像描述

但是,当我加载.obj文件并尝试使用 SKScene 设置材质时,我什么也得不到。这是我如何设置obj

但如你所见,茶壶的颜色不是橙色

在此处输入图像描述

我的问题是,我在使用 SKScene 作为文件材料方面做错了什么obj,还是我知道有一些限制?我在这上面花了几个小时,如果有人有任何想法,我愿意接受建议。

另外,在这种情况下,我如何决定 SKScene 的大小,因为我想用 SKScene 任意包裹整个网格?

更新 1 我有点想通了。我的obj文件没有纹理坐标,只有顶点。当我尝试obj使用纹理坐标的另一个文件时,skScene似乎已正确加载。所以我猜我的茶壶没有 uv 坐标,所以它不能映射纹理。obj如果文件还没有它们,有没有办法添加 uv 坐标?

0 投票
1 回答
77 浏览

ios - 如果我使用金属分配 MDLAsset,然后使用该资产初始化 SCNNode,是否将 SCNGeometrySource 对象复制到非金属缓冲区?

如果我分配一个MDLAsset并且SCNNode喜欢这样

我的geometrySource对象是由 Metal 缓冲区支持的,还是该过程已经消失并复制了 NSData 中的数据?

0 投票
0 回答
85 浏览

swift - 在应用程序运行时不使用文件中的 xcode gui 界面将 obj(或 dae 或激光雷达扫描)导入 swift SceneAssests

系统。(Mac OS:Catalina 10.15.7,xcode版本:12.3,swift语言版本5)

是否有人在 ipad/iphone 上的项目文件(文件中)中访问了 .dae 或 .obj 并能够从该文件创建场景资产?我不想在应用程序构建之前使用 xcode 中的图形界面并放入文件。我希望能够加载和创建带有图像叠加层的场景(.scn),并使用文件中的任何对象原点作为新场景原点。这甚至可能吗?

我一直在用 modelIO 玩一些示例代码,但还没有真正起作用。前任。在某处调用该函数并告诉它文件名“scannedChair”

以下来自https://developer.apple.com/forums/thread/103245

在我尝试搜索此人的任何地方,人们都非常专注于从他们的应用程序中导出 3d 文件或在增强现实中使用它们,而不是在传统应用程序场景中使用扫描的项目。前任。我扫描一把椅子,并希望在 pov 游戏或应用程序中看到这把椅子。

*注意:我在 xcode / swift 中非常绿色。我只是在寻找不是解决方案的指针,除非它自己出现。抱歉,如果我的术语完全偏离基础。

0 投票
0 回答
345 浏览

ios - ModelIO:更改MDLAsset / MDLMesh / MDLSubmesh的材质

我在我的 iPad 应用程序中加载模型作为 MDLAsset 以使用 RealityKit 查看它们。由于我需要更改模型的纹理,因此我目前只需在 RealityKit 中的 ModelEntity 上应用 SimpleMaterial。这很好用,但是因为没有优雅的方法可以将 RealityKit 对象导出为例如 usd 文件。所以我需要将我的更改持久化到 MDLAsset,然后可以轻松导出。

我设法持续更改 MDLAsset 的变换,但没有以任何方式更改材料。

当然,总会有使用 SceneKit 的解决方法,这使得操作模型并将其导出到 MDLAsset 变得容易。但我希望有更直接的方法。

我现在在做什么?

我尝试了许多不同的方法,但大多数归结为:

我还尝试操作现有 subMesh 材质的 MDLMaterialProperties,但似乎材质以某种方式被写保护,至少我没有设法改变它的 baseColor 语义。

那么有没有直接的方法将材质应用到 MDLAsset / MDLMesh / MDLSubmesh ?

0 投票
0 回答
45 浏览

swift - 在模型 I/O 中控制 MDLTexture 格式

MDLMaterial该类中,有一个方法method,用于搜索具有URL 数据loadTextures(using:)的材料类型并为每个类型加载一个。如果您使用例如 MetalKit (the ) 加载一个文件,则 Model I/O 会自动为您填充纹理(如果文件包含此类规范)。MDLMaterialPropertyMDLTextureMDLAssetMTKMeshBufferAllocator

但是,我似乎无法控制这些纹理的像素格式,而且它们似乎是未压缩的。如果可能的话,我想通过模型 I/O压缩这些纹理,因为我目前的计划是使用模型 I/O 加载纹理,MTLTexture从模型 I/O 纹理创建一个,然后将该纹理复制到压缩纹理格式,因为我想压缩所有内容并将我将拥有的许多纹理存储在一个堆中。

如何更改模型 I/O 使用的纹理格式?还是我必须使用 Model I/O 手动解决问题?