SA-MP Forums Archive
SetObjectRotateToPoint - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: SetObjectRotateToPoint (/showthread.php?tid=307772)



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 метров от точки старта), до точки С (точка взрыва). Расстояние от А до Б одинаковое, а вот от Б до С всегда разное. Да проблему уже решил, но хотелось бы улучшить ту функцию, вдруг кто знает как.