@SubscribeEvent
public void playerRender1(RenderPlayerEvent.Pre event){
GL11.glPushMatrix();
EntityPlayer player = event.entityPlayer;
Vec3 eyes = precisePosition(Minecraft.getMinecraft().renderViewEntity, event.partialRenderTick);
Vec3 relToWorld = precisePosition(player, event.partialRenderTick);
Vec3 relToEyes = subtract(relToWorld, eyes);
if (player != Minecraft.getMinecraft().thePlayer) {
relToEyes = relToEyes.addVector(0, 1.62, 0); //координаты Minecraft.thePlayer= координаты глаз, но координаты других игроков - это координаты их нижних точек. Так что надо поднять точку поворота, чтобы и ваш персонаж, и другие игроки крутились одинаково.
}
GL11.glTranslated(relToEyes.xCoord, relToEyes.yCoord, relToEyes.zCoord);
Vec3 look = player.getLookVec();
Vec3 yAxis = Vec3.createVectorHelper(0, 1, 0);
Vec3 normal = look.crossProduct(yAxis).normalize();
GL11.glRotated(90, normal.xCoord, normal.yCoord, normal.zCoord);
GL11.glTranslated(-relToEyes.xCoord, -relToEyes.yCoord, -relToEyes.zCoord);
}
@SubscribeEvent
public void playerRender2(RenderPlayerEvent.Post event){
GL11.glPopMatrix();
}
public static Vec3 precisePosition(Entity entity, float partialTicks){
return Vec3.createVectorHelper(
entity.lastTickPosX + (entity.posX - entity.lastTickPosX) * partialTicks,
entity.lastTickPosY + (entity.posY - entity.lastTickPosY) * partialTicks,
entity.lastTickPosZ + (entity.posZ - entity.lastTickPosZ) * partialTicks);
}
public static Vec3 subtract(Vec3 a, Vec3 b){
return Vec3.createVectorHelper(a.xCoord - b.xCoord, a.yCoord - b.yCoord, a.zCoord - b.zCoord);
}