理解eye.getEyeView()和eye.getPerspective矩阵

时间:2017-02-04 12:49:17

标签: matrix google-cardboard google-vr daydream google-vr-sdk

我理解Eye.getEyeView和Eye.getPerspective矩阵的作用,至少根据the documentation。第一个取得相机的位置并将其转换到当前眼睛的位置。这考虑了头部跟踪和每个瞳孔的偏移。第二个只是给出了一个透视投影矩阵,这并不取决于头部跟踪,而只取决于每只眼睛的视野。

我不明白的是每只眼睛的视野之间的差异。我们的眼睛大致面向前方,它们应该是一样的吗?那么矩阵实际上是相当不同的。让我们来看看,这些是使用SDK中TreasureHunt示例的变体记录在onDrawEye方法中的:

左眼观察矩阵:

 0.99938333   &  0.013064715  & 0.03259317   & 0.0 \\
-0.022139862  &  0.95490175   & 0.2960955    & 0.0 \\
-0.02725487   & -0.2966345    & 0.9546021    & 0.0 \\ 
 0.03028951   & -0.0033823675 & 0.10220718   & 1.0 

右眼观察矩阵:

  0.99938333  &  0.013064715   & 0.03259317 & 0.0 \\
 -0.022139862 &  0.95490175    & 0.2960955  & 0.0 \\
 -0.02725487  & -0.2966345     & 0.9546021  & 0.0 \\
 -0.03361049  & -0.0033823675  & 0.10220718 & 1.0 

除了a_ {41}之外,它们是相同的,相差约0.064。单位是米,我想这是学生之间的距离?我可以看出为什么3x3方向矩阵是相同的。但我无法理解为什么第四行上的其他两个变化值a_ {42}和a_ {43}不同。只有一个轴的眼睛位置不同!对于每一帧来说,这并非偶然。

现在让我们检查一下透视矩阵:

左视角矩阵:

 0.8990804   &  0.0        &  0.0       &  0.0 \\ 
 0.0         &  0.762166   &  0.0       &  0.0 \\
 0.106264874 &  0.08848558 & -1.00002   & -1.0 \\
 0.0         &  0.0        & -0.0200002 &  0.0

右视角矩阵:

  0.89908034 & 0.0        &  0.0       &  0.0 \\ 
  0.0        & 0.762166   &  0.0       &  0.0 \\
 -0.10626444 & 0.08848558 & -1.00002   & -1.0 \\ 
  0.0        & 0.0        & -0.0200002 &  0.0

这些仅在a_ {31}中有所不同。我认为将单位应用于该值是不合理的(但如果我错了,请纠正我)。这似乎会使输出图像左移或右移约0.1。我希望这两个矩阵是相等的,并且在eyeView矩阵中要考虑差异。将两者都改为等于0会破坏3D效果。

任何人都可以告诉我发生了什么事吗?

1 个答案:

答案 0 :(得分:1)

有意义的是,视图矩阵在x轴上偏离该量 - 这是Daydream中支持的标准瞳孔间距离。请记住,您的视图矩阵会改变视点周围的世界,因此视图中心位于原始位置并且向上/向下(取决于API)Z轴随Y向上,因此x轴上的运动是有意义的。

如果您查看寻宝样本,他们会在乘以head_view矩阵时考虑头部位置/旋转。

对于投影矩阵,您通常希望您的眼睛正确朝向焦点。该偏移执行该操作 - 它移动焦点,这稍微使投影偏斜。它是一个偏心投影,眼睛外侧约为45度,内侧约为50度(取决于设备)。

- 汤姆