0

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

我不明白的是每只眼睛的视野之间的差异。我们的眼睛几乎是朝前的,所以它们应该是一样的吗?好吧,这些矩阵实际上是相当不同的。让我们看一下,这些是使用 SDK 中 TreasureHunt 示例的变体记录在 onDrawEye 方法中的:

左 EyeView 矩阵:

 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 

右 EyeView 矩阵:

  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 效果。

谁能告诉我发生了什么?

4

1 回答 1

1

有道理的是,视图矩阵在 x 轴上偏离了那个量 - 这是 Daydream 支持的标准瞳孔间距。请记住,您的视图矩阵会围绕视点转换世界,因此视图中心位于原始位置并向上/向下(取决于 API)指向 Z 轴,而 Y 向上,因此 x 轴上的运动是有意义的。

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

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

-汤姆

于 2017-02-20T23:22:07.490 回答