XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > StarCraft (только чтение)> StarCraft 2 inside
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

 
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Эксперименты с векторами
Собственно выкладываю видео того что получилось за 4 дня копания в редакторе и коде как таковом (в РО пока толком не лазил).
Лагает изза слабого ноута... пришлось фрапсом резать фпс, да и оптимизацией самого примера я не маялся, мне важно было проверить библиотеку векторов. После доработки напильником может и выложу саму карту... Ну и я пока не разобрался с высотами на склонах, там видно что "огоньки" двигаются не по прямой, как надо, а как бы подпрыгивают... что несколько портит эффект. Подозреваю, что там что-то не так с функцией WorldHeight.
В общем если интересно, надо и так далее, пишите, комментируйте. Ниже выкладываю код библиотеки (в том виде в котором она сейчас существует, буду еще дорабатывать под свои нужды).
bool[20000] vector_allocated;
fixed[20000] vector_x;
fixed[20000] vector_y;
fixed[20000] vector_z;
int vector_count = 0;
bool isVectorAllocated(int this) {
    if ((this>=0)&&(this<=1999)){
        return (vector_allocated[this])&&(this<vector_count);
    }
    return false;
}
int vector_createXYZ(fixed x, fixed y, fixed z) {
    int i=0;
    int j=-1;
    while ((i<vector_count)&&(j==-1))
    {
        if (vector_allocated[i])
        {
            i=i+1;
        } else
        {
            j=i;
        }
    }    
    if (j!=-1)
    {
        i=j;
    } else
    {
        i=vector_count;
        vector_count=vector_count+1;
    }
    vector_allocated[i]=true;
    vector_x[i]=x;
    vector_y[i]=y;
    vector_z[i]=z;
    return i;
}
int vector_createPoint(point begin, point end) {
    return vector_createXYZ(PointGetX(end)-PointGetX(begin),PointGetY(end)-PointGetY(begin),WorldHeight(c_heigh​tMapGround,end)-WorldHeight(c_heightMapGround,begin));//PointGetHeight(end)-PointGetHeight(begin)+
}
int vector_createVector(int v) {
    if (isVectorAllocated(v))
    {
        return vector_createXYZ(vector_x[v],vector_y[v],vector_z[v]);
    }
    return -1;
}
void vector_destroy(int this) {
    if (isVectorAllocated(this))
    {
        vector_allocated[this]=false;
        if (this==vector_count-1){vector_count=vector_count-1;}
    }
}
fixed vector_getX(int this) {
    if (isVectorAllocated(this))
    {
        return vector_x[this];
    }
    return 0;
}
bool vector_setX(int this, fixed x) {
    if (isVectorAllocated(this))
    {
        vector_x[this]=x;
    }
    return isVectorAllocated(this);
}
fixed vector_getY(int this) {
    if (isVectorAllocated(this))
    {
        return vector_y[this];
    }
    return 0;
}
bool vector_setY(int this, fixed y) {
    if (isVectorAllocated(this))
    {
        vector_y[this]=y;
    }
    return isVectorAllocated(this);
}
fixed vector_getZ(int this) {
    if (isVectorAllocated(this))
    {
        return vector_z[this];
    }
    return 0;
}
bool vector_setZ(int this, fixed z) {
    if (isVectorAllocated(this))
    {
        vector_z[this]=z;
    }
    return isVectorAllocated(this);
}
bool vector_setXYZ(int this, fixed x, fixed y, fixed z) {
    if (isVectorAllocated(this))
    {
        vector_x[this]=x;
        vector_y[this]=y;
        vector_z[this]=z;
    }   
    return isVectorAllocated(this);
}
int vector_setPoint(int this, point begin, point end) {
    if (isVectorAllocated(this))
    {
        vector_x[this]=PointGetX(end)-PointGetX(begin);
        vector_y[this]=PointGetY(end)-PointGetY(begin);
        vector_z[this]=WorldHeight(c_heightMapGround,end)-WorldHeight(c_heightMapGround,begin);//PointGetHei​ght(end)-PointGetHeight(begin)+
        return this;
    }   
    return -1;
}
fixed vector_getLength(int this) {
    if (isVectorAllocated(this))
    {
        return SquareRoot(vector_x[this]*vector_x[this]+vector_y[this]*vector_y[this]+vector_z[this]*vector_z[this]​);
    }
    return 0;
}
int vector_normalize(int this) {
    fixed l;
    if (isVectorAllocated(this))
    {       
        l=SquareRoot(vector_x[this]*vector_x[this]+vector_y[this]*vector_y[this]+vector_z[this]*vector_z[thi​s]);  
        if (l!=0)
        {  
            vector_x[this]=vector_x[this]/l;
            vector_y[this]=vector_y[this]/l;
            vector_z[this]=vector_z[this]/l;
        }
        return this;
    }
    return -1;
}
int vector_setLength(int this, fixed new_l){
    fixed l;
    if (isVectorAllocated(this))
    {       
        l=SquareRoot(vector_x[this]*vector_x[this]+vector_y[this]*vector_y[this]+vector_z[this]*vector_z[thi​s]);    
        if (l!=0) {
            vector_x[this]=new_l*(vector_x[this]/l);
            vector_y[this]=new_l*(vector_y[this]/l);
            vector_z[this]=new_l*(vector_z[this]/l);
        }
        return this;
    }
    return -1;
}
int vector_realMultiply(int this, fixed r) {
    if (isVectorAllocated(this)) 
    {
        vector_x[this]=r*vector_x[this];
        vector_y[this]=r*vector_y[this];
        vector_z[this]=r*vector_z[this];
        return this;    
    }
    return -1;
}
fixed vector_scalarMultiply(int this, int vect) {
    if ((isVectorAllocated(this)) && (isVectorAllocated(vect)))
    {
        return vector_x[this]*vector_x[vect]+vector_y[this]*vector_y[vect]+vector_z[this]*vector_z[vect];
    }
    return 0;
}
int vector_vectorPlus(int this, int vect) {
    if ((isVectorAllocated(this)) && (isVectorAllocated(vect)))
    {
        vector_x[this]=vector_x[this]+vector_x[vect];
        vector_y[this]=vector_y[this]+vector_y[vect];
        vector_z[this]=vector_z[this]+vector_z[vect];
        return this;
    }
    return -1;
}
int vector_vectorMultiply(int this, int vect)
{   
    fixed x;
    fixed y;
    fixed z;
    if ((isVectorAllocated(this)) && (isVectorAllocated(vect)))
    {
        x = vector_y[this]*vector_z[vect]-vector_y[vect]*vector_z[this];
        y = vector_z[this]*vector_x[vect]-vector_z[vect]*vector_x[this];
        z = vector_x[this]*vector_y[vect]-vector_x[vect]*vector_y[this];
        vector_x[this]=x;
        vector_y[this]=y;
        vector_z[this]=z;
        return this;
    }
    return -1;
}
З.Ы. Спасибо ScorpioT1000 за помощь с идеей структурирования.

Отредактировано ScorpioT1000, 22.02.2012 в 13:39.
Старый 28.01.2012, 12:12
Clamp
Lost in space
offline
Опыт: 71,258
Активность:
MF:
"огоньки" двигаются не по прямой, как надо, а как бы подпрыгивают... что несколько портит эффект. Подозреваю, что там что-то не так с функцией WorldHeight.
высота даётся от склона, надо прибавлять уровень склона*его высоту каждый раз
Старый 28.01.2012, 12:32
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Clamp, я думал над этим... пока ниче толкового не придумал, не так давно я все таки вожусь с этим редактором.
MF добавил:
там косяк координат высот происходит именно на перепаде... надо будет посмотреть как я это в варе обходил =)
Старый 28.01.2012, 12:49
Clamp
Lost in space
offline
Опыт: 71,258
Активность:
MF:
надо будет посмотреть как я это в варе обходил
в варе учитывается высота склона, там GetPointZ() нормально работает
Старый 28.01.2012, 13:39
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Clamp, нашел одну зацепку... если поставить флаг игнорирование рельефа юниту летающему, то UnitSetHeight устанавливает абсолютную высоту... копаю в этом направлении.
MF добавил:
Собственно разобрался. Теперь все норм. Библиотека испытана =)
Теперь основной вопрос, слабо принять вызов и повторить, что то похожее? На вопросы буду отвечать, разобраться в библиотеке помогу =)
З.Ы. Карту выложу попозже =))) когда кто-нить че нить сделает... или же вообще ничего и никто не сделает, что будет печально.
Старый 28.01.2012, 15:38
Msey
????
offline
Опыт: 67,346
Активность:
MF, тут скорее второе, чем первое, тк в векторах мало кто шарит
Старый 28.01.2012, 16:05
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Msey, ну блин... я же писал когда то статейку, для варика конечно. Кто мешает разобраться? Да и я прекрасно понимаю, что тут могут человек 5 сделать так + человека 3 могут мне сказать, что я нубье и сделать круче. Тоади например =)
Старый 28.01.2012, 16:07
LLlypuK
Поналандили тут!
offline
Опыт: 42,125
Активность:
MF, тоади выгнали, кажется.
Старый 28.01.2012, 19:54
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
LLlypuK, жалко... он бы меня потроллил как в старые добрые времена и сказал, что все УГ.
По теме. жду добровольцев еще пару дней и потом разочаровываюсь в вас и выкладываю карту...
Кстати еще во время варика видел подобное на ютубе, решил попробывать и во всем разобрался сам. А тут даже библиотеку дал вам... ну что за такое? Стыдно товарищи...
Старый 28.01.2012, 20:16
Clamp
Lost in space
offline
Опыт: 71,258
Активность:
Toadcop
тут он, всё ок.
Лично мне влом, могу круче)
Но сессия/конкурс/статьи/отмазки
Старый 28.01.2012, 20:18
Mihahail
๏̯͡๏
offline
Опыт: 17,766
Активность:
Вектора - это хорошо.
Не хочу показаться болтуном, но вроде ничего сложного.
С редактором знаком плохо, поэтому вопрос. Как ослеживаются столкновения?
MF, не могу сейчас сделать карту, т.к. нет редактора, но попробую угадать, не против?
Создается юнит(декорация/эфект/хз), которому ставится в соответсвие вектор. Высчитываются координаты вектора как разница координат юнита и созданного эфекта. Полученная длина является значением ускорения(разумеется всё со своими коэффициентами), с которым движется эфект.
При нулевой длине вектора по XY(прохождение через юнита) эфект имеет какую-то скорость и не имеет ускорения. Затем - ускорение снова направлено к юниту.
Так как юнит умеет бегать, то с некоторой периодичностью нужно обновлять координаты векторов, поворачивая их не прямо на юнита, а чуть под меньшим углом, чтобы было вращение вокруг юнита.
Отскоки обрабатываться должны по идее из равенства углов падения и отражения. Единственное что я хз - как узнать угол падения(да и вообще отследить столкновение).
Мб я чего-то не заметил, мб ты и используешь "инерцию" шариков и система более физична, но я бы реализовывал это для какой-нить абилки именно так.
Старый 28.01.2012, 21:26
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Mihahail, ну по сути все верно. Там всего лишь вектор ускорения с постоянным модулем направленный на юнита + ограниченная сверху скорость обновляемая. Отследить столкновение с землей тоже просто в данном случае - "не уйдет ли на следующем перемещении даммик под землю?"
Начет вектора отражения - никаких углов не ищется. Беру нормаль в точке, строю проекцию вектора скорости на нормаль и дважды плюсую полученное к вектору скорости, получится точно то, что нужно =)
MF добавил:
Если конечно понадобится отслеживать столкновения с юнитами и декорациями... то тут все "просто" уже не получится, но думаю свои методы тоже можно найти.
Старый 28.01.2012, 21:31
Mihahail
๏̯͡๏
offline
Опыт: 17,766
Активность:
MF, постоянное ускорение?) разумно, но кошернее менять модуль скорости в зависимости от длины вектора между эфектом и юнитом. Имхо, офк)
С отражением да, я так и думал, проекция на нормаль будет отрицательная и всё получится. Найс)
А как ищется нормаль? Проверяются расстояния от эфекта до препятсвия? или проще?)
Старый 28.01.2012, 21:43
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Mihahail, есть такая штука - векторное произведение. Если вектора не колинеарны, то она в результате дает перпендикуляр к обоим. Причем там хитро, если направление умножения одно, то он смотрит в одну сторону, если другое, то в другую. Дальше, дело техники. Конечно мой алгоритм не обладает точностью и нормаль возможно строится не совсем к нужной нам точке, а к точке под юнитом... Но для данных целей этого хватает за глаза.
Старый 28.01.2012, 21:46
Тонг

offline
Опыт: 13,665
Активность:
MF, возьми точку прикрепления таргета как цель, она как раз по середине модели обычно
Старый 28.01.2012, 22:40
F3n1kz

offline
Опыт: 4,548
Активность:
Хмммм, завтра надо попробовать о_о
Старый 29.01.2012, 02:39
ScorpioT1000
Работаем
offline
Опыт: отключен
int vector_createXYZ(fixed x, fixed y, fixed z) {
заменить на
int vector_createXYZ(fixed x, fixed y, fixed z) {
    int i=0;
    while (isVectorAllocated(i))
    {
            i=i+1;
    }
    vector_allocated[i]=true;
    if(i >= vector_count) {
        vector_count=vector_count+1;
    }
    vector_x[i]=x;
    vector_y[i]=y;
    vector_z[i]=z;
    return i;
}
а то ты меня пугаешь =)

void vector_destroy(int this) {
вот здесь каунт уменьшать ни в коем случае нельзя, ведь ты убиваешь последний вектор, а не указанный из массива

bool vector_setY(int this, fixed y) {
и другие
в конце просто false возвращать, зачем 2 раза вызывать громоздкую функцию?

на будущее - это называется:
int vector_realMultiply(int this, fixed r) { // dot product
fixed vector_scalarMultiply(int this, int vect) { // cross product
ну а в целом круто, продолжай офк, буду следить)

Отредактировано ScorpioT1000, 29.01.2012 в 04:36.
Старый 29.01.2012, 03:27
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
ScorpioT1000, насчет конструктора - да, че-то я дал маху... дает знать годовое отсутствие практики такого рода. Насчет сеттеров, оптимизировать и так собирался. Насчет названий - думаю все еще причешу, особо не парился. Мне было главное убедиться, что все это заработает.
Старый 29.01.2012, 08:29
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
"В общем если интересно"
Все что не на гуи всегда интересно. Ты работал на Galaxy++?
Старый 29.01.2012, 11:32
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Зевс, нет, никакого стороннего софта не использовал. Сейчас мучаюсь с некоторыми аспектами и понимаю, что много чего не понимаю в РО. Но в плане кода от варика они не далеко ушли... правда все стало менее интуитивно.
Старый 29.01.2012, 12:02

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 10:06.