Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios ARCamera.projectPoint快速实施_Ios_Swift_Render_Linear Algebra_Arkit - Fatal编程技术网

Ios 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

我正在尝试使用相机中的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,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)
进一步阅读:

  • (关于剪辑空间和投影的一般有用信息)
  • (搜索“透视图分割”)

你非常接近!你在投影中看到的实际上是一个“剪辑空间”位置(注意我固定了矩阵乘法的顺序)。然后需要使用“透视分割”将其转换为“标准化设备坐标”(在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)
进一步阅读:

  • (关于剪辑空间和投影的一般有用信息)
  • (搜索“透视图分割”)