|
Математика Методы математического моделлирования, программирование математических концепций, роль математики в создании игр |
22.06.2011, 19:52
|
#1
|
Нуждающийся
Регистрация: 23.02.2011
Сообщений: 54
Написано 3 полезных сообщений (для 5 пользователей)
|
Перемещения в 3d пространстве.
Здравствуйте. Я реализую функции перемещения объекта в пространстве, относительно его нынешней позиции, как в блитце: Move Turn.
Я попытался сам допереть, но что-то не получается .
Кто знает, какую-нибудь литературу на это тему? И вообще кто-нибудь реализовал подобное? Если есть исходники (понятные) у кого, не отказался бы посмотреть!
Последний раз редактировалось 616}[aKeP, 23.06.2011 в 20:06.
|
(Offline)
|
|
22.06.2011, 19:54
|
#2
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Перемещения в 3d пространстве.
"Реализкю" - взял на заметку..
На чём пишешь, чё делаешь?
Матрицы? Тебе нужны матрицы или квартерионы..
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
23.06.2011, 00:45
|
#3
|
Нуждающийся
Регистрация: 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 в 20:07.
|
(Offline)
|
|
23.06.2011, 01:17
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Перемещения в 3d пространстве.
хм...
bool cWorldMatrix::Move(float x,float y,float z) { px+=x; py+=y; pz+=z; return TRUE; }
|
(Offline)
|
|
23.06.2011, 01:51
|
#5
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Перемещения в 3d пространстве.
ну это в глобальных коордах, а мув и турн блицевские по умолчанию были в локальных.
умножай вектор смещения на имеющуюся мировую матрицу, потом прибавляй полученное к позиции.
|
(Offline)
|
|
23.06.2011, 02:17
|
#6
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Перемещения в 3d пространстве.
Что-то я не вижу у него парентов и чайлдов... Да и я привел как раз в локальных. Вот с глобальными уже сложнее.
|
(Offline)
|
|
23.06.2011, 18:01
|
#7
|
Нуждающийся
Регистрация: 23.02.2011
Сообщений: 54
Написано 3 полезных сообщений (для 5 пользователей)
|
Ответ: Перемещения в 3d пространстве.
Да не все так просто, в блитце метод move не так реализован.
Ось z это направление объекта, x относительно его позиции это лево и право, а y это верх вниз.
Последний раз редактировалось 616}[aKeP, 23.06.2011 в 20:08.
|
(Offline)
|
|
23.06.2011, 18:08
|
#8
|
Нуждающийся
Регистрация: 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 в 20:08.
|
(Offline)
|
|
23.06.2011, 18:31
|
#9
|
Бывалый
Регистрация: 26.04.2009
Адрес: Россия, Уфа
Сообщений: 680
Написано 182 полезных сообщений (для 406 пользователей)
|
Ответ: Перемещения в 3d пространстве.
А что песать с ашибками апять в моде?Раздражаешь аднако
|
(Offline)
|
|
23.06.2011, 20:10
|
#10
|
Нуждающийся
Регистрация: 23.02.2011
Сообщений: 54
Написано 3 полезных сообщений (для 5 пользователей)
|
Ответ: Перемещения в 3d пространстве.
Ну, простите! Исправлюсь. В творческом порыве и не такое напишешь!
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.06.2011, 02:10
|
#11
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Перемещения в 3d пространстве.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.06.2011, 02:22
|
#12
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Перемещения в 3d пространстве.
Русские комменты.. Олег! Английский, ну нужно, очень нужно его знать, тем более столь техническому разработчику как ты..
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
24.06.2011, 04:56
|
#13
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Перемещения в 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(&matrix, ay, ax, az);
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 * y + thisRight * x + 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(&matrix, ay, ax, az); D3DXVECTOR3 localMove = new D3DXVECTOR3 (x,y,z); D3DXVECTOR4 resultMove;
D3DXVec3Transform(&resultMove, &localMove , &matrix);
px+= resultMove.x; py+= resultMove.y; pz+= resultMove.z; return TRUE; }
Последний раз редактировалось pax, 24.06.2011 в 15:13.
|
(Offline)
|
|
24.06.2011, 09:29
|
#14
|
ПроЭктировщик
Регистрация: 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 в 14:59.
|
(Offline)
|
|
24.06.2011, 13:36
|
#15
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Перемещения в 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?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:53.
|