Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование в широком смысле слова > Математика

Математика Методы математического моделлирования, программирование математических концепций, роль математики в создании игр

Ответ
 
Опции темы
Старый 22.06.2011, 15:52   #1
616}[aKeP
Нуждающийся
 
Аватар для 616}[aKeP
 
Регистрация: 23.02.2011
Сообщений: 54
Написано 3 полезных сообщений
(для 5 пользователей)
Вопрос Перемещения в 3d пространстве.

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

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

Последний раз редактировалось 616}[aKeP, 23.06.2011 в 16:06.
(Offline)
 
Ответить с цитированием
Старый 22.06.2011, 15:54   #2
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: Перемещения в 3d пространстве.

"Реализкю" - взял на заметку..
На чём пишешь, чё делаешь?

Матрицы? Тебе нужны матрицы или квартерионы..
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Mr_F_ (22.06.2011), NitE (22.06.2011)
Старый 22.06.2011, 20:45   #3
616}[aKeP
Нуждающийся
 
Аватар для 616}[aKeP
 
Регистрация: 23.02.2011
Сообщений: 54
Написано 3 полезных сообщений
(для 5 пользователей)
Ответ: Перемещения в 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 не реализован.
Что мне понадобиться для реализации этого метода?

Последний раз редактировалось 616}[aKeP, 23.06.2011 в 16:07.
(Offline)
 
Ответить с цитированием
Старый 22.06.2011, 21:17   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,245 пользователей)
Ответ: Перемещения в 3d пространстве.

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

__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 22.06.2011, 21:51   #5
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,907
Написано 2,157 полезных сообщений
(для 5,843 пользователей)
Ответ: Перемещения в 3d пространстве.

ну это в глобальных коордах, а мув и турн блицевские по умолчанию были в локальных.
умножай вектор смещения на имеющуюся мировую матрицу, потом прибавляй полученное к позиции.
(Offline)
 
Ответить с цитированием
Старый 22.06.2011, 22:17   #6
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,245 пользователей)
Ответ: Перемещения в 3d пространстве.

Что-то я не вижу у него парентов и чайлдов... Да и я привел как раз в локальных. Вот с глобальными уже сложнее.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 23.06.2011, 14:01   #7
616}[aKeP
Нуждающийся
 
Аватар для 616}[aKeP
 
Регистрация: 23.02.2011
Сообщений: 54
Написано 3 полезных сообщений
(для 5 пользователей)
Ответ: Перемещения в 3d пространстве.

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

Последний раз редактировалось 616}[aKeP, 23.06.2011 в 16:08.
(Offline)
 
Ответить с цитированием
Старый 23.06.2011, 14:08   #8
616}[aKeP
Нуждающийся
 
Аватар для 616}[aKeP
 
Регистрация: 23.02.2011
Сообщений: 54
Написано 3 полезных сообщений
(для 5 пользователей)
Ответ: Перемещения в 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;
}
А вот как верх вниз влево вправо сделать?
Я без понятия!((

Последний раз редактировалось 616}[aKeP, 23.06.2011 в 16:08.
(Offline)
 
Ответить с цитированием
Старый 23.06.2011, 14:31   #9
Program23
Бывалый
 
Аватар для Program23
 
Регистрация: 26.04.2009
Адрес: Россия, Уфа
Сообщений: 680
Написано 182 полезных сообщений
(для 406 пользователей)
Ответ: Перемещения в 3d пространстве.

А что песать с ашибками апять в моде?Раздражаешь аднако
(Offline)
 
Ответить с цитированием
Старый 23.06.2011, 16:10   #10
616}[aKeP
Нуждающийся
 
Аватар для 616}[aKeP
 
Регистрация: 23.02.2011
Сообщений: 54
Написано 3 полезных сообщений
(для 5 пользователей)
Ответ: Перемещения в 3d пространстве.

Ну, простите! Исправлюсь. В творческом порыве и не такое напишешь!
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LLI.T.A.L.K.E.R. (23.06.2011)
Старый 23.06.2011, 22:10   #11
HolyDel
 
Регистрация: 25.09.2006
Сообщений: 6,030
Написано 1,469 полезных сообщений
(для 2,690 пользователей)
Ответ: Перемещения в 3d пространстве.

http://code.google.com/p/axelynx/sou...CPivot.cpp#293

http://code.google.com/p/axelynx/sou...th/mat4.cpp#62
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (24.06.2011)
Старый 23.06.2011, 22:22   #12
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: Перемещения в 3d пространстве.

Русские комменты.. Олег! Английский, ну нужно, очень нужно его знать, тем более столь техническому разработчику как ты..
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
HolyDel (23.06.2011), Mr_F_ (23.06.2011)
Старый 24.06.2011, 00:56   #13
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,245 пользователей)
Ответ: Перемещения в 3d пространстве.

Возможно так тогда (но синтаксис точный не воспроизведу, не пишу на С++ и на DX ):
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:

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;

__________________
Blitz3d to Unity Wiki

Последний раз редактировалось pax, 24.06.2011 в 11:13.
(Offline)
 
Ответить с цитированием
Старый 24.06.2011, 05:29   #14
YellowAfterlife
ПроЭктировщик
 
Аватар для YellowAfterlife
 
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений
(для 219 пользователей)
Ответ: Перемещения в 3d пространстве.

Сообщение от 616}[aKeP Посмотреть сообщение
А вот как верх вниз влево вправо сделать?
Я без понятия!((
Упрощенный вариант:
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 = полет вверх\вниз (относительно текущего поворота камеры)

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

Мой сайт-блог. Игры, обновления, примеры для Haxe, JavaScript(+HTML5), GameMaker, Love2d...

Последний раз редактировалось YellowAfterlife, 24.06.2011 в 10:59.
(Offline)
 
Ответить с цитированием
Старый 24.06.2011, 09:36   #15
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,245 пользователей)
Ответ: Перемещения в 3d пространстве.

Сообщение от YellowAfterlife Посмотреть сообщение
Упрощенный вариант:
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?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com