На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Знатоки 3D-графики! Нужна матрица поворота...
    ... вектора направления камеры (т.е. чтобы смотреть не в начало координат)
      Есть такая параметризация, называемая углами Эйлера phi, theta, psi. Сначала делаешь поворот в плоскости XY на угол phi
      {{Cos[phi], -Sin[phi], 0},
       {Sin[phi], Cos[phi], 0},
       {0, 0, 1}},
      потом в этой повернутой системе координат делаешь поворот в повернутой плоскости YZ на угол theta
      {{1, 0, 0},
       {0, Cos[theta], -Sin[theta]},
       {0, Sin[theta], Cos[theta]}},
      а потом опять (уже сильно повернутой) в плоскости XY делаешь поворот на угол psi
      {{Cos[psi], -Sin[psi], 0},
       {Sin[psi], Cos[psi], 0},
       {0, 0, 1}};
      В результате, искомая матрица поворота на Эйлеровы углы имеет вид
      {{Cos[phi] Cos[psi] - Cos[theta] Sin[phi] Sin[psi], -Cos[psi] Sin[phi] -
           Cos[phi] Cos[theta] Sin[psi],
         Sin[psi] Sin[theta]},
       {Cos[psi] Cos[theta] Sin[phi] + Cos[phi] Sin[psi],
         Cos[phi] Cos[psi] Cos[theta] -
           Sin[phi] Sin[psi], -Cos[psi] Sin[theta]},
       {Sin[phi] Sin[theta], Cos[phi] Sin[theta], Cos[theta]}}

        И что задают эти углы?
          короче:каждый поворот объема можно разложить на 3 поворота по осям координат на некоторые углы
          легче сделать так:берешь первую матрицу из пред. сообщения-это матрица поворота относительно первой оси;то же делаешь со второй и третьей осью
          ВОТ И ВСЕ
            void Perspective(float &sx,float &sy,float &sz)
            {
             sx = sx * dist / (sz + dist);
             sy = sy * dist / (sz + dist);
            }
            void rotate(float &x,float &y,float &z,int phi,int thet,int ksi)
            {
              float  x_old, sx, sy;
              float  ax, ay, az;

              ay =y*cos(phi*PI)-z*sin(phi*PI) ;
              az =y*sin(phi*PI)+z*cos(phi*PI) ;

              ax =az*cos(thet*PI)-x*sin(thet*PI) ;
              az =az*sin(thet*PI)+x*cos(thet*PI) ;

              x_old = ax;
              ax =x_old*cos(ksi*PI)-ay*sin(ksi*PI) ;
              ay =x_old*sin(ksi*PI)+ay*cos(ksi*PI) ;
              sx = ax;
              sy = ay;

               if(Perspective1)
                   Perspective(&sx, &sy, &az);

              ax = sx;
              ay = sy;
              x=ax;          
              y=ay;          
              z=az;
            }
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0.0816 ]   [ 15 queries used ]   [ Generated: 5.10.26, 23:39 GMT ]