Есть такое условие, объект находиться в точки [0,0], и ему надо передвинуться в любую из точек, например в [100,400] или [200,300] . Объясните пожалуйста, как можно рассчитывать вычисления координат что бы объект плавно двигался по прямой между этими точками. Если ли какое либо соотношения или формула вычисления. Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
Сообщение отредактировал kikas86 - Воскресенье, 09 Декабря 2012, 21:02
Можно обычной линейной интерполяцией например. Как-то так:
Code
CurrentX += (TargetX - CurrentX) * Delta; //(0; 1); от дельты зависит плавность \ скорость CurrentY += (TargetY - CurrentY) * Delta;
CurrentX, CurrentY - это текущее положение объекта ( [0; 0] например), TargetX, TargetY - координаты куда нужно переместиться. Но хоть интерполяция и линейная, но движение нелинейное , сначала оно более быстрое, потом в процессе замедляется. C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Дельту можно сделать равной 0.01 например или еще меньше . Лежит она в пределах от 0 до 1, и чем ближе к нулю - тем медленее C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Среда, 05 Декабря 2012, 15:26
Все спасибо большое! А есть какие либо другие способы? Просто интересно)
Ну можно через условия же:
Code
if (x < 200) x++; if (x > 200) x--;
//и с "y" точно так же
Просто, грубо и нуждается в доработке (если это float или если нужно делать x += 2, например. Можно проверять, попадает ли X в определенный диапазон около 200 [195; 205) и если попадает, то не выполнять движение). C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Просто, грубо и нуждается в доработке (если это float или если нужно делать x += 2, например. Можно проверять, попадает ли X в определенный диапазон около 200 [195; 205) и если попадает, то не выполнять движение).
Я это знаю -.- Не зря я учу directX. Хотя я уже это прошел в с++ консольном и в GDI Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
Сообщение отредактировал kikas86 - Среда, 05 Декабря 2012, 15:50
да 1 минус в условиях, будет работать не корректно.
Да, но можно доработать:
Code
const float Step = 5.0f;
float OffsetX = TargetX - CurrentX; if (OffsetX > Step) OffsetX = Step; if (OffsetX < -Step) OffsetX = -Step;
if ( (CurrentX > TargetX - 0.1f) && (CurrentX < TargetX + 0.1f) ) CurrentX += OffsetX; // тут по идее условие не обязательно, а на всякий случай, чтобы небыло "дребезжания" из-за неточности флоатов. Но его может и не быть.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Среда, 05 Декабря 2012, 15:54
Последний способ не подходит, т.к. если угол между точками будет больше или меньше 45 градусов, и не равный 90 и 180 то он по какой то координате закончит прибавление быстрее, ладно спасибо большое) Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
Последний способ не подходит, т.к. если угол между точками будет больше или меньше 45 градусов, и не равный 90 и 180 то он по какой то координате закончит прибавление быстрее
А я про прямую сразу и не увидал , тогда через тригонометрию надо (и это наиболее используемый вариант, т.к. мы еще получаем угол поворота объекта). Пример:
Во, большое спасибо, я в геометрии и тригонометрии не силен((( Если ты так разбираешься в тригонометрии, помоги еще с кое чем: как вершину крутить по кругу? То есть вращать объект. Пытался делать через матрицу, когда поворачиваю объект он - не знаю каким образом меняет свое движение... то есть не прямо например при x++, а вверх... Пытался так же через sin и cos... тоже самое получается... =( Что же делать? Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
Ну, это более математически верное движение по прямой, а так та же фигня, вид сбоку. Если нужен угол будет, все равно арктангенс считать, так что...
Quote (kikas86)
как вершину крутить по кругу? То есть вращать объект. Пытался делать через матрицу, когда поворачиваю объект он - не знаю каким образом меняет свое движение... то есть не прямо например при x++, а вверх...
NewX, NewY - новые координаты вершины, vX, vY - изначальнные координаты вершины, X0, Y0 - координаты точки вокруг которой вращаем вершину, ну и Angle - угол (в радианах).
P.S. Стоит немного поучить математику, т.к. в графике без нее ой как туго придется. C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Среда, 05 Декабря 2012, 18:36
Да я то хорошо знаю, ну знал когда то, у нас просто не ту математики в колледже))) Я просто не разбираюсь в sin, cos и тд..... и не разбирался не когда( Огромное спасибо за помощь, да математику надо учить, мне еще ЕГЭ сдавать при поступлении в институт(
Мм, наверное, если с математикой туго, то действительно проще и быстрее сделать через D3DX матрицы все это, ибо там вся эта математическая часть скрыта. Покажи код, где у тебя создается и рисуется спрайт, надо увидеть как ты 2д рисуешь. C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Надо делать через Rotate и Translate (две матрицы), а сами вершины должны быть фиксированы (размер спрайта только учитываем, он константен), с центром в (0, 0) например:
Добавлено (09.12.2012, 18:06) --------------------------------------------- Есть такой вопрос, как же сделать такой же поворот вершин как и в directx на openGL. пробовал по типу как и в directx через 2 матрицы.
Code
void Sprite::CreateCobe(float x, float y, int sx, int sy) { float x0 = -sx; float y0 = -sy; float x1 = sx; float y1 = sy; glPushMatrix();
но попытка не удалась. Помогите пожалуйста разобраться. Сделал, вроде бы нормально работает, но минусы: 1. Обьект ненмого то расширяеться то наоборот. 2. При x++ улетает с большой скоростью, при x+=0.0001 нормальная скорость, как это все исправить? Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
Сообщение отредактировал kikas86 - Воскресенье, 09 Декабря 2012, 19:24
Нефиг переключать "MatrixMode" и менять проекцию , ибо "GL_PROJECTION" зовут только когда нужно поменять матрицу проекции (ваш кэп), обычно делается это всего один раз за кадр перед отрисовкой вообще, после сразу же ставится "GL_MODELVIEW" и далее нигде не переключается, ибо обычно для 2д смысла это не имеет.
Т.е. перед отрисовкой кадра делается что-то вроде этого: