Java Libgdx摄影机位置和缩放捕捉到位,而不是平滑动画
我曾尝试在libgdx中实现一种平滑相机变焦方法,该方法在两个变焦量值(即初始*最终)之间进行缩放插值。 然而,问题是当缩放或移动时,相机会快速捕捉到位。我怎样才能创建一个平滑的摄影机类并实现变焦,而不产生跳跃的scrrenJava 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
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]
实际上是什么。这至少是问题的一部分。