0

这是我的相机课

public class Camera
{
    public Matrix View { get; private set; }
    public Matrix Projection { get; private set; }
    public Viewport Viewport { get; private set; }

    public Camera(Viewport viewport, Vector3 position, Vector3 lookAt)
    {
        this.Viewport = viewport;
        this.Update(position, lookAt);
    }

    public void Update(Vector3 position, Vector3 lookAt)
    {
        this.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, this.Viewport.AspectRatio, 1, 500);
        this.View = Matrix.CreateLookAt(position, lookAt, Vector3.Up);
    }
}

我为左眼和右眼创建了一个相机。一切正常,Oculus 在每只眼睛中显示一个单独的图像。问题是 Oculus 是模糊的,我的大脑并没有将两个视图“合并”成一个图像。我试图稍微偏移右眼的图像,但我找不到两只眼睛的正确定位。任何人都可以帮忙吗?

4

3 回答 3

2

两个图像不合并的双重视觉效果与模型视图矩阵没有任何关系。模型视图矩阵的分离使两个图像略有不同,因此它们给人一种深度感,但如果没有分离,理想情况下,通过 Oculus 的视图应该非常类似于盯着非 3D 显示器。

您看到双重的原因是因为您将两个图像居中在每个视口的中心(我单独渲染每个眼睛视图,所以我有一个覆盖左眼的视口,然后是一个覆盖右眼的视口) . 如果玩家正前方的视野位于视线的中心,则观看者总是会看到双倍的。这是因为每个镜头的中心不在显示面板一半的中间。相反,它们向中心偏移。

为了在 Rift 上正确显示内容,您必须考虑此偏移量。有很多方法可以做到这一点。最好的方法是改变你的投影矩阵,使截锥体的中心不再直视前方,而是偏向一侧。这是 SDK 示例中使用的方法。

另一种方法是不使用投影矩阵,而是将每只眼睛的渲染视图向内推向屏幕中心。这不是最佳方法的原因是,这意味着当图像的内部边缘被推到视口之外时,您将对其进行裁剪(这并不是视图的真正问题,主要是性能问题,因为您已经花费了部分性能预算来渲染那些现在裁剪的像素)。这也意味着显示器外边缘的部分屏幕根本不会被渲染,这会降低渲染场景的整体视野。

于 2013-11-26T22:43:53.467 回答
2

我认为您已将失真着色器安装到位并正常工作,因为没有它,您将无法在 Oculus Rift 中看到正确收敛的图像。

您需要确定您的游戏世界单位之一对应的真实世界测量单位。这是只有您作为图形引擎的作者才能知道的事情。游戏世界对象可以在这里提供线索。假设您的游戏中有汽车,其中一辆的长度为 5.0 游戏世界单位。这将表明 1 个游戏世界单位对应于 1 个现实世界米,因为 5 m 的长度对于(更大的)汽车来说是一个合理的值。

您现在要做的是通过玩家(或您的)IPD(瞳孔间距)来偏移左右视图方向。如 SDK 文档中所述,人类 IPD 可以介于 54 毫米和 72 毫米之间,最常见的值是 62 毫米。如果 1.0 世界单位 ~ 1 米,1 毫米 ~ 1.0 / 1000.0 = 0.001 游戏世界单位。因此,如果您的 IPD 为 62 毫米,您需要将前视矢量向屏幕中心移动 vec3 (0.062, 0.0, 0.0)(左眼)和 vec3 (-0.062, 0.0, 0.0)(右眼)。

关于您需要对投影矩阵应用另一个移位。为此,您可以将投影矩阵与偏移矩阵相乘,该偏移矩阵将 Rift SDK 提供的投影偏移作为移位。SDK 文档中也对此进行了说明。确保以正确的顺序将矩阵相乘。;)

于 2013-09-21T00:09:29.913 回答
0

这是一个带有示例代码和示例 xna 4.0 项目的工作教程(在评论中)

XNA Oculus Rift 教程

于 2014-02-26T20:19:44.127 回答