01.01.2012, 02:36
Здравствуйте. С новым годом, кстати.
Так вот, нужна одна функция. Так как в математике не силён, не могу сам её написать.
Что нужно: поставить объекту вращение в сторону определённых координат - X, Y, Z.
Для чего: при пуске с вертолёта ракеты, она летит вперёд 25 метров, разворачивается и летит с утроенной скоростью в сторону куда прицелился игрок, поворачивается носом в сторону того места, где она взорвётся. Так вот, из всего этого я сделал вообще всё, кроме нормального разворота в сторону взрыва. Нашёл какую то функцию, которая якобы это делает. Так вот, по осям rY и rZ она вращается нормально, а вот по rX не поворачивается. Не подскажите как это реализовать? Вот та функция которую я нашёл (автор естестно не я). В этой функции вообще нету вращения по rX.
Может у кого либо есть другая подобная функция? Если есть, поделитесь пожалуйста.
Так вот, нужна одна функция. Так как в математике не силён, не могу сам её написать.
Что нужно: поставить объекту вращение в сторону определённых координат - 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;
}