Java Libgdx摄影机位置和缩放捕捉到位,而不是平滑动画

Java Libgdx摄影机位置和缩放捕捉到位,而不是平滑动画,java,camera,libgdx,android-camera,Java,Camera,Libgdx,Android Camera,我曾尝试在libgdx中实现一种平滑相机变焦方法,该方法在两个变焦量值(即初始*最终)之间进行缩放插值。 然而,问题是当缩放或移动时,相机会快速捕捉到位。我怎样才能创建一个平滑的摄影机类并实现变焦,而不产生跳跃的scrren private void panZoom(Vector3 spanCord, TweenManager tweenManager, GameWorld world) { /* * Example Tween-Sequ

我曾尝试在libgdx中实现一种平滑相机变焦方法,该方法在两个变焦量值(即初始*最终)之间进行缩放插值。 然而,问题是当缩放或移动时,相机会快速捕捉到位。我怎样才能创建一个平滑的摄影机类并实现变焦,而不产生跳跃的scrren

private void panZoom(Vector3 spanCord, TweenManager tweenManager, GameWorld world)
    {
            /*
             * Example Tween-Sequence: Zoom to 120%, Pan to point of interest #1 (0, -50), Wait 1 second, Pan back to the
             * starting position, Zoom back to the initial value
             */
            Timeline.createSequence()
                .beginParallel()
                .push(Tween.to(this, OrthographicCameraAccessor.POSITION, 3.5f).target(spanCord.x,spanCord.y,spanCord.z).ease(Elastic.OUT))
                .push(Tween.to(this, OrthographicCameraAccessor.ZOOM, 3.5f).target(1.20f).ease(Elastic.OUT))
                .end()

                .beginParallel()
                .push(Tween.to(this, OrthographicCameraAccessor.POSITION, 2.8f).target(world.getYoyo().position.x,0,0).ease(Bounce.INOUT))
                .push(Tween.to(this, OrthographicCameraAccessor.ZOOM, 3.0f).target(1).ease(Bounce.INOUT))
                .end()
                .start(tweenManager);
    }




    public float calcZoom(float initialDistance, float distance)
    {
        float nextZoom;

        if(initialDistance < distance)
        {
            float ratio = (initialDistance/distance)/10;
            nextZoom = zoomIn(ratio);
        }
        else
        {
            float ratio = (distance/initialDistance)/10;
            nextZoom = zoomOut(ratio);
        }

        return nextZoom;
    }


public class OrthographicCameraAccessor implements TweenAccessor<MyOrthographicCamera> {

    /** Tween position */
    public static final int POSITION = 1;
    /** Tween zoom */
    public static final int ZOOM = 2;

    /**
     * @param camera
     * camera to get values from
     * @param tweentype
     * type of tween (Position or Zoom)
     * @param returnValues
     * out parameter with the requested values
     */
    @Override
    public int getValues(MyOrthographicCamera camera, int tweenType, float[] returnValues)
    {
        switch (tweenType)
        {
            case POSITION:
                returnValues[0] = camera.position.x;
                returnValues[1] = camera.position.y;
                returnValues[2] = camera.position.z;
                return 3;
            case ZOOM:
                returnValues[0] = camera.zoom;
                return 1;
            default:
                return 0;
        }
    }

    /**
     * @param camera
     *  camera whose some values are going to be set
     * @param tweenType
     * Position or Zoom
     * @param newValues
     *  array containing the new values to configure the camera
     */
    @Override
    public void setValues(MyOrthographicCamera camera, int tweenType, float[] newValues)
    {
        switch (tweenType)
        {
            case POSITION:
                camera.setPosition(newValues[0], 0);
                camera.update();
                break;
            case ZOOM:
                camera.setZoom(newValues[0]);
                camera.update();

                Gdx.app.log("CAMERA", "Clamped Zoom" +camera.zoom);
                break;
            default:
                break;
        }
    }
private void panZoom(矢量3跳线、TweenManager TweenManager、游戏世界)
{
/*
*Tween序列示例:缩放到120%,平移到兴趣点#1(0,-50),等待1秒,然后平移回
*开始位置,缩放回初始值
*/
Timeline.createSequence()
.beginParallel()
.推(推到(这个,正交摄影机存取器位置,3.5f)。目标(spanCord.x,spanCord.y,spanCord.z)。放松(弹性拉出))
.推(推到(这个,正交摄影机存取器。缩放,3.5f)。目标(1.20f)。放松(弹性。向外)
(完)
.beginParallel()
.push(Tween.to(this,正交cameraaccessor.POSITION,2.8f)。target(world.getYoyo().POSITION.x,0.0)。ease(Bounce.INOUT))
.push(Tween.to(这是正交摄影机存取器.ZOOM,3.0f)。target(1)。ease(Bounce.INOUT))
(完)
.启动(tweenManager);
}
公共浮动calcZoom(浮动初始距离,浮动距离)
{
浮动下一个空间;
如果(初始距离<距离)
{
浮动比率=(初始距离/距离)/10;
nextZoom=缩放(比率);
}
其他的
{
浮动比率=(距离/初始距离)/10;
nextZoom=zoomOut(比率);
}
返回下一个房间;
}
公共类正交CameraAccessor实现TweenAccessor{
/**中间位置*/
公共静态最终int位置=1;
/**二次变焦*/
公共静态最终整数缩放=2;
/**
*@param摄像机
*从中获取值的摄影机
*@param-tweentype
*吐温类型(位置或缩放)
*@param返回值
*使用请求的值输出参数
*/
@凌驾
公共int getvalue(MyOrthographicCamera、int-tweenType、float[]返回值)
{
开关(二十种类型)
{
病例位置:
返回值[0]=摄像机位置.x;
返回值[1]=摄像机位置y;
返回值[2]=摄像机位置z;
返回3;
案例缩放:
返回值[0]=camera.zoom;
返回1;
违约:
返回0;
}
}
/**
*@param摄像机
*要设置其某些值的摄影机
*@param-tweenType
*定位或缩放
*@param newValues
*包含用于配置相机的新值的数组
*/
@凌驾
公共无效设置值(MyOrthographicCamera、int-tweenType、float[]新值)
{
开关(二十种类型)
{
病例位置:
摄像机设置位置(新值[0],0);
camera.update();
打破
案例缩放:
camera.setZoom(newValues[0]);
camera.update();
Gdx.app.log(“摄影机”、“固定变焦”+摄影机.Zoom);
打破
违约:
打破
}
}

您的
setValues
方法将0应用于相机的y位置,而不管
newValues[1]
实际上是什么。这至少是问题的一部分。