Показать сообщение отдельно
Старый 21.01.2010, 00:08   #2
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: синхронизация физики и анимации (newton)

Решил вот дополнить для интересующихся синхронизацию физики с анимацией на Physics'е, да и работает стабильнее.
Global tempPiv = CreatePivot()

;--- Параметры : тело, ентити, масса тела, коэффициент упругости
Function pxSyncBodyWithEntity(body, ent, mass#, k#=1)
    Local x#, y#, z#
    Local pit#, yaw#, roll#
    
    Local dx#, dy#, dz#
    Local dPit#, dYaw#, dRoll#
    
    x = pxBodyGetPositionX(body)
    y = pxBodyGetPositionY(body)
    z = pxBodyGetPositionZ(body)
    pit = pxBodyGetRotationPitch(body)
    yaw = pxBodyGetRotationYaw(body)
    roll = pxBodyGetRotationRoll(body)
    
    RotateEntity tempPiv, pit, yaw, roll, 1
    
    dx = EntityX(ent,1) - x
    dy = EntityY(ent,1) - y
    dz = EntityZ(ent,1) - z
    
    TFormVector 0, 0, 1, ent, tempPiv
    x = TFormedX() : y = TFormedY() : z = TFormedZ()
    dPit = VectorAngle#(0,0,1, 0,y,z)
    dYaw = VectorAngle#(0,0,1, x,0,z)
    TFormVector 1, 0, 0, ent, tempPiv
    x = TFormedX() : y = TFormedY() : z = TFormedZ()
    dRoll = VectorAngle#(1,0,0, x,y,0)

    EntityParent ent, tempPiv
    dPit = dPit * Sgn(EntityPitch(ent,0))
    dYaw = dYaw * - Sgn(EntityYaw(ent,0))
    dRoll = dRoll * Sgn(EntityRoll(ent,0))
    EntityParent ent, 0
    
    ;---- ВАРИАНТ 1. действует трение
    x = pxBodyGetLinearSpeedX(body)
    y = pxBodyGetLinearSpeedY(body)
    z = pxBodyGetLinearSpeedZ(body)
    pxBodyAddForce(body, (dx*mass-x)*k, (dy*mass-y)*k, (dz*mass-z)*k, 2)
    x = pxBodyGetLocalAngularSpeedX(body)
    y = pxBodyGetLocalAngularSpeedY(body)
    z = pxBodyGetLocalAngularSpeedZ(body)
    pxBodyAddLocalTorque(body, (dPit-x)*k, (dYaw-y)*k, (dRoll-z)*k, 2)
    
    ;---- ВАРИАНТ 2. без воздействия трения
    ;pxBodySetLinearSpeed(body, dx*mass*k, dy*mass*k, dz*mass*k)
    ;pxBodySetLocalAngularSpeed(body, dPit*k, dYaw*k, dRoll*k)
End Function

Function VectorAngle#(Ax#,Ay#,Az#, Bx#,By#,Bz#)
    Local d# = VectorDot(Ax#,Ay#,Az#, Bx#,By#,Bz#)
    Local m# = VectorMagnitude(Ax#,Ay#,Az#)*VectorMagnitude(Bx#,By#,Bz#)
    Return ACos(d#/m#)
End Function

Function VectorDot#(Ax#,Ay#,Az#, Bx#,By#,Bz#)
    Return (Ax*Bx) + (Ay*By) + (Az*Bz)
End Function
    
Function VectorMagnitude#(Ax#,Ay#,Az#)
    Return Sqr(Ax*Ax + Ay*Ay + Az*Az)
End Function
PS
Обратная величина будет так :
a# = phTiming ^(-1)
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо H@NON за это полезное сообщение:
CRASHER (08.06.2011), Si-Jey (22.03.2010), St_AnGer (22.03.2010), tormoz (22.03.2010)