Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 Lerping 3d旋转(away3d)_Actionscript 3_3d_Rotation_Away3d - Fatal编程技术网

Actionscript 3 Lerping 3d旋转(away3d)

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

我正在使用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: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;
    }
}