2013-03-26 3 views
0

Пожалуйста, скажите мне, что я делаю неправильно: , что мой классSlimDX Установка камеры

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

камеры, что мой Constant буфер структура:

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,5707963267 е;) и @Nico Schertler, спасибо вам тоже, я положил его в использовании по

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

, но никакого эффекта до сих пор ... наверное мой файл .fx не так? для чего мне это нужно:

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

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

сейчас проблема - ВИЖУ МОЕ TRIANGLE НО КАМЕРА НЕ ПЕРЕДВИГАЕТ

+0

В чем проблема? Я не могу найти место, где вы фактически устанавливаете постоянный буфер ('context.VertexShader.SetConstantBuffer (...)'). –

+0

Единственная проблема, я вижу, это та камера.fov никогда не инициализируется (это будет 0.0 -> вы ничего не увидите). Но я не знаю, является ли это просто копией и вставкой ошибки в примере кода. – paiden

ответ

0

Надеюсь, вам по-прежнему нужна помощь. Вот мой класс камеры, который можно использовать, и его можно легко перемещать по сцене с помощью мыши/клавиатуры.

http://pastebin.com/JtiUSiHZ

Вызовите "TakeALook()" метод в каждом кадре (или при перемещении камеры).

Вы можете перемещать его с помощью метода «CameraMove». Требуется Vector3 - где вы хотите переместить свою камеру (не давайте ей огромные значения, я использую 0,001f для каждого кадра)

И с помощью функции «CameraRotate()» вы можете повернуть ее - для этого требуется Vector2 as поворот влево-вправо и вверх-вниз.

Его довольно легко. Я использую EventHandlers для вызова там двух функций, но не стесняйтесь редактировать, как вы пожелаете.

1

Вы установили nearplane вашей камеры 0. Это делает все значение в вашей матрице деления на ноль, так что вы получите матрицу, заполненную «Нан

Используйте близкую величину плоскости около 0,01 в ваш случай, он решит проблему

Смежные вопросы