0

我真的不明白“相机”如何与 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 的球体),但屏幕上什么也没有出现

我玩过眼睛和观察参数,但我可以弄清楚如何让它工作,那么,我做错了什么?

4

2 回答 2

1

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

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

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

于 2012-02-09T04:55:28.227 回答
0

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

        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) ?

我会再次阅读您的回答,以了解一切:)

于 2012-02-09T14:45:51.577 回答