точка на экране, углы

Версия Minecraft
1.8.9
API
Forge
204
7
25
Допустим мне нужно смотреть под углами YAW 123.7, PITCH 71, как нарисовать(а точнее получить координаты на экране) точку с которой нужно совместить курсор(прицел) ?
 
Решение
Java:
@SubscribeEvent
    public void onRenderText(RenderGameOverlayEvent event){
        if(event.type == RenderGameOverlayEvent.ElementType.TEXT) {
            if (mc.fontRendererObj != null) {

                float playerYaw=mc.thePlayer.getRotationYawHead();
                float playerPitch=mc.thePlayer.rotationPitch;
                
                float anglesDiffYaw = (float) (to360(targetYaw) - to360(playerYaw));
                float anglesDiffPitch = (float) (to360(targetPitch) - to360(playerPitch));
                float degreesInPixel = mc.gameSettings.fovSetting/event.resolution.getScaledWidth();
                
                mc.fontRendererObj.drawString("+"...
Пример смотрения на конкретную точку(или блок)
Java:
class LookHelper {
    public void lookAtPos(EntityPlayer player, double x, double y, double z) {
        // Тут мы получаем расстояние между смотрящим и точкой куда надо смотреть
        double distX = player.posX - targetX;
        double distY = player.posY - targetY;
        double distZ = player.posZ - targetZ;

        // Хз что это за градусы, в майне это финальное(после компиляции) значение
        double degMc = 57.2957763671875;
        
        // Стандартное вычисление угла по двум координатам
        float targetYaw = (float)(MathHelper.atan2(distZ, distX) * degMc) - 90.0F;
        
        // Так как у нас нет доп. точки для Y(оно и логично), мы должно произвести вычисление за счёт X и Z
        double sqrtXZ = (double) MathHelper.sqrt(distX * distX + distZ * distZ);
        float targetPitch = (float)(-(MathHelper.atan2(distY, sqrtXZ) * degMc));

        player.rotationPitch = interpolateAngle(player.rotationPitch, targetPitch, 30F);
        player.rotationYawHead = interpolateAngle(player.rotationYawHead, targetYaw, 30F);
    }
    
    // Некая "интерполяция" угла, чтобы не было более/менее 0-360 градусов(кек) с последующим сдвигом начальной точки обзора на конечную точку
    private float interpolateAngle(float start, float end, float delta) {
        float deg = MathHelper.clamp(MathHelper.wrapDegrees(end - start), -delta, delta);
        return start + deg;
    }
}

Если же тебе заранее известен Yaw и Pitch, то ты их почти сразу можешь передавать в игрока. В противном случае необходимо использовать код выше
 
Java:
@SubscribeEvent
    public void onRenderText(RenderGameOverlayEvent event){
        if(event.type == RenderGameOverlayEvent.ElementType.TEXT) {
            if (mc.fontRendererObj != null) {

                float playerYaw=mc.thePlayer.getRotationYawHead();
                float playerPitch=mc.thePlayer.rotationPitch;
                
                float anglesDiffYaw = (float) (to360(targetYaw) - to360(playerYaw));
                float anglesDiffPitch = (float) (to360(targetPitch) - to360(playerPitch));
                float degreesInPixel = mc.gameSettings.fovSetting/event.resolution.getScaledWidth();
                
                mc.fontRendererObj.drawString("+", (event.resolution.getScaledWidth()/2)+(anglesDiffYaw/degreesInPixel)-2, (event.resolution.getScaledHeight()/2)+(anglesDiffPitch/degreesInPixel)-3, mc.thePlayer.worldObj.rand.nextBoolean()?0xFF0000:0x00FF00, false);
            }
        }
    }
    public static double to360(double in) {
        return (in + 360) % 360;
    }
 
Назад
Сверху