【问题标题】:Camera (LootkAt + Orthogonal projection) doesn't want to work [SlimDX / D3D9]相机(LootkAt + 正交投影)不想工作 [SlimDX / D3D9]
【发布时间】:2023-03-22 08:32:01
【问题描述】:

我不太明白“相机”如何与 D3D9 配合使用

首先,我如何设置我的相机:

     public Camera()
    {
        this.eye = new Vector3(0.0f, 0.0f, 0.0f);
        this.lookAt = new Vector3(0.0f, 0.0f, 1.0f);
        this.up = new Vector3(0.0f, 1.0f, 0.0f);
        viewMatrix = Matrix.LookAtLH(eye, lookAt, up);
        projectionMatrix = Matrix.OrthoLH(1 * zoomLevel, 1 * zoomLevel, 0.0f, 1.0f);
    }

还有我的顶点:

        vertices = new VertexTexture[]
        {
            new VertexTexture()
            {
                Position =  new Vector4(0.0f, 0.0f, 0.0f, 1.0f),
                TextureCoord = new Vector2(0.0f, 1.0f)
            },
            new VertexTexture()
            {
                Position =  new Vector4(0.0f, model.Height, 0.0f, 1.0f),
                TextureCoord = new Vector2(0.0f, 0.0f)
            },
            new VertexTexture()
            {
                Position =  new Vector4(model.Width, model.Height, 0.0f, 1.0f),
                TextureCoord = new Vector2(1.0f, 0.0f)
            },
            new VertexTexture()
            {
                Position =  new Vector4(model.Width, 0.0f, 0.0f, 1.0f),
                TextureCoord = new Vector2(1.0f, 1.0f)
            }
        };

它有效。我可以移动相机、缩放等。

但相机属性对我来说似乎很奇怪!我以为会是这样的:

    public Camera()
    {
        this.eye = new Vector3(0.0f, 0.0f, 1.0f);
        this.lookAt = new Vector3(0.0f, 0.0f, 0.0f);
        this.up = new Vector3(0.0f, 1.0f, 0.0f);
        viewMatrix = Matrix.LookAtLH(eye, lookAt, up);
        projectionMatrix = Matrix.OrthoLH(1 * zoomLevel, 1 * zoomLevel, 0.1f, 100.0f);
    }

但是使用该参数它不起作用。如果我为我的计划更改 Z 坐标也是一样(需要将其设置为 0 才能工作)。

现在,我尝试渲染其他对象。我为一个球体生成顶点(它在 D3D 10 上工作正常,在 (0;0;0) 周围生成一个半径为 1 的球体)但屏幕上什么也没有出现

我使用了 eye 和 lookat 参数,但我知道如何让它发挥作用,那么,我做错了什么?

【问题讨论】:

    标签: camera directx direct3d slimdx


    【解决方案1】:

    首先,一些背景。在正交投影中,我们在技术上不需要 Z 坐标变换,但实际上 D3D 系统并不关心您使用哪种投影 - 对于设备而言,它只是一个变换矩阵,仅此而已。因此,无论投影类型如何,Z 坐标都会始终进行变换。另一方面,摄像机坐标由投影矩阵转换(否则定位将是一场噩梦)。现在让我们回到你的情况,看看发生了什么。

    OrthoLH 中指定 zn=0.1f 您声明这是您的最小深度。因此,每个顶点将在深度上移动 -0.1f。随着您的顶点布局转换,Z 将为 0.9f,但您还记得相机不受影响吗?所以,它仍然处于 1.0f 深度,这就是为什么你什么都看不到的原因:相机后面没有顶点。

    在此处添加浮点计算错误,您就会明白为什么将相机设置为 0.9f 有时会有所帮助,有时却无济于事。不过,将位置设置为 0.8f 将适用于任何情况。

    【讨论】:

      【解决方案2】:

      首先,感谢您的回答。 我设法通过使用该属性设置我的相机来避免这个问题:

              this.eye = new Vector3(0.0f, 0.0f, 0.0f);
              this.lookAt = new Vector3(0.0f, 0.0f, 1.0f);
              this.up = new Vector3(0.0f, 1.0f, 0.0f);
      
              viewMatrix = Matrix.LookAtLH(eye, lookAt, up);
              projectionMatrix = Matrix.OrthoLH(1 * zoomLevel, 1 * zoomLevel, 0.0f, 10000000.0f);    :D
      

      我会再次阅读您所说的内容,并会考虑最好的解决方法:)

      我认为我的问题与我的顶点有关……例如,我生成了一个半径为 20 的球体,然后通过根据我的屏幕坐标进行缩放,将该顶点转换为对应于 20px 宽的球体

              worldMatrix = SlimDX.Matrix.Identity;
              worldMatrix = SlimDX.Matrix.Scaling(new Vector3(2.0f / ControlWidth, 2.0f / ControlHeight, 1.0f));
              worldMatrix = SlimDX.Matrix.Multiply(worldMatrix, SlimDX.Matrix.Translation(new Vector3(-1.0f, -1.0f, 0.0f)));
      

      我的 X / Y 缩放没问题。但是如何缩放 Z 坐标呢? 2.0 / ((ControlHeight + ControlWidth) / 2) ?

      我会再次阅读您的回答,以了解所有内容:)

      【讨论】:

      • 在缩放中,对 X/Y 做同样的事情是没有害处的。所描述的问题仅涉及偏移(特别是 - 顶点的 Z 坐标)。将“眼睛”放置在 Z=0.0、zn=0.0 且顶点的非负 Z 坐标处,您应该可以进行任何变换。
      猜你喜欢
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 2019-02-26
      • 2016-06-26
      • 2013-01-22
      • 2015-03-07
      相关资源
      最近更新 更多