SetObjectRotateToPoint
#1

Здравствуйте. С новым годом, кстати.
Так вот, нужна одна функция. Так как в математике не силён, не могу сам её написать.
Что нужно: поставить объекту вращение в сторону определённых координат - 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;
}
Может у кого либо есть другая подобная функция? Если есть, поделитесь пожалуйста.
Reply
#2

Теперь можно уже в MoveObject задавать поворот по осям. Посмотри скрипт пиратских кораблей, входящий в базовый состав материалов сервера.
Reply
#3

Спасибо конечно, но...
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
Reply
#4

Я не пойму, что мешает скорость поворота поставить высокую? Ты же делаешь самонаводящуюся ракету...
Reply
#5

Эм... момент. Там же можно установить только скорость движения. Там нету упоминания про скорость поворота. По крайней мере в MoveObject.
Reply
#6

При движении объект может вращаться, т.е скорость движения определяет скорость поворота
pawn Код:
MoveObject(objectid, Float:X, Float:Y, Float:Z, Float:Speed, Float:RotX = -1000.0, Float:RotY = -1000.0, Float:RotZ = -1000.0)
Reply
#7

да все равно объект поворачивается на нужный угол только к концу движения, так что надо создавать промежуточное движение, во время которого объект повернется, а потом уже повернутый полетит в нужную сторону...
Reply
#8

Дык ракета иногда летит 5 метров, а иногда и 300 метров (смотря куда игрок целится). Ракета сначала вылетает из ракетной установки на самолёте\вертолёте, летит вперёд 20 метров (начальная скорость - скорость вертолёта\самолёта + 20 кмч), затем поворачивается в сторону цели, и летит уже туда. Но в 40% случаев ракета летит боком
А это уже больше похоже на бомбардировку...
Reply
#9

Что мешает сделать путь ракеты деленный на отрезки? Ракета летит по параболе, так? Так. Ну и рассчитывайте движение и поворот по этой самой параболе отрезками.
Reply
#10

К сожалению, рассчёт по параболе не осилил. Ракета летит по прямым: От точки А (верталёт), к точке Б (20 метров от точки старта), до точки С (точка взрыва). Расстояние от А до Б одинаковое, а вот от Б до С всегда разное. Да проблему уже решил, но хотелось бы улучшить ту функцию, вдруг кто знает как.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)