forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   передвижение с помощью матриц (http://forum.boolean.name/showthread.php?t=15333)

Mind 22.08.2011 13:22

передвижение с помощью матриц
 
Вот столкнулся с проблемой (т.к недавно перешел на С++):
Осуществляю передвижение объектом с помощью функции:

Код:

void MoveEntity(D3DXMATRIX& m,float dx,float dy,float dz)
{
 
  static float x,y,z;

  x += dx;
  y += dy;
  z += dz;

  m._11 = 1;  m._12 = 0;      m._13 = 0;  m._14 = 0;
  m._21 = 0;  m._22 = 1;      m._23 = 0;  m._24 = 0;
  m._31 = 0;  m._32 = 0;      m._33 = 1;  m._34 = 0;
  m._41 = x;  m._42 = y;        m._43 = -z;  m._44 = 1;

}

Но т.к я двигал один обьект все было норм, а как захотелось нсколько то понял что сделал ошибку - не надо инкриминировать x,y,z в функции т.к для последующего объекта будут прибавлены координать предыдущего.
Чет мозги не варят как можно сделать передвижение разных объектов с помощью одной функции?

Dream 22.08.2011 13:35

Ответ: передвижение с помощью матриц
 
Каково причина обьявления x,y,z статиками?

Mind 22.08.2011 13:57

Ответ: передвижение с помощью матриц
 
Цитата:

Сообщение от Dream (Сообщение 199661)
Каково причина обьявления x,y,z статиками?

Разве в этом проблема?
Я так понял когда объявляешь их статиками то каждый вызов функции не происходит перезапись участков памяти для переменных, а это экономия ресурсов.

Mind 22.08.2011 14:01

Ответ: передвижение с помощью матриц
 
Написал чуть модифицированную функцию но тут проблем еще больше:

Код:

void MoveEntity(D3DXMATRIX& m,float dx,float dy,float dz)
{
 
static float x,y,z;

  x = m._41 + dx;
  y = m._42 + dy;
  z = m._43 + dz;

  m._11 = 1;  m._12 = 0;          m._13 = 0;  m._14 = 0;
  m._21 = 0;  m._22 = 1;        m._23 = 0;  m._24 = 0;
  m._31 = 0;  m._32 = 0;        m._33 = 1;  m._34 = 0;
  m._41 = x;  m._42 = y;          m._43 = -z;  m._44 = 1;


}

Каковата ГНОМА тут присходит движение даже без переменных dx,dy,dz ... Без моего участия. :4to:

Mhyhr 22.08.2011 14:29

Ответ: передвижение с помощью матриц
 
зачем такие извращения с внутренностями матрицы?
чем D3DXMatrixTranslation(...) не угодил?

Mind 22.08.2011 14:43

Ответ: передвижение с помощью матриц
 
были проблемы со стандартными матрицами и с углами... да и к тому же хочется понять саму матрицу научится с ней работать ..

falcon 22.08.2011 14:55

Ответ: передвижение с помощью матриц
 
>>static
это не экономия ресурсов, компилятор умнее тебя и умеет экономить их эффективней.

бегло взглянул на вторую ф-цию, вроде всё норм (ток -z вроде не надо).
возможно порядок умножения где-то нарушен при установке матриц.
(под "без переменных" подразумиваются нулевые значения?)

Mind 22.08.2011 15:15

Ответ: передвижение с помощью матриц
 
Цитата:

Сообщение от falcon (Сообщение 199671)
>>static
бегло взглянул на вторую ф-цию, вроде всё норм (ток -z вроде не надо).
возможно порядок умножения где-то нарушен при установке матриц.
(под "без переменных" подразумиваются нулевые значения?)

1) m._41, m._42 ... имеют не нулевые значения их значения далеко за пределами 1 000 000 изначально :4to:
2) вторая функция не пашит именно из-за того что я проделываю операцию x = m._41 + dx; y ... ; z... ; Я даже не могу понять что происходит с камерой толи она отдаляеться далеко и поэтому я не вижу предмета, толи каким-то образом нарушаються матрици вида хз?

Mr_F_ 22.08.2011 15:23

Ответ: передвижение с помощью матриц
 
Цитата:

1) m._41, m._42 ... имеют не нулевые значения их значения далеко за пределами 1 000 000 изначально
в с++ переменные изначально не 0. они не инициализированы, т.е. содержат в себе мусор из памяти. ты должен вручную ставить им 0.

Mind 22.08.2011 17:07

Ответ: передвижение с помощью матриц
 
Все разобрался оказалось даже проще:
Код:

void MoveEntity(D3DXMATRIX& m,float dx,float dy,float dz)
{
 
  m._11 = 1;    m._12 = 0;          m._13 = 0;      m._14 = 0;
  m._21 = 0;    m._22 = 1;      m._23 = 0;      m._24 = 0;
  m._31 = 0;    m._32 = 0;      m._33 = 1;      m._34 = 0;
  m._41 += dx;  m._42 += dy;  m._43 += -dz;  m._44 = 1;

}

Токо после инициализации D3DXMATRIX matView,matViewPos(к примеру)...
нужно обьявлять явно матрици которые инициализированы и токо тогда все будет как надо перемещаться:
НАПРИМЕР:
D3DXMATRIX matWorldPos;

matWorldPos._11 = 1; matWorldPos._12 = 0; matWorldPos._13 = 0; matWorldPos._14 = 0;
matWorldPos._21 = 0; matWorldPos._22 = 1; matWorldPos._23 = 0; matWorldPos._24 = 0;
matWorldPos._31 = 0; matWorldPos._32 = 0; matWorldPos._33 = 1; matWorldPos._34 = 0;
matWorldPos._41 = 0; matWorldPos._42 = 0; matWorldPos._43 = 10; matWorldPos._44 = 1;
dev->SetTransform(D3DTS_WORLD,&matWorldPos);

falcon 22.08.2011 18:50

Ответ: передвижение с помощью матриц
 
об этом тебе mr_f и сказал.
к тому же можно воспользоваться D3DXMatrixIdentity()

.Squid 22.08.2011 19:26

Ответ: передвижение с помощью матриц
 
Доки не читай @ сразу пиши код.

Mind 23.08.2011 22:04

Ответ: передвижение с помощью матриц
 
А как сделать передвижение объекта с помощью матриц в локальных координатах?

falcon 24.08.2011 00:23

Ответ: передвижение с помощью матриц
 
может книжки почитаешь а? учебник там, по линейной математике? ну или Луну того же (там в общем-то доступно всё написано)
или доки хотя б какие-нибудь?
как-то не гоже спрашивать такие вещи..

кури матрицы перехода, и, подскажу с твоими локальными преобразованиями, произвдение матриц перехода составляет комбинацию преобразований. (вроде ж математически коректно выразился xD )
Отсюда и пляши, чо на чо умножить, что бы перемещать тела в локальных СК.. а лучше книжки почитать)

Mr_F_ 24.08.2011 00:51

Ответ: передвижение с помощью матриц
 
Цитата:

А как сделать передвижение объекта с помощью матриц в локальных координатах?
фактически тебе достаточно вектор сдвига умножить на матрицу ротации объекта -> получишь локально смотрящий сдвиг, прибавляешь к позиции.


Часовой пояс GMT +4, время: 18:57.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot