插值 3d 角度(在 Garry 的 Mod 中)
Interpolating 3d angles (in Garry's 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.
有关
我已经尝试了一些方法,但由于 Source Engine 中角度的性质,这些都没有奏效:
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 问题的 3D 角度插值(角度范围 -180 到 180),最好的解决方案是拥有一个转换为的函数0 - 360 范围并返回 -180 - 180.
我最终使用 quat( angle )
函数将角度转换为四元数,然后我使用内置的 slerp(球面线性插值)函数,如下所示:
local Ang = slerp( quat( Angle1 ), quat( Angle2 ), Interp ):toAngle()
我正在尝试在 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.
有关我已经尝试了一些方法,但由于 Source Engine 中角度的性质,这些都没有奏效:
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 问题的 3D 角度插值(角度范围 -180 到 180),最好的解决方案是拥有一个转换为的函数0 - 360 范围并返回 -180 - 180.
我最终使用 quat( angle )
函数将角度转换为四元数,然后我使用内置的 slerp(球面线性插值)函数,如下所示:
local Ang = slerp( quat( Angle1 ), quat( Angle2 ), Interp ):toAngle()