SceneKit:理解SCNNode的pivot属性

2023-11-23

目标是增加 SCNBox 的长度,使其仅在 z 正方向上增长。

这个答案建议玩pivot财产。

然而,该文档的pivotSCNNode页面上属性稀疏,SCNBox页面上没有任何内容。

有人可以解释一下如何pivot物业工作?


改变节点的pivot从概念上讲,与在此节点及其父节点之间插入中间节点相同。这在不同情况下很有用。一个例子是当节点的几何中心不在您期望的位置时。

例如,如果您有一个SCNBox,它的边界框是

  • min: (-0.5 * width, -0.5 * height, -0.5 * length)
  • max: (+0.5 * width, +0.5 * height, +0.5 * length)
  • center: (0.0, 0.0, 0.0)

如果你想要length of the SCNBox只增加正Z轴,那么你想要的是

  • min: (-0.5 * width, -0.5 * height, 0.0)
  • max: (+0.5 * width, +0.5 * height, length)
  • center: (0.0, 0.0, +0.5 * length)

几何体的边界框永远不会改变,但有多种方法可以排列节点并更改其边界框。


方案一:中间节点

处理变换时的一种常见解决方案是使用中间节点来更好地理解变换的应用方式。

在您的情况下,您需要更改节点层次结构

- parentNode
  | - node
  |   * geometry
  |   * transform = SCNMatrix4MakeScale(...)

to

- parentNode
  | - intermediateNode
  |   * transform = SCNMatrix4MakeScale(...)
  |   | - node
  |   |   * geometry
  |   |   * transform = SCNMatrix4MakeTranslation(0, 0, +0.5 * length)

通过这个新的层次结构,边界框的中心node还是(0.0, 0.0, 0.0),但是边界框的中心intermediateNode is (0.0, 0.0, +0.5 * length).

通过缩放intermediateNode代替node你会得到想要的结果。

解决方案 2:枢轴

事实证明,这正是pivot属性的作用是:

node.pivot = SCNMatrix4MakeTranslation(0, 0, -0.5 * length);

一旦你在心里弄清楚了中间节点的变换,只需设置它的inverse to the pivot财产。


您可以找到有关的更多信息pivot这里的财产:https://developer.apple.com/reference/scenekit/scnnode/1408044-pivot

这与 Core Animation 非常相似anchorPoint属性于CALayer,除了在核心动画中锚点被指定为相对于图层的边界框(来自0 to 1作为图层宽度和高度的百分比),而在 SceneKit 中它是绝对的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SceneKit:理解SCNNode的pivot属性 的相关文章

  • 在 iOS 中使用相机检测物体并使用 ARKit 定位 3D 物体

    我在寻找什么 我的要求的简单解释是这样的 使用 ARKit 使用 iPhone 相机检测对象 找到这个物体在这个虚拟空间上的位置 使用 SceneKit 将 3D 对象放置在该虚拟空间上 3D 对象应该位于 标记 一个示例是使用相机检测 3
  • 在 SCNShadable 入口点之间传递值

    在 OpenGL 程序中 您通常会在顶点着色器中声明类似的内容 varying bool aBooleanVariable 然后读取片段着色器中的值 你如何在一个框架内做到这一点 SCNShadable入口点 例如来自SCNShaderMo
  • SceneKit 不会缩放动态主体

    我有一个动态物体的球体 我想对这个球体的比例进行动画处理 使其尺寸增大 let sphere SCNNode geometry SCNSphere radius 1 scene rootNode addChildNode sphere sp
  • 如何在 XCassets 中使用立方体纹理类型

    我正在尝试学习 SceneKit 开发并尝试在后台添加天空盒 为了存储立方体贴图纹理 我发现 XCAssets 有一个类型立方体纹理集 https developer apple com library archive documentat
  • 如何从 .usdz 创建 SCNNode?

    我已经下载了Apple提供的 usdz模型 https developer apple com arkit gallery https developer apple com arkit gallery 但现在 我想使用这些模型之一创建一个
  • simd_float4x4 列

    我想平移平面而不旋转图像 出于某种原因 我的图像正在旋转 var translation matrix identity float4x4 translation colum 0 2 let transform simd mul curre
  • ARKit 中的 ChromaKey 视频

    我正在尝试在 ARKit 中对视频进行色度键控 我所做的与 Felix 在这里所做的非常相似 SKScene 中的 GPUImageView 作为 SKNode 材质 在 ARKit 上播放透明视频 https stackoverflow
  • ARKit:如何通过 hitTest 命中 SCNNode?

    我有几架飞机被 ARKit 检测到并对用户可见 我希望用户能够单击屏幕 以便仅保留他选择的平面 更改其颜色并删除其他平面 我的飞机被添加到 didAddNode 委托方法中 如下所示 Plane plane Plane alloc init
  • 将 .scn 文件从带有纹理的 URL 导入场景

    我正在为我的应用程序使用 ARKit 并尝试从网络服务器动态加载 scn 文件 这是我的代码的一部分 let url URL string http 192 168 0 31 1234 5a27e09cbad20a7a03ad5d80 bo
  • 快速添加按钮到SCNNode

    我正在研究 ARKit 和图像检测 现在我有一个应用程序可以检测图像并将平面放置在屏幕上检测到的对象所在的位置 如何添加可点击的元素 例如飞机上的按钮 我想在每个检测到的对象上都有一个单击事件 这就是我的渲染器函数的样子 func rend
  • 使用 CGMutablePath 创建路径会创建指向错误 CGPoint 的线

    我打算在屏幕上用 2D 箭头显示 AR 对象的信息 所以我用了projectPoint获取物体在屏幕中对应的位置 我有这个函数返回将节点的 3D 位置转换为 2D 并CGPoint显示信息文本 func getPoint sceneView
  • 如何解决 SceneKit double notsupported 错误?

    过去几天我一直在研究 iOS 版 SceneKit 我在尝试创建自定义几何图形时遇到了一个问题 每当我尝试显示几何图形时 它都不会绘制 并在运行时向我显示此错误 SceneKit 错误 C3DRendererContextSetupResi
  • iOS 14 上的 Arkit/SceneKit 抛出新警告(金属)

    自从升级到 iOS14 以来 每当我向场景添加基本节点时 我都会收到金属警告 我不使用任何阴影 只使用标准材质 2020 09 24 18 51 04 548764 0100 Arvie AR 383 7987 Metal Compiler
  • ARImageAnchor 相对于 SCNNode 的方向

    我当前的代码库提供了方向 pitch yaw roll of an ARImageAnchor与世界的关系 我想要实现的是获得ARImageAnchor与启动会话后某个时间添加的节点相关的方向数据 func renderer rendere
  • iOS 11 SceneKit hitTest:选项:失败

    我在 iOS 11 上的 SceneKit 中使用 hitTest options 时遇到了困难 在地图应用程序中 我有一个地形节点 使用 hitTest options 我能够长时间通过触摸屏幕来发现地形上的一个点 它仍然可以在 iOS
  • 如何获取相机相对于其方向的 SCNVector3 位置 ARKit Swift

    我试图在相机前面附加一个对象 但问题是它始终与初始相机方向相关 我如何调整 获取SCNVector3即使相机的方向是向上还是向下 将物体放在前面的位置 我现在就是这样做的 let ballShape SCNSphere radius 0 0
  • 在球体表面SceneKit上写入文本?

    我想知道是否有一种方法可以在 SceneKit 中沿着球体对象的表面写入文本 我知道如果我有图像 我可以在表面上放置纹理并实现这种效果 但我想知道是否可以在球体表面以某种方式动态添加文本 任何想法 EDIT 这有效 let layer CA
  • 在SCNNode中添加CIFilter使节点变成白盒

    我想添加一个CIGaussianBlur to a SCNNode正在 ARKit 中显示 然而 添加该过滤器会将节点变成 白盒 这是没有和有过滤器的节点 No CIFilter With CIFilter 这是相关代码 let gauss
  • 如何在 SceneKit 中将变换矩阵应用于向量

    我在这里错过了什么吗 各种向量 矩阵函数here https developer apple com library prerelease ios documentation SceneKit Reference SceneKit Func
  • 将 3D 对象添加到 ARGeoAnchor

    如果这个问题不太好 请原谅我 我在 Apple 的 ARGeoAnchor 文档中遇到了一些障碍 目前 ARGeoAnchor 仅在 AR 场景视图中显示一个蓝点 我正在尝试显示任何 3D 渲染或对象 My code let coordin

随机推荐

  • 创建 HDF5 文件而不关闭它们时损坏文件 (h5py)

    我正在使用 h5py 将实验数据存储在 HDF5 容器中 在交互式会话中 我使用以下命令打开文件 measurement data h5py File example hdf5 a 然后我使用一些自写函数将数据写入文件 可以是几天实验中的许
  • 如何从 HTML 表单运行 PHP 函数?

    我绝对是网络技术的初学者 我知道我的问题很简单 但我不知道该怎么做 例如我有一个函数 function addNumbers firstNumber secondNumber echo firstNumber secondNumber 我有
  • 在db2中用0填充varchar数字

    有没有办法在 DB2 中存储为 VARCHAR 的数字之前填充 0 像这样 some column result 12 gt 00012 123 gt 00123 6454 gt 06454 如果函数LPAD可用 SELECT LPAD s
  • 生成模拟数据的工具? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我正在寻找一个好的免费工具的建议 用于生成示例数据以加载到测试数据库中
  • JavaScript 中的浮点数 (IEEE 754)

    如果我理解正确的话 JavaScript 数字始终存储为双精度浮点数 遵循国际 IEEE 754 标准 这意味着它使用 52 位作为小数有效数 但在上图中 二进制的 0 57 似乎使用了 54 位 另一件事是 如果我理解正确的话 二进制的
  • Pylons、SQlite 和自动增量字段

    嘿 刚刚开始将 Pylons 与 SQLAlchemy 结合使用 我的模型如下所示 from sqlalchemy import Column from sqlalchemy types import Integer String from
  • 创建表失败,外键约束格式不正确

    create table users id int not null auto increment username varchar 255 NOT NULL password varchar 255 NOT NULL active int
  • 使用 std 类型的 ADL 无法找到运算符

    下面的代码无法编译 namespace A using C std vector
  • 更改关联时是否必须手动设置外键属性?

    我正在从 Linq to SQL 迁移到实体框架 4 4 使用 Database First 和 DbContext 我想知道以下行为是否正常 using var e new AgendaEntities var store e Store
  • iOS 4.2.1 开发 SDK 中缺少 libXcodeDebuggerSupport.dylib

    注意 在 Xcode 4 3 2 上得到这个吗 查看答案这个问题 注意 创建符号链接来使用 4 2 库似乎工作正常 cd Developer Platforms iPhoneOS platform DeviceSupport 4 2 1 8
  • Python:如何将数字向下舍入到下一个 1000

    在Python中 有一个内置函数round 它对数字进行四舍五入 如下所示 round 1900 3 2000 是否有一个内置函数可以将数字向下舍入 如下所示 function 1900 3 1000 您可以使用楼层划分 def round
  • 函数和/或类的包可访问性

    在Java中 他们有包访问说明符 它使得该函数只能由来自同一个 包 命名空间 的类使用 我看到了它的好处 尤其是当模型设计发挥作用时 你认为这样的东西在 C 中有用吗 Thanks 正如其他人指出的那样 通常的方法只是按照惯例 但是 C 确
  • PHP 解析/语法错误;以及如何解决它们

    每个人都会遇到语法错误 即使是经验丰富的程序员也会犯错 对于新人来说 这只是学习过程的一部分 但是 通常很容易解释错误消息 例如 PHP 解析错误 语法错误 index php 第 20 行出现意外的 意想不到的符号并不总是真正的罪魁祸首
  • 如何在javascript下划线模板中转义<>?

    使用下划线模板时 我想在锚点的 href 属性中插入一个值 例如 a href class products underscore template in jade 但输出是 a href class products 那么如何转义 符号
  • Play Framework:PersistenceException:该类型不是已注册的实体? (伊豆)

    我正在遵循 Java 的 Play Framework 2 0 教程 并在尝试保存 ebean 模型时收到此错误 task save PersistenceException 类型 class models Task 不是 注册实体 如果您
  • 在 R 中如何获取英文错误消息

    我正在尝试一些关于生物导体的教程 但我收到错误消息 我想搜索 提交 不幸的是 由于 R 安装在以法语配置的系统上 因此 R 以法语返回给我消息 我怎么可能有这些英文信息 我的系统 Ubuntu 10 04 运行 gnome 3 R版本是最后
  • 为什么大多数浏览器上的预检请求中不包含 TLS 客户端证书?

    我正在构建的网络应用程序遇到问题 该 Web 应用程序由 Angular 4 前端和 dotnet core RESTful API 后端组成 需求之一是对后端的请求需要使用SSL相互认证进行认证 即客户端证书 目前 我将前端和后端托管为
  • 使用用户通过实体框架提供的 XPath 查询 SQL Server xml 列

    我很难弄清楚如何在 SQL Server 中使用 xml 数据列 特别是与实体框架一起使用 基本上 我们的一个表存储用户以 XML 形式提供的 自定义元数据 因此将其存储在表中的 Xml 列中似乎是明智的 然而 我们应用程序的要求之一是支持
  • WCF 自托管应用程序可以使用 app.config 自动创建 ServiceHost 吗?

    当我创建自托管 wcf 应用程序时 我为要公开的每个服务创建 ServiceHost 对象 然后它会在 app config 中查找 匹配服务器名称 然后提取关联的端点地址和合约 有没有办法为 app config 中列出的每个服务自动创建
  • SceneKit:理解SCNNode的pivot属性

    目标是增加 SCNBox 的长度 使其仅在 z 正方向上增长 这个答案建议玩pivot财产 然而 该文档的pivotSCNNode页面上属性稀疏 SCNBox页面上没有任何内容 有人可以解释一下如何pivot物业工作 改变节点的pivot从