Поворот prop_dynamic

  • Автор темы Александр Савичев
  • Дата начала
А

Александр Савичев

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

file.php


file.php


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

file.php


file.php


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

file.php


file.php


Как это можно реализовать?
На офф форуме подсказали, что нужно использовать TR_GetPlaneNormal и дали ссылку на скалярные вектора, однако я так и не понял, что именно мне необходимо сделать.
Вот мой код поворота prop_dynamic:
C-подобный:
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;
}
 

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

Участник
Сообщения
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;
}
 

ironfrol

Участник
Сообщения
131
Реакции
30
не пойму тему про что речь идет?
 

Satan

Участник
Сообщения
159
Реакции
338
ironfrol, опомнился через год после написания поста :)
 
Сверху Снизу