Create site free
Векторы в 3д (2) - Решение серьезных вопросов - Разработка игр на Game Maker (Advanced Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 2 из 2«12
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Advanced Mode) » Решение серьезных вопросов » Векторы в 3д (движени вдоль наклонной плоскости)
Векторы в 3д
Ang3L Дата: Суббота, 27.12.2008, 13:48 | Сообщение # 21
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Maverick, почитай.


Blogpost
 
Maverick Дата: Суббота, 27.12.2008, 15:24 | Сообщение # 22
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
спс
 
Ang3L Дата: Суббота, 27.12.2008, 19:13 | Сообщение # 23
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Maverick, помогла хоть статья то? Я не посмотрел, что там только один способ (через кватернионы, кстати в Doom III видал, в заголовках к SDK). Я думал, что там и про углы Эйлера, а там их не было.


Blogpost
 
Maverick Дата: Воскресенье, 28.12.2008, 08:50 | Сообщение # 24
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
спс за то что хотябы нашел статью ) Короче кто работал на Блитз3Д? там есть такая весчь - AlignToVector - по какому принципу она работает?
 
NewStrannik Дата: Воскресенье, 28.12.2008, 21:34 | Сообщение # 25
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
Вот по такому наверно... xD
Code
Function AlignToVector(vx#,vy#,vz#,axis,rate#=1.0)

       Local pitch#=Abs(EntityPitch())
       Local yaw#=Abs(EntityYaw())
       Local roll#=Abs(EntityRoll())

       Select axis

        Case 1

         Local dest_yaw#=Abs(ATan2(vz#,vx#))
         Local dest_roll#=Abs(ATan2(vy#,vx#))

         yaw#=UpdateValue#(yaw#,dest_yaw#,rate#)
         roll#=UpdateValue#(roll#,dest_roll#,rate#)

        C  a se 2

         Local dest_pitch#=Abs(ATan2(vz#,vy#))
         Local dest_roll#=Abs(-ATan2(vx#,vy#))

         pitch#=UpdateValue#(pitch#,dest_pitch#,rate#)
         roll#=UpdateValue#(roll#,dest_roll#,rate#)  

        C    ase  3

         Local dest_pitch#=Abs(-ATan2(vy#,vz#))
         Local dest_yaw#=Abs(-ATan2(vx#,vz#))

         pitch#=UpdateValue#(pitch#,dest_pitch#,rate#)
         yaw#=UpdateValue#(yaw#,dest_yaw#,rate#)

       E   nd  Select

       Self.RotateEntity pitch#,yaw#,roll#

End Function
             
Function UpdateValue#(current#,destination#,rate#)

       'rate#=1.0/rate#
             
       current#=current#+((destination#-current#)*rate#)

       Return current#
             
End Function

entity - entity handle
vector_x# - vector x
vector_y# - vector y
vector_z# - vector z

axis - axis of entity that will be aligned to vector
1: x-axis
2: y-axis
3: z-axis

rate# (optional) - rate at which entity is aligned from current orientation to vector orientation. Should be in the range 0 to 1, 0 for smooth transition and 1 for 'snap' transition. Defaults to 1.

На гамаке это будет выглядеть примерно так (йа делал на быструю руку, по ентому наверно будет кривовато):

Code
#define AlignToVector
//AlignToVector(pitch, yaw, roll, vx, vy, vz, axis, rate)
var _pitch, _yaw, _roll, _vx, _vy, _vz, _axis, _rate, _dest_yaw, _dest_pitch, _dest_roll;

_pitch = abs(argument0);
_yaw   = abs(argument1);
_roll  = abs(argument2);

_vx    = argument3;
_vy    = argument4;
_vz    = argument5;

_axis  = argument6;
_rate  = argument7;

switch (axis)
{
        case 1: _dest_yaw  = abs(arctan2(_vz,_vx));
                _dest_roll = abs(arctan2(_vy,_vx));
                    
                _yaw       = UpdateValue(_yaw ,_dest_yaw ,_rate);
                _roll      = UpdateValue(_roll,_dest_roll,_rate);
                    
                break;
            
        case 2: _dest_pitch = abs(arctan2(vz,vy));
      _dest_roll  = abs(-arctan2(vx,vy));

                _pitch      = UpdateValue(pitch,dest_pitch,rate);
      _roll       = UpdateValue(roll,dest_roll,rate);
                     
                break;

        case 3: _dest_pitch = abs(-arctan2(vy,vz));
      _dest_yaw   = abs(-arctan2(vx,vz));

      _pitch      = UpdateValue(pitch,dest_pitch,rate);
      _yaw        = UpdateValue(yaw,dest_yaw,rate);

                break;
}

self.pitch = _pitch;
self.yaw   = _yaw;
self.roll  = _roll;
#define UpdateValue
//UpdateValue(current,destination,rate)
var _current, _rate;
_rate        = 1 / argument2;
_current     = argument0+((argument1-argument0)*_rate);
return _current;

P.S.: Oh my.. GOOGLE!! XDDD


Сообщение отредактировал NewStrannik - Воскресенье, 28.12.2008, 21:40
 
Maverick Дата: Воскресенье, 28.12.2008, 22:43 | Сообщение # 26
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
вот это уже интереснее ) щя поизучаем

Добавлено (28.12.2008, 21:53)
---------------------------------------------
ты забыл везде radtodeg'и xD и кое где имена переменных перепутаны.

Добавлено (28.12.2008, 22:43)
---------------------------------------------
так, я кажецо знаю короче в чем дело:
два вопроса
1) как повернуть вектор вокруг произвольной оси
2) как узнать угол между векторами относительно произвольной оси?

 
NewStrannik Дата: Понедельник, 29.12.2008, 12:54 | Сообщение # 27
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
Maverick, ну насчёт переменных - ясень пень, торопился ведь.. а вот рэдтудеги везде втыкать не надо: 3 дегтурэда вначале и 3 рэдтудега в конце, пусть расчёты в радианах будут))

Насчёт первого глянь сюда:)

 
Maverick Дата: Понедельник, 29.12.2008, 14:30 | Сообщение # 28
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
Я там уже смотрел и аффтар там ясно написал что не знает как это работает. Я смотрел.... там почемуто три вектора какихт в исходе получаецо... К томуже что там делает Back()? Накой мне в исходе три вектора, если я поворачиваю углы? ) У меня есть поворот камеры в горизонтальной плоскости. Это УГОЛ а не вектор, ясно? Мне надо повернуть камеру на этот угол не относительно вертикальной оси, а относительно нормали плоскости. Вот...

Добавлено (29.12.2008, 14:09)
---------------------------------------------
Щя короче попробую одну весчь.... Есть такие псевдовектора - типа ось поворота+угол - тоесть это четырехмерный вектор. Помоему он называецо кватернион.

Добавлено (29.12.2008, 14:30)
---------------------------------------------
Так, все, я на пути к решению похоже )
Как вычислить углы, на которые поворачивает данная(любая) матрица поворота?

 
NewStrannik Дата: Понедельник, 29.12.2008, 14:41 | Сообщение # 29
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
cCoords cCoords::Back() - обратная трансформация.

Сама функция поворота вектора вокруг произвольной оси должна иметь три шага:
1. Трансформировать ось поворота к координатной оси
2. Повернуть xD
3. Сделать обратную трансформацию
Как я понял отсюда.

Хм..



Сообщение отредактировал NewStrannik - Понедельник, 29.12.2008, 14:43
 
Maverick Дата: Понедельник, 29.12.2008, 20:25 | Сообщение # 30
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
поизучаем-с )

Добавлено (29.12.2008, 20:25)
---------------------------------------------
вот ТЕПЕРЬ точно SOLVED :P А помог в этот раз 3дмакс. Я в нем наглядно прямо ворочал вектора до совпадения. Так ну че, основа движка есть =)



Сообщение отредактировал Maverick - Понедельник, 29.12.2008, 15:28
 
NewStrannik Дата: Вторник, 30.12.2008, 13:02 | Сообщение # 31
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
Maverick, ты в чём делаешь свой движок?
 
Maverick Дата: Вторник, 30.12.2008, 13:45 | Сообщение # 32
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
В ГМ есессно :P с подключением дллки Ultimate 3D.
 
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Advanced Mode) » Решение серьезных вопросов » Векторы в 3д (движени вдоль наклонной плоскости)
Страница 2 из 2«12
Поиск:



Сообщество Gmaker.SU 2005-2012
Используются технологии uCoz
Простой вход