Поворот prop_dynamic

Тема в разделе "Общие вопросы", создана пользователем Александр Савичев, 14 дек 2010.

  1. Добрый вечер. У меня есть небольшая проблема.
    Суть ее заключается в том, что когда я спавню и поворачиваю prop_dynamics на земле - оно поворачивает именно так, как мне необходимо

    [​IMG]

    [​IMG]

    Однако стоит мне спавнить проп на стене - он поворачивается не так как мне нужно. Он поворачивается по оси z, однако когда он у стены, мне необходимо поворачивать его по оси x. Как поворачивается у меня:

    [​IMG]

    [​IMG]

    Как поворачиваться должно:

    [​IMG]

    [​IMG]

    Как это можно реализовать?
    На офф форуме подсказали, что нужно использовать TR_GetPlaneNormal и дали ссылку на скалярные вектора, однако я так и не понял, что именно мне необходимо сделать.
    Вот мой код поворота prop_dynamic:
    Код:
    bool:TurnEntity(client, Float:angle)
    {
        decl ent, Float:Angles[3], Float:OldAngles[3], Float:normal[3], String:name[64];
        ent = GetClientAimTarget(client, false); 
        if (IsValidEntity(ent))
        {
            if (CheckEntNotClient(ent))
            {
                GetEdictClassname(ent, name, sizeof(name));
                GetEntPropVector(ent, Prop_Send, "m_angRotation", OldAngles);
                Angles[0] = OldAngles[0];
                Angles[1] = OldAngles[1] + angle;
                Angles[2] = OldAngles[2];
                TeleportEntity(ent, NULL_VECTOR, Angles, NULL_VECTOR);
                for (new i=1;i<=MaxClients;i++)
                {
                    if (IsClientConnected(i) && !IsClientObserver(i) && IsPlayerAlive(i))
                    {
                        if (IsPlayerStuck(i))
                        {
                            PrintToChat(client, "\x04[Props]\x03 Невозможно повернуть проп. Кто-то застрянет.");
                            TurnEntity(client, -45.0);
                            return false;
                        }
                    }
                }
                return true;
            }
        }
        return false;
    } 
     
  2. Евгений Ладик

    Евгений Ладик

    Сообщения:
    3
    Симпатии:
    1
    RotateModel(client) {
    decl ent1, String:name[64], String:clientname[64], Float:angles[3];
    ent1 = GetClientAimTarget(client, false);
    GetClientName(client, clientname, sizeof(clientname));
    if (IsValidEntity(ent1) && propinfo2[ent1]) {
    GetEdictClassname(ent1, name, sizeof(name));
    if(strcmp(name, "prop_dynamic_override", false)) {
    GetEntPropVector(ent1, Prop_Send, "m_angRotation", angles);
    RotateYaw(angles, float(rt[client]));
    DispatchKeyValueVector(ent1, "Angles", angles);
    for (new i = 1 ; i <= MaxClients; i++) {
    if (IsClientInGame(i) && IsPlayerAlive(i)) {
    if (IsPlayerStuck(i)) {
    if (GetClientTeam(i) == CS_TEAM_CT) {
    PrintToChat(client, "\x04[props] \x01> \x03Невозможно повернуть предмет, так как кто-то застрянет.");
    GetEntPropVector(ent1, Prop_Send, "m_angRotation", angles);
    RotateYaw(angles, float(rt[client]) * -1);
    DispatchKeyValueVector(ent1, "Angles", angles);
    }
    else if (GetClientTeam(i) == CS_TEAM_T)
    CS_RespawnPlayer(i);
    }
    }
    }
    }
    }
    }

    RotateYaw(Float:angles[3], Float:degree) {
    decl Float:direction[3], Float:normal[3];
    GetAngleVectors(angles, direction, NULL_VECTOR, normal);

    new Float:sin = Sine(degree * 0.01745328);
    new Float:cos = Cosine(degree * 0.01745328);
    new Float:a = normal[0] * sin;
    new Float:b = normal[1] * sin;
    new Float:c = normal[2] * sin;
    new Float:x = direction[2] * b + direction[0] * cos - direction[1] * c;
    new Float:y = direction[0] * c + direction[1] * cos - direction[2] * a;
    new Float:z = direction[1] * a + direction[2] * cos - direction[0] * b;
    direction[0] = x;
    direction[1] = y;
    direction[2] = z;

    GetVectorAngles(direction, angles);

    decl Float:up[3];
    GetVectorVectors(direction, NULL_VECTOR, up);

    new Float:roll = GetAngleBetweenVectors(up, normal, direction);
    angles[2] += roll;
    }

    Float:GetAngleBetweenVectors(const Float:vector1[3], const Float:vector2[3], const Float:direction[3]) {
    decl Float:vector1_n[3], Float:vector2_n[3], Float:direction_n[3], Float:cross[3];
    NormalizeVector(direction, direction_n);
    NormalizeVector(vector1, vector1_n);
    NormalizeVector(vector2, vector2_n);
    new Float:degree = ArcCosine(GetVectorDotProduct(vector1_n, vector2_n)) * 57.29577951; // 180/Pi
    GetVectorCrossProduct(vector1_n, vector2_n, cross);

    if (GetVectorDotProduct(cross, direction_n) < 0.0)
    degree *= -1.0;

    return degree;
    }
     
  3. ironfrol

    ironfrol

    Сообщения:
    132
    Симпатии:
    29
    не пойму тему про что речь идет?
     
  4. Satan

    Satan

    Сообщения:
    162
    Симпатии:
    338
    ironfrol, опомнился через год после написания поста :)