forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Математика (http://forum.boolean.name/forumdisplay.php?f=85)
-   -   Перемещения в 3d пространстве. (http://forum.boolean.name/showthread.php?t=14965)

616}[aKeP 22.06.2011 19:52

Перемещения в 3d пространстве.
 
Здравствуйте. Я реализую функции перемещения объекта в пространстве, относительно его нынешней позиции, как в блитце: Move Turn.
Я попытался сам допереть, но что-то не получается .

Кто знает, какую-нибудь литературу на это тему? И вообще кто-нибудь реализовал подобное? Если есть исходники (понятные) у кого, не отказался бы посмотреть!
:)

moka 22.06.2011 19:54

Ответ: Перемещения в 3d пространстве.
 
"Реализкю" - взял на заметку..
На чём пишешь, чё делаешь?

Матрицы? Тебе нужны матрицы или квартерионы..

616}[aKeP 23.06.2011 00:45

Ответ: Перемещения в 3d пространстве.
 
Пишу на с++ с directx.
Имеется класс мировой матрицы:

Цитата:

class cWorldMatrix
{
protected:

//Указатель на главный графический класс
cGraphics* pGraphics;

//Матрицы поворота, перемещения, проекции и вида
D3DXMATRIX Scale,RotateX,RotateY,RotateZ,Position;

//Общая матрица(мировая матрица)
D3DXMATRIX WorldMatrix;

//Координаты, углы и масштабирование

float px,py,pz;

float ax,ay,az;

float sx,sy,sz;

public:

//Конструктор
cWorldMatrix();

//Деструктор
~cWorldMatrix();

//Возвращает мировую матрицу
D3DXMATRIX GetWorldMatrix();

//Установка всех параметров
bool SetProperty(float x1,float y1,float z1,float x2,float y2,float z2,float x3,float y3,float z3);

//Установка координат
bool SetPosition(float x,float y,float z);

//Установка углов наклона
bool SetAngle(float x,float y,float z);

//Установка масштабирования
bool SetScale(float x,float y,float z);

//Перемещает относительно позиции
bool Move(float x,float y,float z);

//Поворачивает относительно углов поворота
bool Turn(float x,float y,float z);
};
Метод move не реализован.
Что мне понадобиться для реализации этого метода?

pax 23.06.2011 01:17

Ответ: Перемещения в 3d пространстве.
 
хм...
PHP код:

bool cWorldMatrix::Move(float x,float y,float z)
{
   
px+=x;
   
py+=y;
   
pz+=z;
   return 
TRUE;



Mr_F_ 23.06.2011 01:51

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

pax 23.06.2011 02:17

Ответ: Перемещения в 3d пространстве.
 
Что-то я не вижу у него парентов и чайлдов... Да и я привел как раз в локальных. Вот с глобальными уже сложнее.

616}[aKeP 23.06.2011 18:01

Ответ: Перемещения в 3d пространстве.
 
Да не все так просто, в блитце метод move не так реализован.
Ось z это направление объекта, x относительно его позиции это лево и право, а y это верх вниз.

616}[aKeP 23.06.2011 18:08

Ответ: Перемещения в 3d пространстве.
 
Вперед, назад то я сделал:

Цитата:

bool Move(float x,float y,float z)
{
//ax,ay,az-углы поворота объекта
x=x+sin(az)*z;
y=y+cos(az)*z;
z=z+sin(ax)*z;
}
А вот как верх вниз влево вправо сделать?
Я без понятия!((

Program23 23.06.2011 18:31

Ответ: Перемещения в 3d пространстве.
 
А что песать с ашибками апять в моде?Раздражаешь аднако

616}[aKeP 23.06.2011 20:10

Ответ: Перемещения в 3d пространстве.
 
Ну, простите! Исправлюсь. В творческом порыве и не такое напишешь!:) :ok:

HolyDel 24.06.2011 02:10

Ответ: Перемещения в 3d пространстве.
 
http://code.google.com/p/axelynx/sou...CPivot.cpp#293

http://code.google.com/p/axelynx/sou...th/mat4.cpp#62

moka 24.06.2011 02:22

Ответ: Перемещения в 3d пространстве.
 
Русские комменты.. Олег! Английский, ну нужно, очень нужно его знать, тем более столь техническому разработчику как ты..

pax 24.06.2011 04:56

Ответ: Перемещения в 3d пространстве.
 
Возможно так тогда (но синтаксис точный не воспроизведу, не пишу на С++ и на DX :)):
PHP код:

bool cWorldMatrix::Move(float x,float y,float z)
{
   
D3DXVECTOR3 up = new D3DXVECTOR3 (0,1,0);
   
D3DXVECTOR3 right = new D3DXVECTOR3 (1,0,0);
   
D3DXVECTOR3 forward = new D3DXVECTOR3 (0,0,1);

   
D3DXMATRIX  matrix;
   
D3DXMatrixRotationYawPitchRoll(&matrixayaxaz);

   
D3DXVECTOR4  thisUp;
   
D3DXVECTOR4  thisRight;
   
D3DXVECTOR4  thisForward;

   
D3DXVec3Transform(&thisUp, &up, &matrix);
   
D3DXVec3Transform(&thisRight, &right, &matrix);
   
D3DXVec3Transform(&thisForward, &forward, &matrix);

   
D3DXVec4Normalize(&thisUp, &thisUp);
   
D3DXVec4Normalize(&thisRight, &thisRight);
   
D3DXVec4Normalize(&thisForward, &thisForward); 
   
D3DXVECTOR4  resultMove =  thisUp thisRight thisForward z;

   
px+= resultMove.x;
   
py+= resultMove.y;
   
pz+= resultMove.z;
   return 
TRUE;



UPD по примеру от HolyDel:

PHP код:

bool cWorldMatrix::Move(float x,float y,float z)
{
   
D3DXMATRIX  matrix;
   
D3DXMatrixRotationYawPitchRoll(&matrixayaxaz);
   
D3DXVECTOR3  localMove = new D3DXVECTOR3 (x,y,z);
   
D3DXVECTOR4  resultMove;

   
D3DXVec3Transform(&resultMove, &localMove , &matrix);

   
px+= resultMove.x;
   
py+= resultMove.y;
   
pz+= resultMove.z;
   return 
TRUE;



YellowAfterlife 24.06.2011 09:29

Ответ: Перемещения в 3d пространстве.
 
Цитата:

Сообщение от 616}[aKeP (Сообщение 192800)
А вот как верх вниз влево вправо сделать?
Я без понятия!((

Упрощенный вариант:
Код:

float hpi = 1.5707963; // половина PI
// pan - вращение вокруг оси Z (горизонталь)
// tilt - вращение вокруг оси Y (вертикаль)
void move(float dx, float dy, float dz)
{
// перемещение вперед\назад:
x += cos(pan) * cos(tilt) * dx;
y += sin(pan) * cos(tilt) * dx;
z += sin(tilt) * dx;
// перемещение вправо\влево:
x += cos(pan + hpi) * dy;
y += sin(pan + hpi) * dy;
/* Поскольку roll не учитываем то Z тут не меняется */
// перемещение вверх\вниз:
x += cos(pan) * cos(tilt + hpi) * dz;
y += sin(pan) * cos(tilt + hpi) * dz;
z += sin(tilt + hpi) * dz;
}

Отредактировано:
dx = движение вперед назад
dy = "ходьба боком"
dz = полет вверх\вниз (относительно текущего поворота камеры)

Хорошего дня.

pax 24.06.2011 13:36

Ответ: Перемещения в 3d пространстве.
 
Цитата:

Сообщение от YellowAfterlife (Сообщение 192890)
Упрощенный вариант:
Код:

float hpi = 1,5707963; // половина PI
// pan - вращение вокруг оси Z (горизонталь)
// tilt - вращение вокруг оси Y (вертикаль)
void move(float dx, float dy, float dz)
{
// перемещение вперед\назад:
x += cos(pan) * cos(tilt) * dx;
y += sin(pan) * cos(tilt) * dx;
z += sin(tilt) * dx;
// перемещение вправо\влево:
x += cos(pan + hpi) * dy;
y += sin(pan + hpi) * dy;
/* Поскольку roll не учитываем то Z тут не меняется */
// перемещение вверх\вниз:
x += cos(pan) * cos(tilt + hpi) * dz;
y += sin(pan) * cos(tilt + hpi) * dz;
z += sin(tilt + hpi) * dz;
}

Хорошего дня.

Вперед/назад это dx? вправо/влево dy? вверх/вниз dz? :4to:


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

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