- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 SceneKit
实现增强现实。
我使用 ARuco(OpenCV 增强现实库)通过估计标记的姿态获得了一个内在相机矩阵和一个外在矩阵。
然后我使用内在矩阵(fovy、aspect、zNear、zFar)的参数设置了 SCNCamera
的 projectionTransform
。
通常在OpenGL
中,相对于相机坐标的世界坐标是用ModelView计算的,但在SceneKit中,没有modelView之类的东西。
所以我计算了外部矩阵的逆矩阵以获得相对于世界坐标的相机坐标(标记坐标)。
而且我认为我已经通过包含旋转和平移矩阵的逆矩阵获得了正确的相机位置。
但是我无法从中获取相机的旋转。
你有什么想法吗?
最佳答案
SceneKit 具有与您在 OpenGL 中遇到的相同的 View 矩阵,在您开始使用着色器之前它们只是隐藏了一点。 IMO 有点太隐蔽了。
您似乎已经解决了大部分问题。投影矩阵来自您的相机 projectionTransform
,而 View 矩阵来自相机矩阵的逆矩阵 SCNMatrix4Invert(cameraNode.transform)
。在我的例子中,一切都在世界坐标中,使我的模型矩阵成为一个简单的单位矩阵。
我最终用来获取经典模型- View -投影矩阵的代码类似于...
let projection = camera.projectionTransform()
let view = SCNMatrix4Invert(cameraNode.transform)
let model = SCNMatrix4Identity
let viewProjection = SCNMatrix4Mult(view, projection)
let modelViewProjection = SCNMatrix4Mult(model, viewProjection)
出于某种原因,我发现 SCNMatrix4Mult(...)
接受参数的顺序与我预期的不同(例如,与 GLKMatrix4Multiply(...)
相反) .
我对此还不是 100%,所以欢迎编辑/提示。使用这种方法,我无法获得 SceneKit MVP 矩阵(传递给着色器)以匹配上面代码计算的矩阵......但它已经足够接近我需要的了。
关于ios - 如何将相机外部矩阵转换为 SCNCamera 位置和旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33730468/
我正在尝试以编程方式为我的 MainScene.scn 文件创建相机。 我需要在代码中创建相机,因为我想制作 camera orbit节点,这是我能想到的唯一方法。我还想继续使用我的场景文件。 这是我
我有一个 SCNNode,它有一个名为 pointOfViewNode 的相机 每当我按下一个按钮时,我都会调用功能更新相机,我希望 SCNNode 在其中将其位置更改为聚焦目标,但是当我调用此功能时
我需要关注某个节点,例如金字塔。然后将距离应用于相机,然后根据用户点击移动相机。我的方法是这样的: import SceneKit class GameViewController: UIViewCo
我有一个 SCNNode 和一个 SCNCamera。摄像头位于节点上方和前方,并通过我设置的 SCNLookAtConstraint 俯视节点。然而,当节点横向移动时,相机只会旋转,而不是随之移动。
我有一个场景设置,其中包含围绕对象旋转的 SCNCamera。 限制相机可以围绕物体实现的旋转范围的最佳方法是什么? 示例:我不能围绕整个球体旋转,而是如何将旋转限制在单个半球内? 我的第一个尝试是查
不确定它是否是我的代码,或者我只是遗漏了一些东西。在我的应用程序启动时,就好像使用了位于世界中心的默认相机。如果我双击屏幕,它似乎会跳转到我自己创建的相机。我的理解是只有在场景中没有其他相机时才会使用
我有一个设置了 SCNCamera 和 SCNNode 的 SCNView。 最初看起来像这样: 虽然我希望它看起来像这样: 如何设置它初始处于这样的旋转位置? (SCNNode 的中心位于 View
我想从 SCNCamera 获取摄像头数据,并将摄像头在虚拟 3D 环境中看到的内容作为 Material 渲染到平面上,就像游戏中的安全摄像头一样。在 SceneKit 中有什么方法可以做到这一点,
我正在尝试确定 SCNCamera 不同 Z 深度的世界坐标空间中的宽度。据我了解,Z 值为 0 是近平面,1 是远平面。 同样,我的理解是平截头体是一个顶点在 SCNCamera 处的倒四方金字塔。
我正在尝试使用 SceneKit 实现增强现实。 我使用 ARuco(OpenCV 增强现实库)通过估计标记的姿态获得了一个内在相机矩阵和一个外在矩阵。 然后我使用内在矩阵(fovy、aspect、z
我是来自 2D SpriteKit 的 SceneKit 新手,并试图弄清楚如何调整相机,使其面朝下位于世界顶部。我的位置部分是正确的,但是在旋转时我遇到了困难。如果我调整X,是or Zaxis, n
没有找到问题或答案,所以我自己发布。当我为 SCNView 启用允许相机控制,然后滑动以使相机开始旋转,然后按导航栏中的“后退”按钮时,我的应用程序崩溃了。崩溃堆栈跟踪: * thread #1, q
我在位置 (30,30,30) 有一个 SCNCamera,在位置 (0,0,0) 的对象上有一个 SCNLookAtConstraint。我试图让相机使用 UIPanGestureRecognize
我有一个 SCNCamera 在 iOS 上的 3D SceneKit View 中工作。 当我改变屏幕的方向时,为了保持世界对象相同的大小和相对位置,我需要改变 SCNCamera 的 FoV。 但
我在位置 (30,30,30) 有一个 SCNCamera,在位置 (0,0,0) 的对象上有一个 SCNLookAtConstraint。我试图让相机使用 UIPanGestureRecognize
SCNCamera.wantsHDR 为真。然而,对 SCNCamera.exposureOffset 的任何更改在 iOS13 设备上都不可见。但它在 iOS12 上运行得很好。 if let ca
假设我总共有 3 个节点。其中一个节点是一个大的 SCNShere,我将相机放在这个球体中,并使球体双面带有纹理图像。然后我在这个球体的中心放了两个并排的小球体。我也允许 CameraControl。
我想使用核心运动来控制使用欧拉角的 cameraNode 的 View 。它在初始位置工作,但是当我将 View 更改为向右或向左时。roll 值似乎是错误的。 这是到目前为止的代码...... f
我试图找出 ipad 和 iphone 上场景套件中视野的正确值是多少。 60 度 的默认值对屏幕边缘的球体有不良影响。球体变成椭圆形。 34 degree 的值会导致天空盒像素化。 iPad 和
我试图让我的相机指向并跟随飞船,但我不希望它随着我的飞船旋转而旋转,我该如何实现? 到目前为止的代码: let targetNode = SCNLookAtConstraint(target: shi
我是一名优秀的程序员,十分优秀!