2-я система координат позвоночника libgdx
Я не знаю, что я делаю неправильно... я думаю, что у меня замораживание мозга. Я действительно изо всех сил пытаюсь преобразовать пиксельные координаты моих объектов позвоночника в мировые координаты. Я недавно преобразовал весь свой код для работы с Эшли Экс, и я не могу заставить мой объект позвоночника отображаться в правильном положении. У меня есть система, которая обрабатывает рендеринг и позиционирование моего объекта позвоночника, но я не могу заставить его отображаться в правильном положении. Я надеюсь, что кто-то может указать мне правильное направление!
я включил свой код для системы рендеринга позвоночника... надеюсь, вы можете помочь! я хочу поместить объект позвоночника в то же положение, что и мой объект box 2d, использующий мировые координаты. но позвоночник использует пиксельные координаты. Я также включил изображение, чтобы показать вам, что происходит. (серый квадрат в средней правой части экрана - это то место, где я хочу, чтобы был мой объект позвоночника!)
Amarino
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();
}
}
2 ответа
Что я делаю для рендера позвоночника, так это смотрю на размер ограничительной рамки в пикселях в позвоночнике. Обычно это порядка сотен пикселей. Но если вы работаете с весами box2d, рекомендуется считать 1 метром.
Имея это в виду, я буду масштабировать анимацию позвоночника человека с координатой бедра у 200 пикселей, разделив ее на 200 или около того.
Если у вас есть это соотношение, то, когда вы создаете свой Spine Skeleton, вы можете сделать это (извините, я делаю все мои вещи из libgdx в Kotlin сейчас):
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)
Это должно заставить ваши позвоночники работать так, как вы ожидаете.
Вы слышали о методе под названием camera.project(world coordinates);
это может сделать то, что вы ищете. Он берет мировые координаты и превращает их в экранные координаты. Для противоположного вы можете сделать camera.unproject(screen coordinates);