Понедельник, 18 Ноября 2024, 12:23

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Мои вопросы по С++
kikas86Дата: Среда, 05 Декабря 2012, 14:54 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Есть такое условие, объект находиться в точки [0,0], и ему надо передвинуться в любую из точек, например в [100,400] или [200,300] . Объясните пожалуйста, как можно рассчитывать вычисления координат что бы объект плавно двигался по прямой между этими точками. Если ли какое либо соотношения или формула вычисления.

Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.

Сообщение отредактировал kikas86 - Воскресенье, 09 Декабря 2012, 21:02
ArchidoДата: Среда, 05 Декабря 2012, 15:15 | Сообщение # 2
Сэнсэй
Сейчас нет на сайте
Можно обычной линейной интерполяцией например. Как-то так:

Code

CurrentX += (TargetX - CurrentX) * Delta; //(0; 1); от дельты зависит плавность \ скорость
CurrentY += (TargetY - CurrentY) * Delta;


CurrentX, CurrentY - это текущее положение объекта ( [0; 0] например), TargetX, TargetY - координаты куда нужно переместиться. Но хоть интерполяция и линейная, но движение нелинейное smile , сначала оно более быстрое, потом в процессе замедляется.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
kikas86Дата: Среда, 05 Декабря 2012, 15:21 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
Спасибо сейчас попробую)
хм... А оно слишком быстро не будет?)))


Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
ArchidoДата: Среда, 05 Декабря 2012, 15:25 | Сообщение # 4
Сэнсэй
Сейчас нет на сайте
Quote (kikas86)
хм... А оно слишком быстро не будет?)))

Дельту можно сделать равной 0.01 например или еще меньше smile . Лежит она в пределах от 0 до 1, и чем ближе к нулю - тем медленее smile


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Среда, 05 Декабря 2012, 15:26
kikas86Дата: Среда, 05 Декабря 2012, 15:30 | Сообщение # 5
постоянный участник
Сейчас нет на сайте
Все спасибо большое! А есть какие либо другие способы? Просто интересно)

Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.

Сообщение отредактировал kikas86 - Среда, 05 Декабря 2012, 15:31
ArchidoДата: Среда, 05 Декабря 2012, 15:40 | Сообщение # 6
Сэнсэй
Сейчас нет на сайте
Quote (kikas86)
Все спасибо большое! А есть какие либо другие способы? Просто интересно)

Ну можно через условия же:

Code

if (x < 200) x++;
if (x > 200) x--;

//и с "y" точно так же

Просто, грубо и нуждается в доработке (если это float или если нужно делать x += 2, например. Можно проверять, попадает ли X в определенный диапазон около 200 [195; 205) и если попадает, то не выполнять движение).


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
kikas86Дата: Среда, 05 Декабря 2012, 15:47 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
да 1 минус в условиях, будет работать не корректно.

Добавлено (05.12.2012, 15:47)
---------------------------------------------
Quote (Archido)
Просто, грубо и нуждается в доработке (если это float или если нужно делать x += 2, например. Можно проверять, попадает ли X в определенный диапазон около 200 [195; 205) и если попадает, то не выполнять движение).

Я это знаю -.- Не зря я учу directX. Хотя я уже это прошел в с++ консольном и в GDI


Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.

Сообщение отредактировал kikas86 - Среда, 05 Декабря 2012, 15:50
ArchidoДата: Среда, 05 Декабря 2012, 15:54 | Сообщение # 8
Сэнсэй
Сейчас нет на сайте
Quote (kikas86)
да 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
kikas86Дата: Среда, 05 Декабря 2012, 16:31 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
Последний способ не подходит, т.к. если угол между точками будет больше или меньше 45 градусов, и не равный 90 и 180 то он по какой то координате закончит прибавление быстрее, ладно спасибо большое)

Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
ArchidoДата: Среда, 05 Декабря 2012, 17:07 | Сообщение # 10
Сэнсэй
Сейчас нет на сайте
Quote (kikas86)
Последний способ не подходит, т.к. если угол между точками будет больше или меньше 45 градусов, и не равный 90 и 180 то он по какой то координате закончит прибавление быстрее

А я про прямую сразу и не увидал smile , тогда через тригонометрию надо (и это наиболее используемый вариант, т.к. мы еще получаем угол поворота объекта). Пример:
Code

float PosX = 0, PosY = 0;
float TargetX = 400, TargetY = 400;
float Angle = 0;

...

const float Step = 0.05f;
Angle = atan2 (TargetY - PosY, TargetX - PosX);

if ( sqrt( sqr(TargetX - PosX) +sqr(TargetY - PosY) ) > Step * 2 ) {
PosX += cos (Angle) * Step;
PosY += sin (Angle) * Step;
}


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Среда, 05 Декабря 2012, 17:13
kikas86Дата: Среда, 05 Декабря 2012, 17:50 | Сообщение # 11
постоянный участник
Сейчас нет на сайте
Во, большое спасибо, я в геометрии и тригонометрии не силен(((
Если ты так разбираешься в тригонометрии, помоги еще с кое чем:
как вершину крутить по кругу? То есть вращать объект. Пытался делать через матрицу, когда поворачиваю объект он - не знаю каким образом меняет свое движение... то есть не прямо например при x++, а вверх...
Пытался так же через sin и cos... тоже самое получается... =(
Что же делать?


Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
-Mikle-Дата: Среда, 05 Декабря 2012, 18:08 | Сообщение # 12
Изобретатель велосипедов
Сейчас нет на сайте
Зачем всё это? Тем более, что это неправильно. Всё проще:
Code
  
D3DVector2 Pos = vec2(0, 0);   
D3DVector2 Target = vec2(400, 400);   
float Speed = 0.1;   

void tick (float dt)
{
   D3DVector2 v;
   v = D3DXVec2Normalize (Target - Pos);
   Pos += v * Speed * dt;
}

dt - время, прошедшее с прошлого кадра.
Писал без среды C++, мог ошибиться.


Сообщение отредактировал -Mikle- - Среда, 05 Декабря 2012, 18:10
kikas86Дата: Среда, 05 Декабря 2012, 18:11 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
Хм... Я проверил все правильно.

Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
ArchidoДата: Среда, 05 Декабря 2012, 18:34 | Сообщение # 14
Сэнсэй
Сейчас нет на сайте
Quote (kikas86)
Хм... Я проверил все правильно.

Ну, это более математически верное движение по прямой, а так та же фигня, вид сбоку. Если нужен угол будет, все равно арктангенс считать, так что...

Quote (kikas86)
как вершину крутить по кругу? То есть вращать объект. Пытался делать через матрицу, когда поворачиваю объект он - не знаю каким образом меняет свое движение... то есть не прямо например при x++, а вверх...


Вот вращение вершины вокруг заданной точки:
Code

NewX = X0 + (vX - X0) * cos(Angle) - (vY - Y0) * sin(Angle);
NewY = Y0 + (vY - Y0) * cos(Angle) + (vX - X0) * sin(Angle);

NewX, NewY - новые координаты вершины, vX, vY - изначальнные координаты вершины, X0, Y0 - координаты точки вокруг которой вращаем вершину, ну и Angle - угол (в радианах).

P.S. Стоит немного поучить математику, т.к. в графике без нее ой как туго придется.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Среда, 05 Декабря 2012, 18:36
kikas86Дата: Среда, 05 Декабря 2012, 20:30 | Сообщение # 15
постоянный участник
Сейчас нет на сайте
Да я то хорошо знаю, ну знал когда то, у нас просто не ту математики в колледже)))
Я просто не разбираюсь в sin, cos и тд..... и не разбирался не когда(
Огромное спасибо за помощь, да математику надо учить, мне еще ЕГЭ сдавать при поступлении в институт(

Добавлено (05.12.2012, 20:30)
---------------------------------------------
Quote (Archido)
Вот вращение вершины вокруг заданной точки:

Вот думаю а как сделать поворот 2 полигонов, тоесть 1 спрайта... так же?

Code
       float X0 = pos.x+size.x/2;
     float Y0 = pos.y+size.y/2;
     float vX0 = pos.x;
     float vY0  = pos.y;

     float X1 = (pos.x + size.x)-size.x/2;
     float Y1 = (pos.y + size.y)-size.y/2;
     float vX1 = (pos.x + size.x);
     float vY1  = (pos.y + size.y);
      float Angle = 2;

      float x0 = X0 + (vX0 - X0) * cos(Angle) - (vY0 - Y0) * sin(Angle);
      float y0 = Y0 + (vY0 - Y0) * cos(Angle) + (vX0 - X0) * sin(Angle);
      float x1 = X1 + (vX1 - X1) * cos(Angle) - (vY1 - Y1) * sin(Angle);
      float y1 = Y1 + (vY1 - Y1) * cos(Angle) + (vX1 - X1) * sin(Angle);

   float x2 = 0;
   float y2 = 0;
   float x3 = 1;
   float y3 = 1;

      Vertex_Pos Vert[] =
      {
          Vertex_Pos(D3DXVECTOR3(x0, y0, 0.0f), D3DXVECTOR2(x2, y2)),
          Vertex_Pos(D3DXVECTOR3(x1, y0, 0.0f), D3DXVECTOR2(x3, y2)),
          Vertex_Pos(D3DXVECTOR3(x0, y1, 0.0f), D3DXVECTOR2(x2, y3)),
          Vertex_Pos(D3DXVECTOR3(x1, y1, 0.0f), D3DXVECTOR2(x3, y3))
      };

У меня получилось вот так, но все же не работает(


Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.

Сообщение отредактировал kikas86 - Среда, 05 Декабря 2012, 20:38
ArchidoДата: Четверг, 06 Декабря 2012, 11:58 | Сообщение # 16
Сэнсэй
Сейчас нет на сайте
Quote (kikas86)
У меня получилось вот так, но все же не работает(

Мм, наверное, если с математикой туго, то действительно проще и быстрее сделать через D3DX матрицы все это, ибо там вся эта математическая часть скрыта. Покажи код, где у тебя создается и рисуется спрайт, надо увидеть как ты 2д рисуешь.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
kikas86Дата: Четверг, 06 Декабря 2012, 17:20 | Сообщение # 17
постоянный участник
Сейчас нет на сайте
Через матрицу тупо, я пробовал, там когда x++, то при повороте спрайт идет в другую сторону

Quote (Archido)
Покажи код, где у тебя создается и рисуется спрайт, надо увидеть как ты 2д рисуешь.



Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.

Сообщение отредактировал kikas86 - Четверг, 06 Декабря 2012, 17:20
ArchidoДата: Четверг, 06 Декабря 2012, 17:51 | Сообщение # 18
Сэнсэй
Сейчас нет на сайте
Надо делать через Rotate и Translate (две матрицы), а сами вершины должны быть фиксированы (размер спрайта только учитываем, он константен), с центром в (0, 0) например:
Code

float x0 = -size.x * 0.5f;   
float y0 = -size.y * 0.5f;   
float x1 = size.x * 0.5f;   
float y1 = size.y * 0.5f;

...

//перед отрисовкой
D3DXMATRIX mRotate, mTranslate, mResult;
D3DXMatrixIdentity(&mRotate);
D3DXMatrixIdentity(&mTranslate);

D3DXMatrixRotationZ(&mRotate, Angle);  //тут угол (в радианах)
D3DXMatrixTranslation(&mTranslate, -pos.x, -pos.y, 0); //тут позиция

D3DXMatrixMultiply(&mResult, &mRotate, &mTranslate); //перемножаем

pDirect3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*) &mResult);

...

pDirect3DDevice->SetFVF(D3DFVF_XYZ|D3DFVF_TEX1);   
DPUP(D3DPT_TRIANGLESTRIP, 2, Vert, sizeof(Vertex_Pos));


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Четверг, 06 Декабря 2012, 17:52
kikas86Дата: Воскресенье, 09 Декабря 2012, 18:06 | Сообщение # 19
постоянный участник
Сейчас нет на сайте
Хм... все же почему то поменялось движение...
надо разобраться!

Добавлено (06.12.2012, 18:33)
---------------------------------------------
Спасибо большое!

Добавлено (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();

      glTranslatef(-x,-y,0);
      glRotatef(45,0.0f,0.0f,1.0f);
      glMatrixMode(GL_PROJECTION);
      glBegin(GL_QUADS);
          glVertex2f(x0,y1);
          glVertex2f(x1,y1);
          glVertex2f(x1,y0);
          glVertex2f(x0,y0);
   glEnd();
      glPopMatrix();
      glMatrixMode(GL_MODELVIEW);
}

но попытка не удалась. Помогите пожалуйста разобраться.
Сделал, вроде бы нормально работает, но минусы:
1. Обьект ненмого то расширяеться то наоборот.
2. При x++ улетает с большой скоростью, при x+=0.0001 нормальная скорость, как это все исправить?


Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.

Сообщение отредактировал kikas86 - Воскресенье, 09 Декабря 2012, 19:24
ArchidoДата: Воскресенье, 09 Декабря 2012, 20:16 | Сообщение # 20
Сэнсэй
Сейчас нет на сайте
Нефиг переключать "MatrixMode" и менять проекцию smile , ибо "GL_PROJECTION" зовут только когда нужно поменять матрицу проекции (ваш кэп), обычно делается это всего один раз за кадр перед отрисовкой вообще, после сразу же ставится "GL_MODELVIEW" и далее нигде не переключается, ибо обычно для 2д смысла это не имеет.

Т.е. перед отрисовкой кадра делается что-то вроде этого:
Code

glMatrixMode(GL_PROJECTION);      
glLoadIdentity();   
gluOrtho2D(...);

glMatrixMode(GL_MODELVIEW);    
glLoadIdentity();

После этого glMatrixMode можно не трогать. Ну, а далее все так же:
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();   
        glTranslatef(-x,-y,0);   
        glRotatef(45,0.0f,0.0f,1.0f);   
     
        glBegin(GL_QUADS);   
            glVertex2f(x0,y1);   
            glVertex2f(x1,y1);   
            glVertex2f(x1,y0);   
            glVertex2f(x0,y0);   
       glEnd();   
       glPopMatrix();   
   }


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Воскресенье, 09 Декабря 2012, 20:17
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг