【问题标题】:spine 2d coordinate system libgdx脊柱 2d 坐标系 libgdx
【发布时间】:2017-09-01 12:00:54
【问题描述】:

我不知道我做错了什么...我认为我的大脑冻结了。我真的很努力将我的脊椎对象像素坐标转换为世界坐标。我最近将所有代码转换为使用 Ashley ecs,但我似乎无法让我的脊椎对象显示在正确的位置。 我有一个系统可以处理我的脊椎对象的渲染和定位,但我似乎无法让它显示在正确的位置。 我希望有人能指出我正确的方向!

我已经包含了我的脊椎渲染系统代码...希望您能提供帮助! 我想将脊椎对象放置在与使用世界坐标的盒子 2d 对象相同的位置。但脊椎正在使用像素坐标。我还附上了一张图片,向您展示正在发生的事情。 (屏幕右中附近的灰色方块是我希望我的脊椎对象所在的位置!)

阿马里诺

in game image

    public class SpineRenderSystem extends IteratingSystem {
    private static final String TAG = com.chaingang.freshstart.systems.SpineRenderSystem.class.getName();

    private PolygonSpriteBatch pBatch;
    SkeletonMeshRenderer skeletonMeshRenderer;
    private boolean process = true;

    BodyComponent bodyComp;
    Spine2DComponent spineComp;

    public SpineRenderSystem(PolygonSpriteBatch pBatch){
        super(Family.all(RenderableComponent.class, Spine2DComponent.class, PositionComponent.class).get());
        this.pBatch = pBatch;
        skeletonMeshRenderer = new SkeletonMeshRenderer();
        skeletonMeshRenderer.setPremultipliedAlpha(true);

    }


    @Override
    protected void processEntity(Entity entity, float deltaTime) {

        bodyComp = Mappers.body.get(entity);
        spineComp = Mappers.spine2D.get(entity);

        float offsetX = 100.00f/Gdx.graphics.getWidth(); //100 equal world width
        float offsetY = 50.00f/Gdx.graphics.getHeight(); //50 equals world height

        pBatch.begin();
            spineComp.skeleton.setX((bodyComp.body.getPosition().x / offsetX) );
            spineComp.skeleton.setY((bodyComp.body.getPosition().y) / offsetY);

            skeletonMeshRenderer.draw(pBatch,spineComp.skeleton);
            //spineComp.get(entity).skeleton.setFlipX(player.dir == -1);
            spineComp.animationState.apply(spineComp.skeleton);
            spineComp.skeleton.updateWorldTransform();
        pBatch.end();


    }
}

【问题讨论】:

  • 什么是像素坐标?屏幕坐标?
  • 是屏幕坐标...

标签: android libgdx spine


【解决方案1】:

我对脊椎渲染所做的是查看脊椎中的边界框大小(以像素为单位)。这通常是 100 像素的数量级。但如果您使用的是 box2d 比例尺,建议您将 1 视为 1 米。

考虑到这一点,我将用 200 像素的臀部 y 坐标除以 200 或大约 200 像素来缩放人体脊柱动画。

一旦你有了这个比例,那么当你构建你的 Spine Skeleton 时,你就可以做到这一点(抱歉,我现在在 Kotlin 中完成我所有的 libgdx 工作):

val atlasLoader = AtlasAttachmentLoader(atlas)
val skeletonJson = SkeletonJson(atlasLoader)
skeletonJson.scale = 1/200f

然后您可能还想处理渲染脊椎对象的偏移量,正如我看到您正在尝试做的那样,因为您的根骨可能位于脊椎对象的中心(例如臀部)。但是,您正在进行除法运算,我想这是探索性的,因为偏移量应该是加法或减法。这是我使用脊椎像素坐标的方法(再次,对不起 Kotlin,但我喜欢它):

//In some object or global state we have this stuff
var skeleton: Skeleton
var skeletonRenderer = SkeletonRenderer<PolygonSpriteBatch>()


//Then in the rendering code
val offset = Vector2(0f,-200f)
val position = physicsRoot.position().add(offset)
skeleton.setPosition(position.x, position.y)
skeleton.updateWorldTransform()
skeletonRenderer.draw(batch, skeleton)

这应该可以让你的脊椎按预期工作。

【讨论】:

    【解决方案2】:

    您是否听说过一种名为camera.project(world coordinates); 的方法,它可能会满足您的需求。它获取世界坐标并将它们转换为屏幕坐标。反之则可以camera.unproject(screen coordinates);

    【讨论】:

    • 我认为这种方法可行,但是当您调整屏幕大小时……它似乎无法正常工作……我需要重置一些与相关的宽度和高度值吗?相机,然后调用项目和取消项目功能?
    • 你更新你的相机了吗?在 resize 方法中执行 camera.viewportwidth =width 和 camera.viewportheight=height 然后调用 camera.update()
    • 我已经尝试过了...我想我需要重新查看处理扩展视口和相机的代码...我想我有一些问题需要解决.. .
    • 当我调整屏幕大小时,它看起来在特定分辨率下正常工作,但是当我手动调整窗口大小时它不能正常工作......所以我猜我有问题使用相机..当我放大和缩小脊椎模型时,它不会像您期望的那样改变大小。我显示的关卡和任何精灵似乎都可以正确缩放。我使用 camera.project 让脊椎模型以特定分辨率正确移动
    • 好的,我刚刚发现它可以在桌面启动器中的 config.width 和 config.height 中设置的任何分辨率下正常工作......而且当我调整相机的缩放比例时,它仍然无法缩放脊柱模型。
    猜你喜欢
    • 2013-02-15
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多