Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.21.41.219] |
|
Сообщ.
#1
,
|
|
|
Уже неделю далбаюсь над задачей, перерыл все свои матерьялы
по 3D и ни чего на подобную тему не нашёл. Ну... объясняю доступным языком: В 3d гамы играли(типа F-16) так вот, как этот самолёт заставить правильно летать и вращятся? |
Сообщ.
#2
,
|
|
|
Да, много у тебя литературы....
|
Сообщ.
#3
,
|
|
|
Chibis, мне думается придется тебе много-много физики читать. И на этой основе все строить. Только так.
|
Сообщ.
#4
,
|
|
|
Kick_me_please
А у тебя наверное много инфо о 3d. Может покажеш свои способности? |
Сообщ.
#5
,
|
|
|
reporter
Меня не интересует его скорость, вес, ускорение и т.п. это потом. Проблема в павороте. Панимаеш повернуть его по мировим осям или вокруг произвольного вектора без проблем, но как заставит правильно врашатся НЕ ТРОГАЯ объектную матрицу? |
Сообщ.
#6
,
|
|
|
а какая собсно разница, вращать самолет, оставляя матрицу, или вращать весь мир вокруг самолета, если тебе пофиг на ускоерния, силу тяжести и прочую физику?
|
Сообщ.
#7
,
|
|
|
Полностью согласен с Demo_S: для визуализации пофигу, а в текущее состояние объектов пиши, что хочешь...
|
Сообщ.
#8
,
|
|
|
Demo_S
andyag Вы видемо не врубаетесь что я спрашиваю. Объясняю ещё раз. 1 Представте что объект направлен в доль оси Z 2 Поверните объект на 45 градусов по мировой оси Y 3 Теперь поверните его на 90 по мировой оси X, и что вы увидели, глюк. Обект повернулся но не так как нужно. Если вы скажите "врашай отнасительно обектного базиса" то я спрашу как прощетать этот базис? А лутше скинте сюда какой нибудь пример (желательно PAS) или подскожите где его скачать. |
Сообщ.
#9
,
|
|
|
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. |
Сообщ.
#10
,
|
|
|
Razum
А зачем мне DirectX если я программирую под Dos. Да и не нужна мне физика, я не пишу леталку. Просто нужно инфо. |
Сообщ.
#11
,
|
|
|
RE: Если вы скажите "врашай отнасительно обектного базиса" то я спрашу
как прощетать этот базис? "Базис" твой это начало системы координат, относительно которого ты рисовал свой самолет, если ты его отрисовываешь из начала координат мира - очень зря, у самолета должен быть свой фрейм и все повороты осуществлятся в его системе координат, другими словами следи за последовательностью преобразований, если хочешь повернуть именно самолет, а не камеру сначала выполняй матрицу поворота, а потом перемещения и масштабирования |
Сообщ.
#12
,
|
|
|
Просто перед вращением надо сохранить текущие значения мировых (может быть как-то уже повернутых) координат, затем повернуть мировые координаты как надо для объкта, а затем востоновит положение мировых координат.
glPushMatrix - сохранить координаты glPopMatrix - востоновить координаты (это для OpenGL) Нужно следить за количеством вызовов этих функций - они должны быть парными. |
Сообщ.
#13
,
|
|
|
Помоги please.
Как посторить матрицу точки с координатами (X,Y,Z) |
Сообщ.
#14
,
|
|
|
: У меня на моём сайте www.serg-trf.narod.ru есть прога под opengl с исходниками на C++ Builder.
|
Сообщ.
#15
,
|
|
|
[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 формул) Понятно? |