相机(LootkAt +正交投影)不想工作[SlimDX / D3D9]

时间:2012-02-08 14:05:08

标签: camera directx direct3d slimdx

我真的不明白“相机”如何与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个半径球体)但屏幕上没有任何内容

我玩了眼睛和lookat参数,但我可以想办法让它工作,所以,我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

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

在这里添加浮动计算错误,你会明白为什么设置相机在0.9f有时有帮助,有时不帮助。但是,将位置设置为0.8f对任何情况都适用。

答案 1 :(得分: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)?

我会再次阅读你的经理,了解一切:)