Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Поворот камеры в 3D


Автор: jenik15 14.2.2010, 01:36
Я нашел на нескольких форумах пример как реализовать движение камеры вокруг объекта в пространстве. 
Значит, примерно делается следующее:

Код

private void Grid_MouseMove(object sender, MouseEventArgs e) 
{
      if(mDown) {
        Point pos = Mouse.GetPosition(viewport);
        Point actualPos = new Point(pos.X - viewport.ActualWidth / 2, viewport.ActualHeight / 2 - pos.Y);
        double dx = actualPos.X - mLastPos.X, dy = actualPos.Y - mLastPos.Y;

        double mouseAngle = 0;
        if(dx != 0 && dy != 0) {
          mouseAngle = Math.Asin(Math.Abs(dy) / Math.Sqrt(Math.Pow(dx, 2) + Math.Pow(dy, 2)));
          if(dx < 0 && dy > 0) mouseAngle += Math.PI / 2;
          else if(dx < 0 && dy < 0) mouseAngle += Math.PI;
          else if(dx > 0 && dy < 0) mouseAngle += Math.PI * 1.5;
        }
        else if(dx == 0 && dy != 0) mouseAngle = Math.Sign(dy) > 0 ? Math.PI / 2 : Math.PI * 1.5;
        else if(dx != 0 && dy == 0) mouseAngle = Math.Sign(dx) > 0 ? 0 : Math.PI;

        double axisAngle = mouseAngle + Math.PI / 2;

        Vector3D axis = new Vector3D(Math.Cos(axisAngle) * 4, Math.Sin(axisAngle) * 4, 0);

        double rotation = 0.01 * Math.Sqrt(Math.Pow(dx, 2) + Math.Pow(dy, 2));

         Transform3DGroup group = axes.Transform as Transform3DGroup;
        QuaternionRotation3D r = new QuaternionRotation3D(new Quaternion(axis, rotation * 180 / Math.PI));
          group.Children.Add(new RotateTransform3D(r));

        mLastPos = actualPos;
      }
    }

 
 axes - уже создан. То есть, как я понимаю, при смене положения миши 
  поверх Grid и нажата кнопка с объектом axes возникает смена его положения.
с 3D я новичек, но разве не нужно поворачивать как то камеру вокруг оси, а не все объекты сцены. 
Подскажите, пожалуйста, как правильно реализовать данную функциональность.

Или вообще как вращать камеру вокруг объекта?

Автор: zeon007 17.10.2010, 19:41
В голову пришло только две идеи:
Менять LookDirection камеры либо задавать ей Transform.
Какая у тебя 3D сцена?
Если тебе нужно просто крутить объект то код в принципе  подойдет.
У меня на нем куб крутится.
А сам я убил много времени в поисках какой нибудь инфы по повороту камеры мышкой.Результатов ни каких+(
вот пару ссылок может чтото интерестное и найдешь.
http://translate.google.com/translate?hl=ru&langpair=en|ru&u=http://www.kindohm.com/technical/WPF3DTutorial.htm&rurl=translate.google.com.ua&twu=1
http://compgraphics.info/3D/3d_affine_transformations.php

Автор: zel25b 18.10.2010, 11:27
правильно подметили - нужно поворачивать камеру вокруг оси
для старта есть такая библиотека как http://3dtools.codeplex.com/
в нем смотри функционал по Trackball'у, в нэте есть описание с картинками как он работает, ссылка не сохранилась

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)