GetVehicleRotationQuat

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hey,
    habe gestern eine Funktion gefunden mit der ich die komplette Fahrzeug Rotation bekommen kann. Es arbeitet mit GetVehicleRotationQuat, aber es gibt die falschen Werte aus. Wieso kann ich das so einfach behaupten ? Ich habe das was die Funktion für die Z Rotation zurück gibt mit GetVehicleZAngle verglichen, aber es kommt nicht das selbe raus. Hat jemand eine Funktion die auch richtig arbeitet dafür so ähnlich wie diese ?
    stock GetVehicleRotation(vehicleid,&Float:rotx,&Float:roty,&Float:rotz) {
    new Float:quat_w,Float:quat_x,Float:quat_y,Float:quat_z;
    GetVehicleRotationQuat(vehicleid,quat_w,quat_x,quat_y,quat_z);
    x = atan2(2*((quat_x*quat_y)+(quat_w+quat_z)),(quat_w*quat_w)+(quat_x*quat_x)-(quat_y*quat_y)-(quat_z*quat_z));
    y = atan2(2*((quat_y*quat_z)+(quat_w*quat_x)),(quat_w*quat_w)-(quat_x*quat_x)-(quat_y*quat_y)+(quat_z*quat_z));
    z = asin(-2*((quat_x*quat_z)+(quat_w*quat_y)));
    return 1;
    }

  • Hier, damit sollte es klappen:


    stock ConvertToEuler(Float: qw, Float: qx, Float:qy, Float:qz, &Float:heading, &Float:attitude, &Float:bank) {
    new Float: sqw = qw*qw,Float: sqx = qx*qx,Float: sqy = qy*qy,Float: sqz = qz*qz,Float: unit = sqx + sqy + sqz + sqw,Float: test = qx*qy + qz*qw;
    if (test > 0.499*unit) return heading = 2*atan2(qx,qw),attitude = 3.141592653/2,bank = 0;
    if (test < -0.499*unit) return heading = -2*atan2(qx,qw),attitude = -3.141592653/2,bank = 0;
    return heading = atan2(2*qy*qw - 2*qx*qz, sqx - sqy - sqz + sqw),attitude = asin(2*test/unit),bank = atan2(2*qx*qw - 2*qy*qz, -sqx + sqy - sqz + sqw);
    }
    stock GetVehicleRotation(vehicleid,&Float:heading, &Float:attitude, &Float:bank) {
    new Float:quat_w,Float:quat_x,Float:quat_y,Float:quat_z;
    GetVehicleRotationQuat(vehicleid,quat_w,quat_x,quat_y,quat_z);
    ConvertToEuler(quat_w,quat_x,quat_z,quat_y, heading, attitude, bank);
    return bank = -1*bank,1;
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • Bekomme leider in den folgenden Zeilen noch Tag Mismatches:
    if (test > 0.499*unit) return heading = 2*atan2(qx,qw),attitude = 3.141592653/2,rotbank = 0;
    if (test < -0.499*unit) return heading = -2*atan2(qx,qw),attitude = -3.141592653/2,rotbank = 0;
    return heading = atan2(2*qy*qw - 2*qx*qz, sqx - sqy - sqz + sqw),attitude = asin(2*test/unit),rotbank = atan2(2*qx*qw - 2*qy*qz, -sqx + sqy - sqz + sqw);
    Und falls sich jemand fragt wieso ich bank zu rotbank geändert habe, ich hatte schonmal irgendwo bank im Script und Pawno hat gemeckert :D

  • Bekomme leider in den folgenden Zeilen noch Tag Mismatches:


    Ups :D


    Ja, schreibs so:


    stock ConvertToEuler(Float: qw, Float: qx, Float:qy, Float:qz, &Float:heading, &Float:attitude, &Float:bank) {
    new Float: sqw = qw*qw,Float: sqx = qx*qx,Float: sqy = qy*qy,Float: sqz = qz*qz,Float: unit = sqx + sqy + sqz + sqw,Float: test = qx*qy + qz*qw;
    if (test > 0.499*unit) return heading = 2*atan2(qx,qw),attitude = 3.141592653/2,bank = 0,1;
    if (test < -0.499*unit) return heading = -2*atan2(qx,qw),attitude = -3.141592653/2,bank = 0,1;
    return heading = atan2(2*qy*qw - 2*qx*qz, sqx - sqy - sqz + sqw),attitude = asin(2*test/unit),bank = atan2(2*qx*qw - 2*qy*qz, -sqx + sqy - sqz + sqw),1;
    }


    mfg. ^^

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S