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

これが私のConstantbuffer構造体です。

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

何が悪いのかわかるなら教えてください!:)私はすでにこれを書くのに2日を費やしました。


2番目を試みます:

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

3番目のAttepmpt:@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を使用して2つの関数を呼び出しますが、必要に応じて自由に編集してください。

于 2013-03-29T18:16:50.410 に答える