На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Пишу 3d прогу.
    Уже неделю далбаюсь над задачей, перерыл все свои матерьялы
    по 3D и ни чего на подобную тему не нашёл.
    Ну... объясняю доступным языком:
    В 3d гамы играли(типа F-16) так вот, как этот самолёт заставить правильно летать и вращятся?
      Да,  много у тебя литературы.... :)
        Chibis, мне думается придется тебе много-много физики читать. И на этой основе все строить. Только так.
          Kick_me_please
          А у тебя наверное много инфо о 3d.
          Может покажеш свои способности?
            reporter
            Меня не интересует его скорость, вес, ускорение и т.п. это потом.
            Проблема в павороте. Панимаеш повернуть его по мировим осям или
            вокруг произвольного вектора без проблем, но как заставит правильно
            врашатся НЕ ТРОГАЯ объектную матрицу?
              а какая собсно разница, вращать самолет, оставляя матрицу, или вращать весь мир вокруг самолета, если тебе пофиг на ускоерния, силу тяжести и прочую физику?
                Полностью согласен с Demo_S: для визуализации пофигу, а в текущее состояние объектов пиши, что хочешь...
                  Demo_S
                  andyag
                  Вы видемо не врубаетесь что я спрашиваю.
                  Объясняю ещё раз.
                  1 Представте что объект направлен в доль оси Z
                  2 Поверните объект на 45 градусов по мировой оси Y
                  3 Теперь поверните его на 90 по мировой оси X, и что вы увидели, глюк.
                   Обект повернулся но не так как нужно.

                  Если вы скажите "врашай отнасительно обектного базиса" то я спрашу
                   как прощетать этот базис?

                  А лутше скинте сюда какой нибудь пример (желательно PAS) или подскожите где его
                  скачать.
                    to Chibis:
                    v literature po DirectX u menya yest sample proga "plavayushiy Delfin", kachestvo ofigennoye, ano napisano na (C++) i (VB) mojesh nachat s etogo.

                    i yesli ti xochesh pisat takiye progi to uchi DirectX a potom Fiziku a potom prikladnuyu mat. i t.d.
                      Razum
                      А зачем мне DirectX если я программирую под Dos.
                      Да и не нужна мне физика, я не пишу леталку.
                      Просто нужно инфо.
                      Сообщение отредактировано: Chibis -
                        RE: Если вы скажите "врашай отнасительно обектного базиса" то я спрашу
                             как прощетать этот базис?

                        "Базис" твой это начало системы координат, относительно которого ты рисовал свой самолет, если ты его отрисовываешь из начала координат мира - очень зря, у самолета должен быть свой фрейм и все повороты осуществлятся в его системе координат, другими словами следи за последовательностью преобразований, если хочешь повернуть именно самолет, а не камеру сначала выполняй матрицу поворота, а потом перемещения и масштабирования
                          Просто перед вращением надо сохранить текущие значения мировых (может быть как-то уже повернутых) координат, затем повернуть мировые координаты как надо для объкта, а затем востоновит положение мировых координат.
                          glPushMatrix - сохранить координаты
                          glPopMatrix - востоновить координаты (это для OpenGL)
                          Нужно следить за количеством вызовов этих функций - они должны быть парными.
                            Помоги please.
                            Как посторить матрицу точки с координатами (X,Y,Z)
                              ::) У меня на моём сайте www.serg-trf.narod.ru есть прога под opengl с исходниками на C++ Builder.
                                [QUOTE=Chibis, 30.04.02, 20:57:14]Demo_S
                                andyag
                                Вы видемо не врубаетесь что я спрашиваю.
                                Объясняю ещё раз.
                                1 Представте что объект направлен в доль оси Z
                                2 Поверните объект на 45 градусов по мировой оси Y
                                3 Теперь поверните его на 90 по мировой оси X, и что вы увидели, глюк.
                                 Обект повернулся но не так как нужно.

                                Если вы скажите "врашай отнасительно обектного базиса" то я спрашу
                                 как прощетать этот базис?
                                quote]

                                Пусть {X0,Y0,Z0; Bx,By,Bz} - будет мировой (афинный) базис, который (всегда) можно считать равным следующему
                                X0 = 0;
                                Y0 = 0;
                                Z0 = 0;
                                Bx = (1, 0, 0);
                                By = (0, 1, 0);
                                Bz = (0, 0, 1);

                                Пусть {X,Y,Z;  Ex, Ey, Ez} - будет (афинный) базис твоего самолета, где X, Y, Z - просто текущие координаты центра самолета, Ex, Ey, Ez - ортонормированный базис: Ez - направление носа самолета, Ex - верх самолета (куда хвост торчит), Ey - направление правого крыла (-Ey направление левого крыла). К примеру, координата носа самолета (x1,y1,z1) есть
                                x1 = X + Airoplan_Length*Ez.x;
                                y1 = Y + Airoplan_Length*Ez.y;
                                z1 = Z + Airoplan_Length*Ez.z;
                                А крайняя точка правого крыла (x2,y2,z2) есть
                                x2 = X + Razmah_kryla*Ey.x;
                                y2 = Y + Razmah_kryla*Ey.y;
                                z2 = Z + Razmah_kryla*Ey.z;

                                В начальный момент времени имеем
                                X = X_Start;
                                Y = Y_Start;
                                Z = Z_Start;
                                Ex = Bx;
                                Ey = By;
                                Ez = Bz; // пусть он стоит носом, например, паралельно Bz

                                Как он летает?
                                Для простоты, предположим, что самолет всегда летает носом вперед (хотя это очень грубое приближение, справедливое, быть может только для "кукурузников", а вообще носом вперед только торпеды плавают.). Если мы выбрали Ez - направление его носа, то в следующий момент времени имеем
                                X = X + V*dt*Ez.x;
                                Y = Y + V*dt*Ez.y;
                                Z = Z + V*dt*Ez.z;
                                где V - скорость, dt шаг по времени.

                                Допустим пилот захотел задрать нос самолета вверх на (небольшой) угол phi (или опустить его вниз). Для этого надо сделать вращение в плоскости задаваемой векторами направления носа самолета Ez и направлением, в котором торчит его хвост Ex.
                                В векторных обозначениях:
                                NewEx := Cos(phi)*Ex - Sin(phi)*Ez;
                                NewEz := Sin(phi)*Ex + Cos(phi)*Ez;
                                Ex := NewEx;
                                Ez := NewEz;
                                Тоже самое, только в компонентах расписывается так
                                NewEx.x := Cos(phi)*Ex.x - Sin(phi)*Ez.x;
                                NewEx.y := Cos(phi)*Ex.y - Sin(phi)*Ez.y;
                                NewEx.z := Cos(phi)*Ex.z - Sin(phi)*Ez.z;
                                NewEz.x := Sin(phi)*Ex.x + Cos(phi)*Ez.x;
                                NewEz.y := Sin(phi)*Ex.y + Cos(phi)*Ez.y;
                                NewEz.z := Sin(phi)*Ex.z + Cos(phi)*Ez.z;
                                Ex.x := NewEx.x;
                                Ex.y := NewEx.y;
                                Ex.z := NewEx.z;
                                Ez.x := NewEz.x;
                                Ez.y := NewEz.y;
                                Ez.z := NewEz.z;

                                Теперь он захотел повернуть направо (или налево) на (небольшой) угол alpha, т.е в плоскости Ez^Ey (Ez - нос, Ey - правое крыло)
                                NewEy := Cos(alpha)*Ey - Sin(alpha)*Ez;
                                NewEz := Sin(alpha)*Ey  + Cos(alpha)*Ez;
                                Ey := NewEy;
                                Ez := NewEz;
                                (В компонентах это 12 формул)

                                И, наконец, он захотел войти в штопор, т.е. двигаться вперед (вдоль Ez) вращаясь в плоскости Ex^Ey
                                NewEy := Cos(beta)*Ey - Sin(beta)*Ex;
                                NewEx := Sin(beta)*Ey  + Cos(beta)*Ex;
                                Ey := NewEy;
                                Ex := NewEx;
                                (В компонентах это 12 формул)

                                Понятно?

                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0308 ]   [ 14 queries used ]   [ Generated: 18.05.24, 09:15 GMT ]