插入三维角度(在Garry&#mod;中)

时间:2015-12-05 18:41:24

标签: math 3d angle garrys-mod

我试图在Expression 2中插入角度,因此:

local IAng_ = mix( Begin, End, 0.0-1.0 )

mix(v / a,v / a,n) 是一种线性插值函数,可能最容易描述为:

function angle mix( Begin:angle, End:angle, Amount:number ){
    return Begin * Amount + End * (1 - Amount)
}

问题是:3D角度范围是-180到180,这会导致一些毛刺。 (据我的朋友说,它与Gimbal lock有关。

我尝试了几件事情,由于源引擎中角度的性质而无法发挥作用:

function angle angle:to360(){
    local Absolute = ang( abs( This:pitch() ), abs( This:yaw() ), abs( This:roll() ) )
    local Pitch = This:pitch() < 0 ? Absolute:pitch() + 180 : Absolute:pitch()
    local Yaw = This:yaw() < 0 ? Absolute:yaw() + 180 : Absolute:yaw()   
    local Roll = This:roll() < 0 ? Absolute:roll() + 180 : Absolute:roll()

    return ang( Pitch, Yaw, Roll ) 
}

或者在角度上加180.

TL; DR 面向Gimbal lock问题(角度范围-180到180)的3D角度插值,最佳解决方案是拥有一个转换为0 的函数 - 360范围,然后回到-180 - 180。

1 个答案:

答案 0 :(得分:0)

我最终使用quat( angle )函数将角度转换为四元数,然后使用内置的slerp(球面线性插值)函数:

local Ang = slerp( quat( Angle1 ), quat( Angle2 ), Interp ):toAngle()