如何在 SceneKit 中的“自己”轴上移动旋转的 SCNNode?

2023-11-26

下图显示了一个旋转框,应在 X 轴和 Z 轴上水平移动。 Y 应该不受影响,以简化场景。这个盒子也可能是相机的 SCNNode,所以我想此时投影没有意义。

假设我们想要沿着红色箭头的方向移动盒子。如何使用 SceneKit 来实现这一点?

红色箭头表示盒子的-Z 方向。它还向我们表明它与相机的投影或显示为网格的深灰色线的全局轴不平行。

我的最后一种方法是平移矩阵和旋转矩阵的乘积,从而产生新的变换矩阵。那么我是否必须将当前的变换添加到新的变换中?

If yes,其中是用于添加矩阵的 SceneKit 函数,例如SCNMatrix4Mult用于乘法还是我必须自己使用 Metal 编写它?

If no,我在矩阵计算中遗漏了什么?

我不想利用GLKit.

enter image description here


所以我的理解是你想沿着它的方向移动盒子节点自己的X轴(不是它的父母 X 轴)。并且由于 Box Node 是旋转的,因此它的 X 轴与其父级的 X 轴不对齐,因此在两个坐标系之间转换平移时会遇到问题。

节点层次结构是

parentNode
    |
    |----boxNode // rotated around Y (vertical) axis

使用变换矩阵

移动 boxNodeits own X axis

// First let's get the current boxNode transformation matrix
SCNMatrix4 boxTransform = boxNode.transform;

// Let's make a new matrix for translation +2 along X axis
SCNMatrix4 xTranslation = SCNMatrix4MakeTranslation(2, 0, 0);

// Combine the two matrices, THE ORDER MATTERS !
// if you swap the parameters you will move it in parent's coord system
SCNMatrix4 newTransform = SCNMatrix4Mult(xTranslation, boxTransform);

// Allply the newly generated transform
boxNode.transform = newTransform;

请注意:矩阵相乘时顺序很重要

另外一个选择:

使用SCNNode坐标转换函数,对我来说看起来更直接

// Get the boxNode current position in parent's coord system
SCNVector3 positionInParent = boxNode.position;

// Convert that coordinate to boxNode's own coord system
SCNVector3 positionInSelf = [boxNode convertPosition:positionInParent fromNode:parentNode];

// Translate along own X axis by +2 points
positionInSelf = SCNVector3Make(positionInSelf.x + 2,
                                positionInSelf.y,
                                positionInSelf.z);

// Convert that back to parent's coord system
positionInParent = [parentNode convertPosition: positionInSelf fromNode:boxNode];

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

如何在 SceneKit 中的“自己”轴上移动旋转的 SCNNode? 的相关文章

  • 更新:随机将行添加到矩阵中,但遵循严格的规则

    以下是一个更大的矩阵的一部分 0 1 0000 1 0000 77 0000 100 0000 0 0 2500 0 1 0000 1 0000 72 0000 100 0000 0 2500 0 2500 0 1 0000 1 0000
  • Swift - 预期 '{' 启动 setter 定义

    我正在关注高级 swift WWDC 2014 视频 使用类上的下标来委托给类属性 但使用与视频中相同的语法时出现错误 enum Direction case North South East West class Place Thing
  • 具有默认值的不可失败枚举初始值设定项

    有没有办法在初始化时定义枚举rawValue会默认为某个值而不是失败吗 在值可能出乎意料的情况下很有用 即服务器 API 错误 你的意思是这样的吗 enum ErrorCode Int case NoErr 0 Err1 Err2 Last
  • 在 macOS 上通过 Apache 本地运行 Xcode DocC 文档

    Xcode 13 的 DocC 文档档案可以使用自定义 Apache 托管 htaccess文件中描述的向外部开发人员分发文档 https developer apple com documentation xcode distributi
  • 如何在 UITableViewCell 上使用自定义初始值设定项?

    我有一个自定义 UITableViewCell 我想在我的表视图中使用它 这是我的单元格代码 class ReflectionCell UITableViewCell IBOutlet weak var header UILabel IBO
  • AudioPlayer 和锁屏/控制中心控制 Swift [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我是斯威夫特的新手 我写信是因为我想问一个问题 我和我的朋友正在开发一个音频播放器 但我们遇到了问题 播放器还可以在后台
  • 如何创建具有不同“产品模块名称”和“产品名称”的项目并将其模块导入另一个项目?

    我尝试执行问题中描述的任务但失败了 重现步骤 Create new workspace WS Create new Cocoa Touch Framework set Product Name Product in Choose optio
  • 导航栏隐藏在 SwiftUI 中不起作用

    我有三观 我想隐藏第三个视图中的导航栏 即使我给 navigationBarHidden true 导航栏正在显示 我找不到我哪里做错了 我已在下面附上我的代码和生成的屏幕截图 Xcode 版本 11 1 struct ContentVie
  • Swift 和 inout 参数中闭包的变量捕获

    我注意到 当 Swift 中的闭包捕获变量时 闭包实际上可以修改该值 这对我来说似乎很疯狂 也是一种获得可怕错误的绝佳方法 特别是当同一个 var 被多个闭包捕获时 var capture Hello captured func g thi
  • 在 iOS Swift 2 中实现“阅读更多”按钮以展开 UITextView 的最简单方法?

    我希望实现一个 阅读更多 按钮 该按钮将扩展 UITextView 以便有人可以根据需要阅读整个文本 我还没有找到一种简单的方法来实现这一目标 我尝试 玩弄 容器的高度 但它没有给我想要的结果 我真的很感激任何想法 我会推荐你 ilyapu
  • 快速检查网络速度

    我想从我的 swift 应用程序检查网络速度 我发现很多帖子描述了Reachability特别是查找连接是否可达以及是 WIFI 连接还是 WWAN 连接的方法 我的问题 是否可以检测 WWAN 的类型 2G 3G 4G 你可以用以下命令检
  • 我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?

    在我的项目中 我将所有私有 swift 2 3 文件迁移到 swift 3 我想使用用 swift 2 3 编写的遗留框架 直到它们有 swift 3 版本 我尝试添加 使用旧版 Swift 版本 是 清除 构建我的项目 但我仍然遇到一些麻
  • SpriteKit - 对多个 SKNode 上运行的多个 SKAction 进行排序

    我非常了解 SKAction API 但在多个节点上运行顺序代码时我无法获得良好的代码 这是示例代码 简化 import SpriteKit class GameScene SKScene weak var node1 SKNode wea
  • Swift UI 导出画布内容

    我有一个画布 用户可以在上面画东西 我想导出用户在画布上绘制的任何内容 并且我正在使用以下扩展从视图中获取图像 extension View func snapshot gt UIImage let controller UIHosting
  • C++ std::vector 搜索值

    我正在尝试优化std vector 搜索 基于索引的迭代向量并返回与 搜索 条件匹配的元素 struct myObj int id char value std vector
  • Swift 中的 @autoreleasepool 相当于什么?

    在 Swift 中 我注意到没有 autoreleasepool 构造 尽管 Swift 确实使用了 ARC 在 Swift 中管理自动释放池的正确方法是什么 或者它是否因某种原因被删除 语法如下 autoreleasepool code
  • Xcode 11 - 在 Catalyst Swift 中禁用调整大小模式

    We are 将我们基于 Swift 的 iOS 应用程序转换为 Mac兼容使用Catalyst在 Xcode 11 中 当用户使用时 我们在 UI 中面临一个问题resize应用程序窗口 那么我们可以禁用调整大小模式并为应用程序窗口提供修
  • 解析迁移到 mLabs 和 Heroku 的错误

    我至少一年前将解析数据库迁移到 Mlabs 从那时起我就一直在开发该应用程序 解析仪表板表示我已成功迁移 Mlab 和 Parse 都收到了数据库的更新 然而 在过去一两周内 该应用程序不再经过登录页面 没有调整代码 这是服务器问题 以下是
  • 重新组织链式可观察量

    我有一大块链接的 Rx 可观察量 当通过选择表视图行时会触发这些可观察量table rx modelSelected 我希望能够打破这个逻辑 因为我目前必须在flatMapLatest 因为这是流程的 第一步 感觉不对 我必须在后续执行更多
  • Swift 错误:发出 SIGABRT 信号如何解决

    我只是 Swift 编码的初学者 我的想法很简单 就是一个有两个按钮的应用程序 单击时 文本字段将更改其文本 在 Main StoryBoard 中 我添加一个文本字段和两个按钮 在 ViewController swift 文件中 我这样

随机推荐

  • WPF中如何实现双向数据绑定?

    我听说过很多有关 WPF 中双向绑定的内容 但我并不完全清楚如何实现它或它的实际含义 我有一个ListView里面有一堆物品 当用户选择一个新项目时 TextBox应用程序中将更改其文本以显示所选项目的某些属性 但是当用户更改文本框中的文本
  • batchUpdate 调用如何计入使用限制?

    打电话就像spreadsheets batchUpdate and spreadsheets values batchUpdate可以在一次调用中执行多个更新操作 我读到了关于 google Sheets api 使用限制的信息https
  • 是否可以在 Visual Studio 中以编程方式清除输出窗口?

    您知道如何添加一些代码吗 调试期间 以编程方式清除输出窗口在视觉工作室中 或者您知道一些快速的替代方案 例如快捷键 Macro Sub ClearOutputWindow DTE ExecuteCommand Edit ClearOutpu
  • 如何根据用户滚动加载网页内容

    如何在用户滚动网页时加载内容 如何实施 一般来说 您需要有某种像这样的结构 first page of content first page of content first page of content first page of co
  • 为什么 NumPy int 不是 Python int 的实例,但 NumPy float 是 Python float 的实例?

    考虑以下 gt gt gt import numbers gt gt gt import numpy gt gt gt a numpy int 0 gt gt gt isinstance a int False gt gt gt isins
  • 如何使用 Android 导航组件将值传递回先前的片段目的地?

    让 sat 我有一些这样的目的地 从片段A gt 到片段B gt 到片段C 我可以使用安全参数将数据从片段 A 传递到片段 B 也可以使用安全参数从片段 B 传递到片段 C 如果我想将片段 C 中生成的字符串带回片段 B 或片段 A 该怎么
  • Java 8 重复键的流总和条目

    我使用 Java 8 流按某个键对条目列表进行分组 然后按日期对组进行排序 此外 我想做的是 折叠 组中具有相同日期的任何两个条目并将它们相加 我有一个这样的课程 出于示例目的而被精简 class Thing private String
  • xcode 多合一布局:在项目和调试页面之间切换的键盘快捷键?

    当您将 xcode 配置为使用 All in one 布局时 会出现一个切换开关 允许您在项目和调试 模式 之间切换 IDE 调用这些页面 是否有键盘快捷键可以执行切换 Project Cmd 0 zero Build Cmd Shift
  • 我可以同时安装 Ruby on Rails 2.x 和 Ruby on Rails 3

    我有一个 Ubuntu Rails 环境来使用 ROR 现在我正在运行 Rails 2 3 8 我想研究一下 Rails 3 是否可以并行运行两个开发环境 如果没有 如何清理 Rails 2 x 系统以安装 Rails 3 或者我需要安装一
  • 在 SQL Server 中保存日期

    我有一个遗留应用程序 其中输入是日期字符串 即 2009年6月12日 输入的格式始终是字符串 并且是一致的 始终是 dd mm yyyy 目前 遗留应用程序只是将其插入日期时间字段中 显然 如果服务器的本地化文化设置发生变化 我们有一个错误
  • 使用Git显示所有一级后代分支

    如何获取当前 HEAD 的一级后代分支的列表 我可以通过以下方式获取整棵树的列表 git log graph abbrev commit pretty decorate branches 这使 2eff4a7 refs heads issu
  • 为WPF中的所有元素事件添加监听器

    我想在一次调用中挂钩所有可用的元素事件 像这样的事情 elem AddHandler AnyRoutedEvent RoutedEventHandler handler 我怎样才能做到这一点 尝试此操作以获取按钮类型上的所有事件 您可以替换
  • Android:Process.myTid() VS Thread.currentThread().getId()

    我有简单的Activity那个叫AsyncTask 所以我打印一些关于Proces and Thread From onCreate android os Process myUid 10137 From onCreate android
  • PHP 连接到 firebase 是如何工作的?

    如果您有时间阅读firebase php文档 您可以看到如何使用帮助程序库 连接 到firebase 但不幸的是 我认为连接只能由 phpunit 建立 换句话说 输出只能在终端中看到 因为当你在浏览器中运行 php 页面时 它会返回致命错
  • AttributeError:模块“socket”没有属性“AF_PACKET”

    我正在使用 Python 构建一个数据包嗅探程序 但是我遇到了障碍 由于某种原因 我认为套接字没有正确导入 因为我的程序运行时收到以下消息 AttributeError module socket has no attribute AF P
  • 为什么 css "all: unset" 在 MacOS 的 Safari 浏览器中工作得很奇怪?

    所以基本上我做了这种情况 父级有cssall unset 然后我注意到当我使用 Safari 版本12 1 1 14607 2 6 1 1 它的所有子颜色只能受到以下影响 块 甚至不是内联或 important 但只有color行为方式就是
  • “迁移 Django 应用程序”是什么意思?

    我一直在思考很多的意义migrating a Django app在过去的几天里 听说了如何迁移 Django 应用程序南姜戈 也许只是缺乏足够的英语技能 因为英语不是我的母语 或者这是你在程序员生活中遇到的事情之一 这些事情非常简单 需要
  • 如何获取ListView项目的视图?

    我有两个 ListView A 和 B 其中包含相同类型的项目 我创建的类 当我单击 A 中的某个项目时 它会将该对象添加到 B 上 如果我再次单击 则会将其删除 只是当选择一个项目时 我使用 view setBackgroundColor
  • 如何使用 JQuery 更改 onClick 复选框的值?

    在这里 我尝试在单击以下复选框时更改其值 在下面的代码中 我尝试将复选框的值更改为 1 并在未选中时将值更改为 0 但它只需要 false 条件 当取消选中该复选框时 值会更改为 0 但选中时 它不会更改为 1 有什么建议如何解决此问题吗
  • 如何在 SceneKit 中的“自己”轴上移动旋转的 SCNNode?

    下图显示了一个旋转框 应在 X 轴和 Z 轴上水平移动 Y 应该不受影响 以简化场景 这个盒子也可能是相机的 SCNNode 所以我想此时投影没有意义 假设我们想要沿着红色箭头的方向移动盒子 如何使用 SceneKit 来实现这一点 红色箭