SetObjectRotateToPoint -
iEnemY - 01.01.2012
Здравствуйте. С новым годом, кстати.
Так вот, нужна одна функция. Так как в математике не силён, не могу сам её написать.
Что нужно: поставить объекту вращение в сторону определённых координат - X, Y, Z.
Для чего: при пуске с вертолёта ракеты, она летит вперёд 25 метров, разворачивается и летит с утроенной скоростью в сторону куда прицелился игрок, поворачивается носом в сторону того места, где она взорвётся. Так вот, из всего этого я сделал вообще всё, кроме нормального разворота в сторону взрыва. Нашёл какую то функцию, которая якобы это делает. Так вот, по осям rY и rZ она вращается нормально, а вот по rX не поворачивается. Не подскажите как это реализовать? Вот та функция которую я нашёл (автор естестно не я). В этой функции вообще нету вращения по rX.
pawn Код:
stock SetObjectToFaceCords
(objectid,
Float:x1,
Float:y1,
Float:z1
){ // SetObjectToFaceCords() By LucifeR // // LucifeR@vgames.co.il // // setting the objects cords new Float:x2,
Float:y2,
Float:z2;
GetObjectPos
(objectid, x2,y2,z2
);
// setting the distance values new Float:DX
= floatabs(x2
-x1
);
new Float:DY
= floatabs(y2
-y1
);
new Float:DZ
= floatabs(z2
-z1
);
// defining the angles and setting them to 0 new Float:yaw
= 0;
new Float:pitch
= 0;
// check that there isnt any 0 in one of the distances, // if there is any use the given parameters: if(DY
== 0 || DX
== 0) { if(DY
== 0 && DX
> 0) { yaw
= 0;
pitch
= 0;
} else if(DY
== 0 && DX
< 0) { yaw
= 180;
pitch
= 180;
} else if(DY
> 0 && DX
== 0) { yaw
= 90;
pitch
= 90;
} else if(DY
< 0 && DX
== 0) { yaw
= 270;
pitch
= 270;
} else if(DY
== 0 && DX
== 0) { yaw
= 0;
pitch
= 0;
} } // calculating the angale using atan else // non of the distances is 0. { // calculatin the angles yaw
= atan(DX
/DY
);
pitch
= atan(floatsqroot(DX
*DX
+ DZ
*DZ
) / DY
);
// there are three quarters in a circle, now i will // check wich circle this is and change the angles // according to it. if(x1
> x2
&& y1
<= y2
) { yaw
= yaw
+ 90;
pitch
= pitch
- 45;
} else if(x1
<= x2
&& y1
< y2
) { yaw
= 90 - yaw;
pitch
= pitch
- 45;
} else if(x1
< x2
&& y1
>= y2
) { yaw
= yaw
- 90;
pitch
= pitch
- 45;
} else if(x1
>= x2
&& y1
> y2
) { yaw
= 270 - yaw;
pitch
= pitch
+ 315;
} if(z1
< z2
) pitch
= 360-pitch;
} // setting the object rotation (should be twice cuz of lame GTA rotation system) SetObjectRot
(objectid,
0,
0, yaw
);
SetObjectRot
(objectid,
0, pitch, yaw
);
return 1;
}
Может у кого либо есть другая подобная функция? Если есть, поделитесь пожалуйста.
Re: SetObjectRotateToPoint -
OKStyle - 01.01.2012
Теперь можно уже в MoveObject задавать поворот по осям. Посмотри скрипт пиратских кораблей, входящий в базовый состав материалов сервера.
Re: SetObjectRotateToPoint -
iEnemY - 01.01.2012
Спасибо конечно, но...
pawn Код:
new Float:g[3]; GetAimPoint(is, 50, 225, g[0], g[1], g[2]);
new t = MoveObject(obj, g[0], g[1], g[2], 66.6, g[0], g[1], g[2]);
Объект конечно вращается, но оооочень медленно, т.е. пока он успеет завершить вращение, ракета уже взорвется.
- - - - -
Впринцепи решаемо установлением угла поворота той функцией, а затем добиваем угла поворота с помощью MoveObject
Re: SetObjectRotateToPoint -
Mr.Merlin - 02.01.2012
Я не пойму, что мешает скорость поворота поставить высокую? Ты же делаешь самонаводящуюся ракету...
Re: SetObjectRotateToPoint -
iEnemY - 02.01.2012
Эм... момент. Там же можно установить только скорость движения. Там нету упоминания про скорость поворота. По крайней мере в MoveObject.
Re: SetObjectRotateToPoint -
CrunkBankS - 02.01.2012
При движении объект может вращаться, т.е скорость движения определяет скорость поворота
pawn Код:
MoveObject(objectid, Float:X, Float:Y, Float:Z, Float:Speed, Float:RotX = -1000.0, Float:RotY = -1000.0, Float:RotZ = -1000.0)
Re: SetObjectRotateToPoint -
Serafim_sd - 02.01.2012
да все равно объект поворачивается на нужный угол только к концу движения, так что надо создавать промежуточное движение, во время которого объект повернется, а потом уже повернутый полетит в нужную сторону...
Re: SetObjectRotateToPoint -
iEnemY - 03.01.2012
Дык ракета иногда летит 5 метров, а иногда и 300 метров (смотря куда игрок целится). Ракета сначала вылетает из ракетной установки на самолёте\вертолёте, летит вперёд 20 метров (начальная скорость - скорость вертолёта\самолёта + 20 кмч), затем поворачивается в сторону цели, и летит уже туда. Но в 40% случаев ракета летит боком

А это уже больше похоже на бомбардировку...
Re: SetObjectRotateToPoint -
eakwarp - 03.01.2012
Что мешает сделать путь ракеты деленный на отрезки? Ракета летит по параболе, так? Так. Ну и рассчитывайте движение и поворот по этой самой параболе отрезками.
Re: SetObjectRotateToPoint -
iEnemY - 03.01.2012
К сожалению, рассчёт по параболе не осилил. Ракета летит по прямым: От точки А (верталёт), к точке Б (20 метров от точки старта), до точки С (точка взрыва). Расстояние от А до Б одинаковое, а вот от Б до С всегда разное. Да проблему уже решил, но хотелось бы улучшить ту функцию, вдруг кто знает как.