| Векторы в 3д |
|
Ang3L
| Дата: Суббота, 27.12.2008, 13:48 | Сообщение # 21 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
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.
|
| |
| |
|
|