0

请告诉我我做错了什么:那是我的相机课

public class Camera
{
    public Matrix view;
    public Matrix world;
    public Matrix projection;

    public Vector3 position;
    public Vector3 target;

    public float fov;

    public Camera(Vector3 pos, Vector3 tar)
    {
        this.position = pos;
        this.target = tar;
        view = Matrix.LookAtLH(position, target, Vector3.UnitY);
        projection = Matrix.PerspectiveFovLH(fov, 1.6f, 0.001f, 100.0f);
        world = Matrix.Identity;
    }
}

那是我的常量缓冲区结构:

struct ConstantBuffer 
{
    internal Matrix mWorld;
    internal Matrix mView;
    internal Matrix mProjection;
};

在这里我正在绘制三角形并设置相机:

x+= 0.01f;
camera.position = new Vector3(x, 0.0f, 0.0f);
camera.view = Matrix.LookAtLH(camera.position, camera.target, Vector3.UnitY);
camera.projection = Matrix.PerspectiveFovLH(camera.fov, 1.6f, 0.0f, 100.0f);

var buffer = new Buffer(device, new BufferDescription
{
  Usage = ResourceUsage.Default,
  SizeInBytes = sizeof(ConstantBuffer),
  BindFlags = BindFlags.ConstantBuffer
});


////////////////////////////// camera setup 

 ConstantBuffer cb;
 cb.mProjection =  Matrix.Transpose(camera.projection);
 cb.mView = Matrix.Transpose(camera.view);
 cb.mWorld =  Matrix.Transpose(camera.world);

 var data = new DataStream(sizeof(ConstantBuffer), true, true);
 data.Write(cb);
 data.Position = 0;

 context.UpdateSubresource(new DataBox(0, 0, data), buffer, 0);


 //////////////////////////////////////////////////////////////////////

 // set the shaders
 context.VertexShader.Set(vertexShader);
 context.PixelShader.Set(pixelShader);
 // draw the triangle
 context.Draw(4, 0);
 swapChain.Present(0, PresentFlags.None);

请,如果你能看到什么是错的,告诉我!:) 我已经花了两天时间写这个了..


尝试第二个:

@paiden 我现在初始化了 fov(非常感谢 :))但仍然没有效果(现在是 fov = 1.5707963267f;)和@Nico Schertler,也谢谢你,我把它投入使用了

context.VertexShader.SetConstantBuffer(buffer, 0); 
context.PixelShader.SetConstantBuffer(buffer, 0); 

但仍然没有效果......可能我的 .fx 文件是错误的?我需要这个有什么目的:

cbuffer ConstantBuffer : register( b0 ) { matrix World; matrix View; matrix Projection; }

尝试第三次:@MHGameWork 也非常感谢,但仍然没有效果;)如果有人有 5 分钟的时间,我可以将源代码放到他/她的电子邮件中,然后我们将发布答案......我猜这对像我这样的新手会有很大帮助:)

unsafe
{
                x+= 0.01f;
                camera.position = new Vector3(x, 0.0f, 0.0f);
                camera.view = Matrix.LookAtLH(camera.position, camera.target, Vector3.UnitY);
                camera.projection = Matrix.PerspectiveFovLH(camera.fov, 1.6f, 0.01f, 100.0f);

                var buffer = new Buffer(device, new BufferDescription
                {
                    Usage = ResourceUsage.Default,
                    SizeInBytes = sizeof(ConstantBuffer),
                    BindFlags = BindFlags.ConstantBuffer
                });

现在的问题 - 我看到了我的三角形,但相机没有移动

4

2 回答 2

1

您已将相机的近平面设置为 0。这会使矩阵中的所有值除以零,因此您将得到一个填充有“NAN”的矩阵

在您的情况下使用大约 0.01 的近平面值,它将解决问题

于 2013-03-27T12:28:07.590 回答
0

我希望你仍然需要帮助。这是我的相机类,可以使用,并且可以使用鼠标/键盘轻松地在场景中移动。

http://pastebin.com/JtiUSiHZ

在每一帧(或移动相机时)调用“TakeALook()”方法。

您可以使用“CameraMove”方法在它周围移动。它需要一个 Vector3 - 你想移动你的相机(不要给它很大的值,我为每一帧使用 0,001f)

使用“CameraRotate()”你可以把它转过来——它需要一个 Vector2 作为左右和上下旋转。

它很容易。我使用 EventHandlers 来调用两个函数,但可以随意编辑。

于 2013-03-29T18:16:50.410 回答