Ios ARCamera.projectPoint快速实施
我正在尝试使用相机中的projectionMatrix和viewMatrix实现ARCamera.projectPoint函数 要创建如下内容:Ios ARCamera.projectPoint快速实施,ios,swift,render,linear-algebra,arkit,Ios,Swift,Render,Linear Algebra,Arkit,我正在尝试使用相机中的projectionMatrix和viewMatrix实现ARCamera.projectPoint函数 要创建如下内容: let position=simd_float3(x:1,y:2,z:3) 设位置4=simd_float4(x:position.x,y:position.y,z:position.z,w:1) 让projectionMatrix=frame.camera.projectionMatrix(适用于:.landscapeRight,viewportSi
let position=simd_float3(x:1,y:2,z:3)
设位置4=simd_float4(x:position.x,y:position.y,z:position.z,w:1)
让projectionMatrix=frame.camera.projectionMatrix(适用于:.landscapeRight,viewportSize:frame.camera.imageResolution,zNear:0.001,zFar:1000.0)
让viewMatrix=frame.camera.viewMatrix(用于:.landscapeRight)
设投影=位置4*投影矩阵*视图矩阵
让arkitProjection=frame.camera.projectPoint(位置、方向:.landscapeRight,视口大小:frame.camera.imageResolution)
断言(projection.x==Float(arkitProjection.x))
断言(projection.y==Float(arkitProjection.y))
但我不知道如何正确地实施它。希望能得到你的帮助。你离得很近!你在投影中看到的实际上是一个“剪辑空间”位置(注意我固定了矩阵乘法的顺序)。然后需要使用“透视分割”将其转换为“标准化设备坐标”(在xyz维度中坐标从-1到+1)。最后,您需要根据图像大小将其线性映射到图像中的位置
let position=simd_float3(x:1,y:2,z:3)
设位置4=simd_float4(x:position.x,y:position.y,z:position.z,w:1)
让projectionMatrix=frame.camera.projectionMatrix(适用于:.landscapeRight,viewportSize:frame.camera.imageResolution,zNear:0.001,zFar:1000.0)
让viewMatrix=frame.camera.viewMatrix(用于:.landscapeRight)
设clipSpacePosition=projectionMatrix*viewMatrix*position4
让normalizedDeviceCoordinate=clipSpacePosition/clipSpacePosition.w
设投影=点(
x:(CGFloat(normalizedDeviceCoordinate.x)+1)*(frame.camera.imageResolution.width/CGFloat(2)),
y:(-CGFloat(normalizedDeviceCoordinate.y)+1))*(frame.camera.imageResolution.height/CGFloat(2))
)
让arkitProjection=frame.camera.projectPoint(位置、方向:.landscapeRight,视口大小:frame.camera.imageResolution)
断言(abs(projection.x-arkitProjection.x)<0.01)
断言(abs(projection.y-arkitProjection.y)<0.01)
进一步阅读:
- (关于剪辑空间和投影的一般有用信息)
- (搜索“透视图分割”)
let position=simd_float3(x:1,y:2,z:3)
设位置4=simd_float4(x:position.x,y:position.y,z:position.z,w:1)
让projectionMatrix=frame.camera.projectionMatrix(适用于:.landscapeRight,viewportSize:frame.camera.imageResolution,zNear:0.001,zFar:1000.0)
让viewMatrix=frame.camera.viewMatrix(用于:.landscapeRight)
设clipSpacePosition=projectionMatrix*viewMatrix*position4
让normalizedDeviceCoordinate=clipSpacePosition/clipSpacePosition.w
设投影=点(
x:(CGFloat(normalizedDeviceCoordinate.x)+1)*(frame.camera.imageResolution.width/CGFloat(2)),
y:(-CGFloat(normalizedDeviceCoordinate.y)+1))*(frame.camera.imageResolution.height/CGFloat(2))
)
让arkitProjection=frame.camera.projectPoint(位置、方向:.landscapeRight,视口大小:frame.camera.imageResolution)
断言(abs(projection.x-arkitProjection.x)<0.01)
断言(abs(projection.y-arkitProjection.y)<0.01)
进一步阅读:
- (关于剪辑空间和投影的一般有用信息)
- (搜索“透视图分割”)