脊柱 2d 坐标系 libgdx
spine 2d coordinate system libgdx
我不知道我做错了什么……我想我的大脑冻结了。我真的很难将我的脊柱对象像素坐标转换为世界坐标。我最近将我所有的代码都转换为与 Ashley ecs 一起工作,但我似乎无法让我的书脊对象显示在正确的位置。
我有一个系统可以处理我的书脊对象的渲染和定位,但我似乎无法让它显示在正确的位置。
我希望有人能给我指出正确的方向!
我已经包含了我的 spine 渲染系统代码...希望你能有所帮助!
我想将 spine 对象放置在与使用世界坐标的 box 2d 对象相同的位置。但 spine 使用的是像素坐标。我还附上了一张图片,向您展示正在发生的事情。 (屏幕右中部附近的灰色方块是我希望书脊对象所在的位置!)
阿马里诺
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();
}
}
您是否听说过一种名为 camera.project(world coordinates);
的方法,它可能会满足您的需求。它获取世界坐标并将它们转换为屏幕坐标。相反,你可以做 camera.unproject(screen coordinates);
我对书脊渲染所做的是查看书脊中以像素为单位的边界框大小。这通常是大约 100 像素的数量级。但如果你使用的是 box2d 比例,建议你将 1 视为 1 米。
考虑到这一点,我将通过将其除以 200 或大约 200 像素来缩放具有 200 像素臀部 y 坐标的人体脊柱动画。
一旦你有了这个比率,那么当你构建你的 Spine 骨架时,你就可以这样做(抱歉,我现在在 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)
这应该能让你的脊柱功能如你所愿。
我不知道我做错了什么……我想我的大脑冻结了。我真的很难将我的脊柱对象像素坐标转换为世界坐标。我最近将我所有的代码都转换为与 Ashley ecs 一起工作,但我似乎无法让我的书脊对象显示在正确的位置。 我有一个系统可以处理我的书脊对象的渲染和定位,但我似乎无法让它显示在正确的位置。 我希望有人能给我指出正确的方向!
我已经包含了我的 spine 渲染系统代码...希望你能有所帮助! 我想将 spine 对象放置在与使用世界坐标的 box 2d 对象相同的位置。但 spine 使用的是像素坐标。我还附上了一张图片,向您展示正在发生的事情。 (屏幕右中部附近的灰色方块是我希望书脊对象所在的位置!)
阿马里诺
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();
}
}
您是否听说过一种名为 camera.project(world coordinates);
的方法,它可能会满足您的需求。它获取世界坐标并将它们转换为屏幕坐标。相反,你可以做 camera.unproject(screen coordinates);
我对书脊渲染所做的是查看书脊中以像素为单位的边界框大小。这通常是大约 100 像素的数量级。但如果你使用的是 box2d 比例,建议你将 1 视为 1 米。
考虑到这一点,我将通过将其除以 200 或大约 200 像素来缩放具有 200 像素臀部 y 坐标的人体脊柱动画。
一旦你有了这个比率,那么当你构建你的 Spine 骨架时,你就可以这样做(抱歉,我现在在 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)
这应该能让你的脊柱功能如你所愿。