'8bit today' или 'let there be opengl!'

Тема в разделе "WASM.PROJECTS", создана пользователем Com[e]r, 19 июл 2009.

  1. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    снова я с табелем круглого троечника(за исключением английского и информатики всё так и было)

    сегодня мы поговорим о перемещении относительно вращения:
    покажу наглядно:
    [​IMG]
    то есть, если объект повёрнут, то движение должно происходить не относительно глобальной оси, а его локальной, отмеченной серым на рисунке.

    как это было в школе, я, столкнувшись с этой задачей, стал изобретать велосипед, получались варианты такие:


    Код (Text):
    1. #define RMOV(A1,A2,A3)  dest->A1 = src->A1 * cos(Rot->A3)   +   src->A2 * -sin(Rot->A3); \
    2.                         dest->A2 = src->A2 * cos(Rot->A3)   +   src->A1 *  sin(Rot->A3); \
    3.                         dest->A3 = src->A3;
    4. ...
    5. RMOV(X,Y,Z);
    6. ...
    Код (Text):
    1. void vrtmov(CoordSet*dest,CoordSet*src,mdlaninode*tmpnode,int noden){
    2. ///X
    3.   //#define __scal 1.5f
    4.   dest->X += src->X *dcos(tmpnode[noden].Rot.Y*__scal);
    5.   dest->X += src->Z *dsin(tmpnode[noden].Rot.Y*__scal);
    6. ///Y
    7.   dest->Y += src->Y *dcos(tmpnode[noden].Rot.X*__scal);
    8.   dest->Y += src->Z *dsin(tmpnode[noden].Rot.X*__scal);
    9. ///Z
    10.   dest->Z += src->X *dsin(-tmpnode[noden].Rot.Y*__scal);
    11.   dest->Z += src->Z *dsin(tmpnode[noden].Rot.Y+90*__scal); // <-- i think, there's some illogic stuff going on here..
    12. }
    и, в конце концов,
    Код (Text):
    1.   #define fsc(A) float s##A = sinf(Rot->A); float c##A = cosf(Rot->A);
    2.   fsc(X); fsc(Y); fsc(Z);
    3.   dest->X = src->X*cZ*cY + src->Y*(-sZ) + src->Z*sY;
    4.   dest->Y = src->Y*cX*cZ + src->Z*(-sX) + src->X*sZ;
    5.   dest->Z = src->Z*cY*cX + src->X*(-sY) + src->Y*sX;
    "но всё не то, но всё не так"(с) Ышо-Ышо - Пришла весна

    читал о матрицах, о всём прочем, но как-то, знаете,
    - ну что, данила, не выходит у тебя каменный цветок?
    - нниккак, кхе, нне выхоодит Х((

    ,)

    очень прошу помощи тех, кто не бросил универ и в школе учился вместо того, чтобы по репетициям наркоманить)
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Во даёт, байки травит. ^)
    У объекта есть локальная CK и глобальная. Нужно трансформировать из глобальной в локальную, повернуть и снова перевести в глобальную. Так собственно делается в скелетной анимации. По первому рисунку можно просто вычесть координаты центра.
     
  3. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ты так туманно описал, что я прям не знаю - обижаться мне или ругаться)
    как бы я бы обошёлся бы GL-ным преобразованием матрицы, но тут уж надо всё ручками,
    а я не знаю как мне вектор повернуть в пределах трёх осей.
    с двумя всё куда проще: x'=x*cos(z) + y*-sin(z) и y'=y*cos(z) + x*sin(z), но когда приходится высчитывать для всех комбинаций осей (xyz,zxy,yzx), вектор удлиняется, вектор крутится не туда и всё прочее, да)

    настрадал быстренько такой тест:
    Код (Text):
    1.     ...
    2.     CoordSet RT={0};
    3.     CoordSet Vm={0.5,0.5,0.0};
    4.     CoordSet V;
    5.       ...
    6.         glVertexT(V); // точку в начале координат
    7.         vrtmov(&V,&Vm,&RT); // помещаем в V вектор Vm(см. инициализацийо), повёрнутый по RT->X, RT->Y, RT->Z (вводятся с клавы)
    8.         glVertexT(V); // конечную точку вектора
    9.     ...
    и как бы вот наглядно тестирую, но пока так и не удалось успешно повращать эту печальную линию .(
     
  4. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Comer_
    Конкретных формул я не знаю -- я обычно положение объекта храню в виде матрицы для glMultMatrix, и просто по необходимости выкидываю из этой матрицы составляющую перемещения, обнуляя последний столбец.
    Но могу предложить алгоритм составления нужных формул. Ты ведь умеешь преобразовывать координаты вектора из локальной системы координат объекта в глобальную систему координат? А тут тебе надо взять вектор перемещения и проделать с ними всё те же самые преобразования, но исключая перемещения и, наверное, scale.
    Короче, берёшь из своей программы последовательность glRotated, которые выполняются перед рисованием объекта. Залазишь в man glRotated, там написано как glRotated составляет матрицу. Составляешь эти матрицы. Перемножаешь. Потом результат умножаешь на вектор перемещения. Должно получиться что-то типа: A1*A2*A3*X, где A1, A2, A3 -- это матрицы соответствующие вызовам glRotated (на всякий случай замечу: порядок важен), X -- это вектор перемещения. В результате получится вектор перемещения только "повёрнутый" из локальных координат в глобальные. Вот на этот вектор и надо сдвинуть объект.
     
  5. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    r90
    ох, аригато гозаимащта,
    правда, я университет бросил как раз на матрицах, о горе мне, идиоту, надеялся на решение с участием позиции объекта, вектора движения и поворота на момент начала движения, но придётся, видимо учить матрицы Т¬Т
     
  6. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Comer_
    Я ж говорю, составь матрицы. Перемножая матрицы ты будешь делать ровно то же самое, что ты пытаешься сделать без матриц, но не придётся в голове держать кучу ненужностей, типа того какой из поворотов мы сейчас проделываем и какую координату обсчитываем. Матрицы просто позволяют систематизировать этот процесс. И не только в недрах видеокарты, но также и при ручном счёте (ради которого и затевалось когда-то вся эта петрушка с матрицами).
    Долго-долго изучать матрицы не нужно. Надо лишь уметь их перемножать между собой и умножать матрицу на столбец (вектор). Но это, в конечном счёте, можно сделать глядя в определение умножения матриц.
     
  7. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    [​IMG]
    ага. может, подскажешь манов или кейвордов гугла, чтобы лишнего не заучивать.
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Comer_
    самая лучшая книга по теме( максимально просто и полно) google "боресков компьютерная djvu 1996"
    и у Автора шикарный сайт http://www.steps3d.narod.ru
     
  9. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Д. Роджерс, Дж Адамс Математические основы машинной графики.
     
  10. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    Матрицы - это обычно 1 семестр 1 курса, мб это институт вас бросил? :)
     
  11. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    да нет, в то время денег на жизнь не хватало, пришлось с головой уйти в кодинг, бросил весной.
    потом второй раз бросал, но там уже просто было кошмарно скучно - я тут дворды в уме ксорю, а мне тут историю, производные функций..
    подумываю теперь, два года спустя, поступить в другой вуз на геймдева, конечно..

    но да, wsd, Microedition, спасибо, примусь читать)
     
  12. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    http://up.cih.ms/comer/cantistest.zip
    вот, поприкалывайтесь, только не спрашивайте чем он болен )

    тестирую кости.
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Comer_
    Делаешь скелетку, не зная что такое матрицы и системы координат? Да ты гонишь. ^)
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А да это же md2 - морф, а не скелетка. ^)
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    То есть md3.
     
  16. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    Booster
    orly? в файлы листером посмотри, умник-сан ,)
    мд3 не имеет скелета, даже если в некоторых редакторах он и присутствует на момент рисования, а md2 и вовсе не держит вертексов больше, чем влезает в WORD.
    но да, на момент введения моделей в движок временно пользовался форматом Q2:md2, это пару страниц треда назад.

    матрицы-то поверхностно знаю, но перемножать их мне хотелось меньше всего,
    в крайнем случае хотелось обойтись квадриллионами, к чему, собственно, в данный момент всё и идёт.
     
  17. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Comer_
    а маленькие шарики , рядом с бошкой, артефакты? или так было задумано
     
  18. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    это девелоперское, это мини-проекция связок относительно их обычного положения, не обращай на них внимания)
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    >orly? в файлы листером посмотри, умник-сан ,)
    Попутал, вообще не смотрел. ^) Просто мне, тоже товарищ умник, не понятно как можно сделать скелетную анимацию и не понимать элементарных вещей как в #81. Это выше моего понимания.
     
  20. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Booster
    а скелетку, в хорошем редакторе, нельзя мышкой натыкать?