首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ARCamera.projectPoint的快速实现

ARCamera.projectPoint的快速实现
EN

Stack Overflow用户
提问于 2019-11-26 10:44:18
回答 1查看 656关注 0票数 2

我正在尝试使用相机上的ARCamera.projectPoint和viewMatrix实现一个projectionMatrix函数。

要创建这样的东西:

代码语言:javascript
复制
let position = simd_float3(x: 1, y: 2, z: 3)
let position4 = simd_float4(x: position.x, y: position.y, z: position.z, w: 1)

let projectionMatrix = frame.camera.projectionMatrix(for: .landscapeRight, viewportSize: frame.camera.imageResolution, zNear: 0.001, zFar: 1000.0)
let viewMatrix = frame.camera.viewMatrix(for: .landscapeRight)

let projection = position4 * projectionMatrix * viewMatrix
let arkitProjection = frame.camera.projectPoint(position, orientation: .landscapeRight, viewportSize: frame.camera.imageResolution)

assert(projection.x == Float(arkitProjection.x))
assert(projection.y == Float(arkitProjection.y))

但我不知道如何正确地实现它。希望你能帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-16 22:50:34

你离我很近!在projection中,实际上是一个“剪辑空间”位置(也注意到我固定了矩阵乘法的顺序)。然后,您需要使用“透视划分”将其转换为“规范化设备坐标”(在xyz维度中具有从-1到+1的坐标)。最后,您需要根据图像大小将其线性映射到图像中的位置。

代码语言:javascript
复制
let position = simd_float3(x: 1, y: 2, z: 3)
let position4 = simd_float4(x: position.x, y: position.y, z: position.z, w: 1)

let projectionMatrix = frame.camera.projectionMatrix(for: .landscapeRight, viewportSize: frame.camera.imageResolution, zNear: 0.001, zFar: 1000.0)
let viewMatrix = frame.camera.viewMatrix(for: .landscapeRight)

let clipSpacePosition = projectionMatrix * viewMatrix * position4
let normalizedDeviceCoordinate = clipSpacePosition / clipSpacePosition.w
let projection = CGPoint(
    x: (CGFloat(normalizedDeviceCoordinate.x) + 1) * (frame.camera.imageResolution.width / CGFloat(2)),
    y: ((-CGFloat(normalizedDeviceCoordinate.y) + 1)) * (frame.camera.imageResolution.height / CGFloat(2))
)

let arkitProjection = frame.camera.projectPoint(position, orientation: .landscapeRight, viewportSize: frame.camera.imageResolution)

assert(abs(projection.x - arkitProjection.x) < 0.01)
assert(abs(projection.y - arkitProjection.y) < 0.01)

进一步读:

”)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59049128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档