Jump to content

Кватернионы


Recommended Posts

Вообще появилась идея написать конвертер кватернионов в углы эйлера.( ipl -> mta )

  
getEulerFromQuaternion = function( tQuaternion ) 
    local tResult = { 0, 0, 0 } 
    local q0 = tQuaternion[1] 
    local q1 = tQuaternion[2] 
    local q2 = tQuaternion[3] 
    local q3 = tQuaternion[4] 
    tResult[1] = math.deg( math.atan2( 2 * ( q0 * q1 + q2 * q3 ), 1 - 2 * ( q1 ^ 2 + q2 ^ 2 ) ) ) 
    tResult[2] = math.deg( math.asin( 2 * ( q0 * q2 - q3 * q1 ) ) ) 
    tResult[3] = math.deg( math.atan2( 2 * ( q0 * q3 + q1 * q2 ), 1 - 2 * ( q2 ^ 2 + q3 ^ 2 ) ) ) 
    return tResult 
end 
  

Всё бы хорошо, но углы не совсем правильные.

Кватернионы

  
0, 0, -0.7398733497, 0.6727461815 
  

Мап едитор:

  
RX: 180 
RY: 180 
RZ: 275.441 
  

Функция:

  
RX: -95.44 
RY: -0 
RZ: 180 
  

Разница очевидная.

Помогите, математики :)

Link to comment
function getEulerFromQuaternion5( tQuaternion ) 
    local x, y, z = 0, 0, 0 
    local qx = tQuaternion[1] 
    local qy = tQuaternion[2] 
    local qz = tQuaternion[3] 
    local qw = tQuaternion[4] 
    local sqw = qw * qw 
    local sqx = qx * qx 
    local sqy = qy * qy 
    local sqz = qz * qz 
     
    local unit = sqx + sqy + sqz + sqw 
    local test = qx * qw - qy * qz 
     
    if test > 0.4999999 * unit then 
        x = math.pi / 2 
        y = 2.0 * math.atan2( qy, qw ) 
        z = 0 
    elseif test < -0.4999999 * unit then 
        x = -( math.pi / 2 ) 
        y = 2.0 * math.atan2( qy, qw ) 
        z = 0 
    else 
        x = math.asin( 2 * test ) 
        y = math.atan2( 2 * ( qx * qz + qy * qw ), 1 - 2 * ( sqy + sqx ) ) 
        z = math.atan2( 2 * ( qx * qy + qz * qw ), 1 - 2 * ( sqx + sqz ) ) 
    end 
     
    return math.deg( x ), math.deg( y ), math.deg( z ) 
end 
print( getEulerFromQuaternion5( { 0, 0, -0.7398733497, 0.6727461815 } ) ) 

В некоторых случаях надо использовать math.abs и прибавлять 180.

Link to comment
  • 5 months later...

На сколько я помню, проблема в том что нету единой формулы для конвертации. Порядок расчета зависит от системы координат и главной оси, не везде Z - это вверх.

arc_ сто пудов знает как решать, он тот еще математик

Link to comment
На сколько я помню, проблема в том что нету единой формулы для конвертации. Порядок расчета зависит от системы координат и главной оси, не везде Z - это вверх.

arc_ сто пудов знает как решать, он тот еще математик

А как с ним связаться и сообщить о том, что это решение сильно поможет при конвертации карт в МТА? :roll:

Link to comment
  • Other Languages Moderators
На сколько я помню, проблема в том что нету единой формулы для конвертации. Порядок расчета зависит от системы координат и главной оси, не везде Z - это вверх.

arc_ сто пудов знает как решать, он тот еще математик

А как с ним связаться и сообщить о том, что это решение сильно поможет при конвертации карт в МТА? :roll:

irc наверно, вся MTA Team там тусуется.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...