C# 如何计算XNA中Oculus裂谷的3D视图矩阵?

C# 如何计算XNA中Oculus裂谷的3D视图矩阵?,c#,3d,xna,orthographic,oculus,C#,3d,Xna,Orthographic,Oculus,这是我的相机课 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)

这是我的相机课

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);
    }
}

我已经为左眼和右眼创建了一个摄像头。一切正常,眼睛在每只眼睛中显示一个单独的图像。问题是眼睛模糊,我的大脑不能将两个视图“合并”成一个图像。我试图稍微偏移右眼的图像,但我找不到两只眼睛的正确位置。有人能帮忙吗?

我想你已经准备好了变形着色器并开始工作了,因为如果没有变形着色器,你将无法在眼眶裂痕中看到正确会聚的图像

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

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


请注意,您需要对投影矩阵应用另一个移位。通过将投影矩阵与偏移矩阵相乘来实现此目的,偏移矩阵将Rift SDK提供的投影偏移作为偏移。SDK文档中也解释了这一点。确保矩阵按正确的顺序相乘。;)

我想你已经准备好了变形着色器并开始工作了,因为如果没有它,你将无法在眼眶裂痕中看到正确会聚的图像

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

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


请注意,您需要对投影矩阵应用另一个移位。通过将投影矩阵与偏移矩阵相乘来实现此目的,偏移矩阵将Rift SDK提供的投影偏移作为偏移。SDK文档中也解释了这一点。确保矩阵按正确的顺序相乘。;)

两幅未合并图像的双重视觉效果与modelview矩阵无关。modelview矩阵的分离使两个图像略有不同,因此它们提供了深度感,但如果没有分离,通过Oculus的视图在理想情况下应该非常类似于凝视非3D监视器

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

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


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

两幅未合并图像的双重视觉效果与modelview矩阵无关。modelview矩阵的分离使两个图像略有不同,因此它们提供了深度感,但如果没有分离,通过Oculus的视图在理想情况下应该非常类似于凝视非3D监视器

之所以会看到双视图,是因为您将两个图像居中于每个视口的中心(我分别渲染每个眼睛视图,因此我有一个覆盖左眼的视口,然后是一个覆盖右眼的视口)。如果玩家正前方的视图位于眼睛视图的中心,则观看者将始终看到双视图。这是因为每个镜头都不是位于显示面板一半的中间。而是