[1.6.4]MovingObjectPosition

435
1
В общем знаю что MovingObjectPosition - получение энтитя/блока на который например смотрит игрок. Теперь вопрос - нужно получить точку на экране, куда смотрит игрок(координаты в двухмерной плоскости). Как их получить?
 
MrCreppo написал(а):
В общем знаю что MovingObjectPosition - получение энтитя/блока на который например смотрит игрок. Теперь вопрос - нужно получить точку на экране, куда смотрит игрок(координаты в двухмерной плоскости). Как их получить?
Эмм... а разве игрок не смотрит всегда ровно посередине экрана?
 
Foghrye4 написал(а):
MrCreppo написал(а):
В общем знаю что MovingObjectPosition - получение энтитя/блока на который например смотрит игрок. Теперь вопрос - нужно получить точку на экране, куда смотрит игрок(координаты в двухмерной плоскости). Как их получить?
Эмм... а разве игрок не смотрит всегда ровно посередине экрана?
Мне для 3 лица нужно
 
А есть разница?
cb4ac306404911609bf5de89ce39387f.jpg
 
Есть
3ecd91c2f76b.png

[merge_posts_bbcode]Добавлено: 08.08.2015 15:41:03[/merge_posts_bbcode]

Было получение блока нажатием мыши из гуи:
Код:
//не стоит каждый раз создавать новый буфер, это чревато проблемами с производительностью
    private static IntBuffer viewportBuf = BufferUtils.createIntBuffer(16);
    private static FloatBuffer projectionBuf = BufferUtils.createFloatBuffer(16);
    private static FloatBuffer modelviewBuf = BufferUtils.createFloatBuffer(16);

    /**
     * Метод использует текущие матрицу проекции и modelview матрицу, так что вызывать
     * его во время отрисовки ГУИ - не дело. Вызывай в RenderWorldLastEvent, например
     */
    public MovingObjectPosition calcBlockMouseOver(World world){
        GL11.glGetInteger(GL11.GL_VIEWPORT, viewportBuf);
        GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projectionBuf);
        GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelviewBuf);

        float vx = Mouse.getX();
        // я не очень помню, где находится 0 по оси Y: сверху или снизу.
        // если сверху, то vy = mc.displayHeight - Mouse.getY().
        float vy = Mouse.getY();

        // этот буфер не нативный, так что всё ОК
        FloatBuffer resultBuf = FloatBuffer.allocate(3);

        // В той статье предполагается ставить z на -1,
        // но я не уверен, что оно будет правильно работать.
        // Всё-таки миниальная глубина - это 0, а не -1. Решай сам, кому верить 
        Project.gluUnProject(vx, vy, -1, modelviewBuf, projectionBuf, viewportBuf, resultBuf);
        Vec3 p1 = Vec3.createVectorHelper(resultBuf.get(0), resultBuf.get(1), resultBuf.get(2));

        Project.gluUnProject(vx, vy, 1, modelviewBuf, projectionBuf, viewportBuf, resultBuf);
        Vec3 p2 = Vec3.createVectorHelper(resultBuf.get(0), resultBuf.get(1), resultBuf.get(2));
        
        //И всё бы ничего, но p1 и p2 центрированы то ли к камере, то ли к голове персонажа.
        //Склоняюсь ко второму варианту. Поправим это.
        
        p1 = p1.addVector(RenderManager.renderPosX, RenderManager.renderPosY, RenderManager.renderPosZ);
        p2 = p2.addVector(RenderManager.renderPosX, RenderManager.renderPosY, RenderManager.renderPosZ);
        
        return world.clip(p1, p2);
    }
Тут нужно в обратную сторону
 
Эмм... Быстро - никак. Нужно как-то рейтрейсить от глаз игрока в направлении, куда он смотрит (а я даже не знаю, куда он в этом моде смотрит). Если я правильно понял, что тебе нужно, то самый простой вариант - отрендерить всю сцену с позиции игрока в направлении, найти точку, куда он смотрит. По этой точке найти координаты, куда попадает взгляд, и сделать проекцию этой точки на экран (через Project.gluProject(), например)
 
MrCreppo написал(а):
Было получение блока нажатием мыши из гуи
Тут нужно в обратную сторону
Тогда это получение двумерных координат блока на экране игрока.
У меня что-то подобное делалось
Код:
           int xShift = Math.round(displayScaledWidth/100*(lastPlayerYaw - Minecraft.getMinecraft().renderViewEntity.prevRotationYaw));
           int yShift = Math.round(displayScaledHeight/64*(lastPlayerPitch - Minecraft.getMinecraft().renderViewEntity.prevRotationPitch));
Где xShift и yShift - смещение в пикселях от центра экрана, но тут ты должен заменить lastPlayerYaw на проекцию угла между нужным тебе блоком и вектором {1;0;0} на плоскость XZ. Числовые коэффициенты у меня эмпирические. Я не решал такую задачу, как у тебя, так что тут тебе помочь больше не могу.
 
GloomyFolken написал(а):
Эмм... Быстро - никак. Нужно как-то рейтрейсить от глаз игрока в направлении, куда он смотрит (а я даже не знаю, куда он в этом моде смотрит). Если я правильно понял, что тебе нужно, то самый простой вариант - отрендерить всю сцену с позиции игрока в направлении, найти точку, куда он смотрит. По этой точке найти координаты, куда попадает взгляд, и сделать проекцию этой точки на экран (через Project.gluProject(), например)
И каким образом найти эту точку?
[merge_posts_bbcode]Добавлено: 08.08.2015 17:19:25[/merge_posts_bbcode]

Итак я могу получать координаты(мировые) точки куда смотрит игрок. Мои дальнейшие действия?
Пробовал так - бред.
Код:
    private static IntBuffer viewportBuf = BufferUtils.createIntBuffer(16);
    private static FloatBuffer projectionBuf = BufferUtils.createFloatBuffer(16);
    private static FloatBuffer modelviewBuf = BufferUtils.createFloatBuffer(16);

....
            int xShift = 0;
            int yShift = 0;
            if(mc.objectMouseOver!=null)
            {
                GL11.glGetInteger(GL11.GL_VIEWPORT, viewportBuf);
                GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projectionBuf);
                GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelviewBuf);
                FloatBuffer resultBuf = FloatBuffer.allocate(3);
                Project.gluProject((float)mc.objectMouseOver.hitVec.xCoord, (float)mc.objectMouseOver.hitVec.yCoord, (float)mc.objectMouseOver.hitVec.zCoord, modelviewBuf, projectionBuf, viewportBuf, resultBuf);
                xShift = Math.round(resultBuf.get(0));
                yShift = Math.round(resultBuf.get(1));
            }
 
Нууу, передавать в gluProject явно нужно не координаты относительно центра мира, а координаты относительно позиции персонажа.
 
GloomyFolken написал(а):
Нууу, передавать в gluProject явно нужно не координаты относительно центра мира, а координаты относительно позиции персонажа.
в каком смысле? Например так?:
Код:
//xCoord
mc.objectMouseOver.hitVec.xCoord-player.posX
 
GloomyFolken написал(а):
Угу, только по оси Y считать надо от глаз. Проще вычитать RenderManager.renderPosX/Y/Z
Делаю так:
Код:
                Project.gluProject((float)(mc.objectMouseOver.hitVec.xCoord-RenderManager.renderPosX), (float)(mc.objectMouseOver.hitVec.yCoord-RenderManager.renderPosY), (float)(mc.objectMouseOver.hitVec.zCoord-RenderManager.renderPosZ), modelviewBuf, projectionBuf, viewportBuf, resultBuf);
                xShift = Math.round(resultBuf.get(0));
                yShift = Math.round(resultBuf.get(1));

По Y происходит слишком сильное смещение. Где ошибка?
 
>от глаз
Попробуй добавить\вычесть высоту глаз. Я хз какие значения там принимает renderPos, хотя по идее он должен бы брать позицию глаз как раз, судя по названию.
 
Oldestkon написал(а):
>от глаз
Попробуй добавить\вычесть высоту глаз. Я хз какие значения там принимает renderPos, хотя по идее он должен бы брать позицию глаз как раз, судя по названию.
Кстати говоря player.posY - высота от глаз
 
Назад
Сверху