2014-12-17 3 views
0

Я пытаюсь настроить камеру для перемещения оказанной объекта и я следую за это руководство:Перемещение камеры вокруг объектов

MSDN Guide on Rotating and Moving The Camera

Вот код, который я получил:

public partial class MainPage : UserControl 
{ 
    float _cameraRotationRadians = 0.0f; 
    Vector3 _cameraPosition = new Vector3(5.0f, 5.0f, 5.0f); 
    List<TexturedMesh> _meshes; 
    BasicEffect _effect; 

public MainPage() 
{ 
    InitializeComponent(); 
} 

private void DrawingSurface_Loaded(object sender, RoutedEventArgs e) 
{ 
    GraphicsDevice device = GraphicsDeviceManager.Current.GraphicsDevice; 
    RenderModeReason reason = GraphicsDeviceManager.Current.RenderModeReason; 

    _meshes = StreamHelper.ToMesh(device, "capsule.obj"); 

    _effect = new BasicEffect(GraphicsDeviceManager.Current.GraphicsDevice); 
    _effect.TextureEnabled = false; 
    _effect.World = Matrix.Identity; 
    _effect.View = Matrix.CreateLookAt(_cameraPosition, new Vector3(0.0f, 0.0f, 0.0f), Vector3.Up); 
    _effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 1.667f, 1.0f, 100.0f); 
} 

private void DrawingSurface_Draw(object sender, DrawEventArgs e) 
{ 
    GraphicsDevice device = GraphicsDeviceManager.Current.GraphicsDevice; 

    device.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, new Microsoft.Xna.Framework.Color(0, 0, 0, 0), 10.0f, 0); 
    device.RasterizerState = new RasterizerState() 
    { 
     CullMode = CullMode.None 
    }; 

    foreach (TexturedMesh mesh in _meshes) 
    { 
     // Load current vertex buffer 
     device.SetVertexBuffer(mesh.VertexBuffer); 

     // Apply texture 
     if (mesh.Texture != null) 
     { 
      _effect.Texture = mesh.Texture; 
      _effect.TextureEnabled = true; 
     } 
     else 
      _effect.TextureEnabled = false; 

     // Draw the mesh 
     foreach (EffectPass pass in _effect.CurrentTechnique.Passes) 
     { 
      pass.Apply(); 
      device.SamplerStates[0] = SamplerState.LinearClamp; 
      device.DrawPrimitives(PrimitiveType.TriangleList, 0, mesh.VertexBuffer.VertexCount/3); 
     } 

     // updates camera position 
     UpdateCameraPosition(); 
    } 

    e.InvalidateSurface(); 
} 

private void UpdateCameraPosition() 
{ 
    float nearClip = 1.0f; 
    float farClip = 2000.0f; 

    // set object origin 
    Vector3 objectPosition = new Vector3(0, 0, 0); 

    // set angle to rotate to 
    float cameraDegree = _cameraRotationRadians; 
    Matrix rotationMatrix = Matrix.CreateRotationX(MathHelper.ToRadians(cameraDegree)); 

    // set where camera is looking at 
    Vector3 transformedReference = Vector3.Transform(objectPosition, rotationMatrix); 
    Vector3 cameraLookAt = _cameraPosition + transformedReference; 

    // set view matrix and projection matrix 
    _effect.View = Matrix.CreateLookAt(_cameraPosition, objectPosition, Vector3.Up); 
    _effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 1.667f, nearClip, farClip); 
} 

private void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
{ 
    // slider.Value; 
    _cameraRotationRadians += (float)slider.Value; 
} 
} 

У меня есть ползунок, который дает значение радианов. Когда изменяется значение ползунка, я затем устанавливаю новый угол для камеры. UpdateCameraPosition() вызывается каждый раз, когда DrawingSurface обновляется после загрузки объектов.

Теперь, когда я пытаюсь переместить ползунок, положение камеры никогда не изменяется. Может ли кто-нибудь помочь и сказать мне, что исправить, чтобы заставить его вращаться вокруг всей группы объектов?

ответ

0

Это руководство - как повернуть камеру на место, но это звучит так, будто вы пытаетесь настроить камеру на свой объект. В этом случае не нужны transformedReference и cameraLookAt.

Просто удалите эти две линии и поверните _cameraPosition вокруг objectPosition, чтобы камера на орбите объекта.

//add this line in place of those two lines: 
_cameraPosition = Vector3.Transform(_cameraPosition, rotationMatrix); 

//now when you plug _cameraPosition into Matrix.CreateLookAt(), it will offer it a new camera position 

Технически мой сниппет вызывает _cameraPosition на орбиту мирового происхождения 0,0,0. Он работает, потому что ваш objectPosition, случается, находится в мировом происхождении, поэтому камера находится на орбите objectPosition.

Но если objectPosition когда-либо отходит от источника, вы все равно можете заставить камеру вывести на орбиту объект, переведя систему камеры/объекта в начало координат, выполните вращение, переведите их назад. легче это звучит:

_cameraPosition = Vector3.Transform(_cameraPosition - objectPosition, rotationMatrix) + objectPosition; 
//now the camera will orbit the object no matter where in the world the object is. 
1

Вы в основном пытаетесь повернуть вектор (0,0,0). Вращение вектора в оригинале не будет иметь никакого результата. Вместо этого вы должны повернуть положение камеры.

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