Libgdx — неправильные значения поворота модели от Tween Engine

Я пытаюсь повернуть 3d ModelInstance с универсальным движком анимации в libgdx. Вот мой класс экрана:

public class WallpaperScreen implements Screen {

private PerspectiveCamera camera;
private ModelBatch modelBatch;
private Model modelBody, modelHead;
private ModelInstance bodyModelInstance, headModelInstance;
private Environment environment;
private TweenManager tweenManager;

@Override
public void show() {
    tweenManager = new TweenManager();
    Tween.registerAccessor(ModelInstance.class, new Accesor());

    camera = new PerspectiveCamera(75, Gdx.graphics.getWidth(),
            Gdx.graphics.getHeight());

    camera.position.set(-10f, 2f, 0f);
    camera.lookAt(0f, 0f, 0f);

    camera.near = 0.1f;
    camera.far = 300.0f;

    modelBatch = new ModelBatch();

    UBJsonReader jsonReader = new UBJsonReader();
    G3dModelLoader modelLoader = new G3dModelLoader(jsonReader);
    modelBody = modelLoader.loadModel(Gdx.files.getFileHandle(
            "data/IS3/IS3_body.g3db", FileType.Internal));
    modelHead = modelLoader.loadModel(Gdx.files.getFileHandle(
            "data/IS3/IS3_tur.g3db", FileType.Internal));
    bodyModelInstance = new ModelInstance(modelBody);
    headModelInstance = new ModelInstance(modelHead);

    bodyModelInstance.transform.rotate(0, 1, 0, -90);
    headModelInstance.transform.rotate(0, 1, 0, -90);

    environment = new Environment();
    environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 1f, 1f,
            1f, 1.0f));

    Tween.to(bodyModelInstance, 0, 2).target(45).start(tweenManager);
    Tween.to(headModelInstance, 0, 2).target(45).start(tweenManager);
}

@Override
public void render(float delta) {
    Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(),
            Gdx.graphics.getHeight());
    Gdx.gl.glClearColor(0, 128, 255, 0);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

    tweenManager.update(delta);

    camera.update();

    modelBatch.begin(camera);
    modelBatch.render(bodyModelInstance, environment);
    modelBatch.render(headModelInstance, environment);
    modelBatch.end();
}

и вот мой TweenAccesor:

public class Accesor implements TweenAccessor<ModelInstance> {

private Quaternion quat = new Quaternion();

@Override
public int getValues(ModelInstance target, int tweenType,
        float[] returnValues) {
    quat = target.transform.getRotation(quat);
    returnValues[0] = quat.getAxisAngle(Vector3.Y);
    return 1;
}

@Override
public void setValues(ModelInstance target, int tweenType, float[] newValues) {
    target.transform.rotate(Vector3.Y, newValues[0]);
}

проблема в том, что модели вращаются очень быстро (они делают пару полных поворотов на 360 градусов за эти 2 секунды), мне просто нужно, чтобы они медленно вращались от 0 градусов по оси Y до 45 градусов за 2 секунды, что я делаю не так в аксессуаре?


person user3430755    schedule 18.03.2014    source источник


Ответы (1)


Является ли Quaternion лицом без гражданства? Будет только один экземпляр Accesor для всех ваших Tweens.

Поворачивается ли target.transform.rotate(Vector3.Y, newValues[0]); на X градусов или на X градусов. Вы медленно увеличиваете число до 45 за каждый вызов. Вы видите, что вращение становится все быстрее и быстрее? Может быть, вы хотите setToRotation вместо этого.

person Chase    schedule 18.03.2014
comment
да, поворот поворачивается на X градусов, а не для того, чтобы изменить его на setToRotation, и это сработало. Спасибо за указание на это - person user3430755; 18.03.2014