Дэвелопер
Регистрация: 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)
|