Actionscript 3 Lerping 3d旋转(away3d)
我正在使用away3d和awayphysics创建一个3d游戏 我创建了一个旋转公式,该公式将使用“平滑因子”旋转我的模型Actionscript 3 Lerping 3d旋转(away3d),actionscript-3,3d,rotation,away3d,Actionscript 3,3d,Rotation,Away3d,我正在使用away3d和awayphysics创建一个3d游戏 我创建了一个旋转公式,该公式将使用“平滑因子”旋转我的模型 private-var-chRotation:Number=0; 公共覆盖函数更新(增量:uint):无效 { 如果(目标){ var平滑:数值=0.95; var tp:Vector3D=target.ghostObject.position; var cp:Vector3D=entity.ghosObject.position; var targetAngle:Numb
private-var-chRotation:Number=0;
公共覆盖函数更新(增量:uint):无效
{
如果(目标){
var平滑:数值=0.95;
var tp:Vector3D=target.ghostObject.position;
var cp:Vector3D=entity.ghosObject.position;
var targetAngle:Number=-((180/Math.PI)*Math.atan2(cp.z-tp.z,cp.x-tp.x));
如果(oldTgRotation-targetAngle!=0){
如果((oldtg旋转-目标角)>300){
染色=-180;
}否则如果((oldtg旋转-目标角)<-300){
染色=180;
}
}
chRotation+=(targetAngle+(chRotation-targetAngle)*(平滑-(δ/800)))-chRotation;
entity.ghosObject.rotation=新矢量3D(0,chRotation,0);
oldtg旋转=目标角度;
}
}
这部分起作用,直到网格从-180旋转到180为止。代码将向后旋转网格,因此:-180-90 0 180
它应该从-180向前移动到180。但是怎么做呢
编辑:我添加了一种解决方案,但这仍然不是完美的:
if(oldTgRotation - targetAngle != 0){
if((oldTgRotation - targetAngle) > 300){
chRotation = -180;
}else if((oldTgRotation - targetAngle) < -300){
chRotation = 180;
}
}
if(oldTgRotation-targetAngle!=0){
如果((oldtg旋转-目标角)>300){
染色=-180;
}否则如果((oldtg旋转-目标角)<-300){
染色=180;
}
}
如果,则应使用而不是
curRotation = curRotation % 360;
好的,为了解决这个问题,我添加了一个布尔开关:
private var chRotation:Number = 0;
private var switchf:Boolean = false;
private var switchb:Boolean = false;
public override function update(delta:uint):void
{
if(target){
var smooth:Number = 0.95;
var tp:Vector3D = target.ghostObject.position;
var cp:Vector3D = entity.ghostObject.position;
var targetAngle:Number = -((180 / Math.PI) * Math.atan2(cp.z - tp.z, cp.x - tp.x));
if(oldTgRotation - targetAngle != 0){
if((oldTgRotation - targetAngle) > 300){
switchf = true;
}else if((oldTgRotation - targetAngle) < -300){
switchb = true;
}
}
if(switchf){
if(chRotation >= 177){
switchf = false;
chRotation = -180;
}else{
targetAngle = 190;
}
}
if(switchb){
if(chRotation <= -177){
switchb = false;
chRotation = 180;
}else{
targetAngle = -190;
}
}
chRotation += (targetAngle + (chRotation - targetAngle) * (smooth - (delta / 800))) - chRotation;
entity.ghostObject.rotation = new Vector3D(0, chRotation, 0);
oldTgRotation = targetAngle;
}
}
private-var-chRotation:Number=0;
private-var-switchf:Boolean=false;
private-var-switchb:Boolean=false;
公共覆盖函数更新(增量:uint):无效
{
如果(目标){
var平滑:数值=0.95;
var tp:Vector3D=target.ghostObject.position;
var cp:Vector3D=entity.ghosObject.position;
var targetAngle:Number=-((180/Math.PI)*Math.atan2(cp.z-tp.z,cp.x-tp.x));
如果(oldTgRotation-targetAngle!=0){
如果((oldtg旋转-目标角)>300){
开关f=真;
}否则如果((oldtg旋转-目标角)<-300){
b=真;
}
}
if(开关F){
如果(颜色>=177){
开关f=假;
染色=-180;
}否则{
目标角=190;
}
}
if(开关B){
如果(chRotation抱歉,这不起作用。然后网格将疯狂旋转。我添加了这一点,因为由于某种原因,chRotation将返回一个奇怪的值。我现在更改了代码,因此不再使用它。它仍然具有相同的行为,但你也应该看看球形线性插值:谢谢,从未注意到这一点。我将稍后再看:)
private var chRotation:Number = 0;
private var switchf:Boolean = false;
private var switchb:Boolean = false;
public override function update(delta:uint):void
{
if(target){
var smooth:Number = 0.95;
var tp:Vector3D = target.ghostObject.position;
var cp:Vector3D = entity.ghostObject.position;
var targetAngle:Number = -((180 / Math.PI) * Math.atan2(cp.z - tp.z, cp.x - tp.x));
if(oldTgRotation - targetAngle != 0){
if((oldTgRotation - targetAngle) > 300){
switchf = true;
}else if((oldTgRotation - targetAngle) < -300){
switchb = true;
}
}
if(switchf){
if(chRotation >= 177){
switchf = false;
chRotation = -180;
}else{
targetAngle = 190;
}
}
if(switchb){
if(chRotation <= -177){
switchb = false;
chRotation = 180;
}else{
targetAngle = -190;
}
}
chRotation += (targetAngle + (chRotation - targetAngle) * (smooth - (delta / 800))) - chRotation;
entity.ghostObject.rotation = new Vector3D(0, chRotation, 0);
oldTgRotation = targetAngle;
}
}