天天看点

AnglesToConfigAngleToConfig

AngleToConfig

该文章英文地址,翻译中有一些个人添加的辅助信息,以括号标识,以粗体表示,例如(以下为个人翻译,水平有限,欢迎指正).

AnglesToConfig的源代码可以在distortionizer代码仓库里找到.这个程序获取从视角到物理屏幕位置的映射关系,然后生成一个osvr server 的配置文件,以及将要被渲染到的规则屏幕的描述,最终对显示进行反畸变,

这个程序的背后操作原理可以见这里

步骤1:确定角度到屏幕的映射

生成一个带有条目的空格分割文件,每行有四个条目,文件中不包含标题.这四列条目表示:

(1)从向前注视的方向上看水平的角度(角度的正方向向右),单位为度.

(2)从向前注视的方向上看垂直的角度(角度的正方向向上),单位为度.

(3)屏幕上向前注视的点的距离,向右为正,单位为米(或则通过命令行参数指定为毫米).

(4)屏幕上向前注视的点的距离,向上为正,单位为米(或则通过命令行参数指定为毫米).

示例文件的前几行如下:

- - - -
- - - -
- - - -
- - - -
           

上面所说的”向前注视的方向”是从眼睛向前的方向,就像眼睛注视前方无限远的物体.”向前注视的点”是在向前注视方向上看时,在眼睛中央凹的中心处(这个凹处是眼睛视网膜上的一个位置)看到的显示屏的位置.除非屏幕的边缘通过命令行参数指定,程序将使用文件中指定的X和Y值范围来确定屏幕尺寸和屏幕内前视点的位置.

注意:指定屏幕坐标和屏幕边界的空间不一定是毫米或米,但是它们必须使用相同的单位.它们被标准化,以便找到相对于命令行参数指定的屏幕边角的文件内坐标所对应的位置.如果没有使用命令行参数来指定,那么中间中的任何一致的间距(像素,米,毫米)都是可以的.因为命令行参数假设与屏幕中的值是相同的(都是以米为单位),所以使用像素坐标所需的全部参数是在文件中指定这些参数,并将其指定为-screen参数,并且不在命令行参数指定”-mm”选项.文件和命令行参数的值需要在同一个空间中定义(这在技术上来说是对程序进行欺骗,告诉他单位都是米,但是镇规划能够解决这个问题).(个人感觉这里意思是:总之这些坐标的单位要统一,最省事的是全部指定为米)

注意:这些角度是指视野角度,不同于纬度/经度.每个标定值是从原点倾斜到通过指定店的平面的夹角.经度点是指YZ平面向X轴倾斜角度(正方向是指X轴的正方向),纬度点是指XZ平面向Y轴倾斜角度(正方向指向Y轴的正方向).程序的早起版本使用经/纬球面坐标来确定点,这会导致在垂直方向上产生额外的畸变.

注意:红色,绿色和蓝色可以有一个单独的文件,来进行色散畸变矫正.或则单独使用一个文件来对所有颜色进行相同的畸变矫正.

步骤2:计算非机构性畸变网格和规则屏幕

AnglesToConfig读取未排序的映射表,这个映射表是指从角度到物理显示屏上的位置的映射,并生成一个畸变映射和规则屏幕描述信息写入到配置文件中,供osvr server使用.这个程序作为一个过滤器,从标准输入中读取表格,写入到最终输出的JSON格式的配置文件当中.它可以不带任何命令行参数运行,也可以带一些可选的参数:

  • –screen screen_left_meters screen_bottom_meters screen_right_meters screen_top_meters:允许你指定屏幕的实际边界,以防在实际边界上没有记录点.这些参数指定四个值,单位为米:相对于前向注视点的屏幕的左,下,上,右四个角.默认情况下是通过找到文件中X和Y最大/最小值来判断的(比如左下角是,X,Y最小值,左上角是,X最小值,Y最大值……).
  • -mm:指定文件中屏幕位置条目的单位为毫米.-screen参数指定的单位仍然为米.默认为米.
  • -eye right|left:指定哪一个眼睛,参数是left或right.默认是right.
  • -depth_meters D:指定屏幕焦点深度.焦点距离越大,可以减少IPD变化带来的影响.注意,畸变依赖于IPD.默认值为2米.
  • -latlong:指定的角度是经度和纬度,而不是视野角度.默认值是视野角度.
  • -verify_angles xx xy yx yy max_degrees:测试每一个网格点,当转换到屏幕空间时,确保在角度空间里相邻的两个点的矢量之间不超过max_degree.转换规定:屏幕上的矢量(xx,xy)点的经度正方向是右(原文是左,后来跟这个项目的作者确认确实是写错了,已经提交和修改,见issue 26),屏幕上的矢量(yx,yy)点的纬度正方向是上.
  • -mono infile:指定一个文件名作为标准输入,生成单色畸变功能的配置文件.
  • -rgb redfile greedfile bluefile:需要三个文件名参数,每个参数为红色,绿色和蓝色.

OSVR HDK 1.3例子:基于OSVR HDK1.3版本的透镜上,不同眼睛位置下生成的一系列单色的模拟值.你可以在这里找到这些参数表.右眼对应显示屏的X轴的范围从-32到28.48,Y轴的范围是-34.02到34.02,单位毫米.注意:在这种情况下模拟区域沿着鼻子方向穿过屏幕的边缘.当程序运行时,要生成网格中之外的点的时候会提示警告,并打印出来.Note:在模拟环境中的不符合规范的点是需要剔除的,我们需要使用-verify_angles 选项来移除他们.支持这个文件的命令行是:

AnglesToConfig -mm -screen - -   -mono _mm_Eye_Relief_trimmed.txt -verify_angles      > HDK13_11mm_client.json
           

OSVR HDK 变种例子:如果有一个HMD使用与HDK1.3一样的透镜.它的屏幕是72mm高,64.8mm宽.镜头与鼻子的距离是2.2mm.右眼对应显示屏X轴的范围是-30.2到34.6,Y轴对应的范围是从-36到36,单位毫米.这里的透镜偏移与HDK1.3设计的偏移方向相反.对于这种情况,我们可以重新运行上面HDK1.3的例子,修改一下不同的参数,内容如下:

AnglesToConfig -mm -screen - -   –mono _mm_Eye_Relief_trimmed.txt -verify_angles      > HDKvar_11mm_client.json
           

RGB示例:一个圆形显示上做一个模拟运行,生成三个原色输出文件,右眼显示X轴从-40到75度,Y轴从-65到65度.不同颜色对应的范围以毫米为单位,X轴上范围为-27.3到73.3,Y轴为-33.4到33.4.这意味着被模拟覆盖的屏幕的X轴的尺寸比实际屏幕尺寸小.实际的屏幕尺寸在X轴上为120.96mm,Y轴为68.04mm.注意:在这种情况下,模拟区域在鼻子方向上穿过屏幕边缘.当这个程序运行时生成网格范围之外的点时,将打印出警告信息.Y轴区域在向前注视点的方向上是对称的,屏幕范围从-34.02到34.02毫米.向前注视点的X位置在从屏幕左边开始的25.34mm的位置.这意味着屏幕的左边缘实际上是-25.34mm,有边沿是95.62mm(120.96-25.34).支持这个文件的命令是(这里将会产生一个警告信息):

步骤3:构建配置文件

主配置文件:AnglesToConfig打印出一个Json格式的文件,它是所有配置文件中的一个子集,这些配置文件会被发送到osvr server里,以支持正确的渲染内容显示在显示屏上.

应该基于步骤2中生成的out.json文件中的信息来修改示例文件的几个部分.field_of_view和eyes部分应该修改他们的数据为匹配的数据(新的部分可以赋值粘贴到这个文件中,覆盖哪些部分).

畸变校正:从OSVR0.6版本开始,配置文件的大小收到网络传输单元大小的限制.所以文件的畸变部分不能够直接赋值到主配置文件中.而是将它保存在out.json文件(它可以被重命名或移动),主配置文件需要修改节点来指向它.如果文件被移动到”C:/OSVR/Distrotion_client.json”,那么一下部分将描述在客户端上:

"distortion": {
    "type": "mono_point_samples",
    "mono_point_samples_external_file": "C:/OSVR/Distortion_client.json"
},
           

对于RGB配置文件,如下:

"distortion": {
    "type": "rgb_point_samples",
    "rgb_point_samples_external_file": "C:/OSVR/Distortion_client.json"
},
           

这些可以复制-粘贴到主配置文件当中.

定位显示:显示配置的分辨率字段的宽和高,需要与显示的横屏模式相匹配,通常是1920x1080.

实际显示屏的方向确定了在主配置文件中的renderManagerConfig部分的display字段里的rotation域的值(renderManager.direct.portrait.json文件—display—rotation).如果显示屏是横屏模式,则设置为0.如果是竖屏模式(这种方式扫描某些显示器的速度较快),则该值设置为90.

在配置文件中,renderManagerConfig部分的window字段里的xPosition和yPosition域来描述屏在MicrosoftWindows显示布局中的位置.默认文件设置了显示屏的左上角位置(即X轴偏移1920的地方,这个1920是主显示器的X轴分辨率).右侧显示屏的左上角则位于左侧显示屏的右端(是1920还是1080,要根据rotation的值).在Windows里的显示位置需要按照这种方式来配置.

步骤4:运行程序来使用这些配置文件

用于畸变矫正的配置文件,可以拷贝到例如C:/OSVR的文件夹里,并且编辑主配置文件里的相应字段,来使用这个配置文件,”osvr server”运行如下命令行参数:

osvr_server.exe C:/OSVR/Distortion_server.json
           

任何一个基于RenderManager的OSVR客户端程序都可以运行,它将从server上获取到配置信息,从不endif的Distortion_client.json文件读取畸变矫正信息.