Рендер предмета в руке

Версия Minecraft
1.6.4
31
1
1
Хотел я сделать так, что если игрок держит меч в руках, то рука тоже рендерилась. Решил делать хук в renderItemInFirstPerson, но получилось лишь то, что видно на скрине. Рука двигается, все хорошо, на надо бы сдвинуть предмет вперед и рука почему то темная. может кто подсказать, как лучше сделать?
код:
код:
    @Hook(injectOnExit = true)
    public static void renderItemInFirstPerson(ItemRenderer renderer, float par1)
    {
        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
          RenderHelper.enableStandardItemLighting();

            Minecraft mc = Minecraft.getMinecraft();
            if(mc.thePlayer.inventory.getCurrentItem() != null && mc.thePlayer.inventory.getCurrentItem().getItem().isFull3D())
            {
                EntityClientPlayerMP entityclientplayermp = mc.thePlayer;
                ItemStack itemstack = mc.thePlayer.inventory.getCurrentItem();

                int i = Item.itemsList[itemstack.itemID].getColorFromItemStack(itemstack, 0);

                int j = i % 65536;
                int k = i / 65536;
                OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)j / 1.0F, (float)k / 1.0F);

                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

                float f5 = mc.theWorld.getLightBrightness(MathHelper.floor_double(entityclientplayermp.posX), MathHelper.floor_double(entityclientplayermp.posY), MathHelper.floor_double(entityclientplayermp.posZ));

                float f7 = (float)(i >> 16 & 255) / 255.0F;
                float f8 = (float)(i >> 8 & 255) / 255.0F;
                float f6 = (float)(i & 255) / 255.0F;

                GL11.glColor4f(f5 * f7, f5 * f8, f5 * f6, 1.0F);

                //GL11.glColor3f(1.0f, 1.0f, 1.0f);
                //GL11.glDisable(GL11.GL_LIGHTING);
                if(f1 <1)
                f1 += 0.075f;
                Render render;
                RenderPlayer renderplayer;
                mc.getTextureManager().bindTexture(mc.thePlayer.getLocationSkin());
                GL11.glPushMatrix();
                float f12 = 0.8F;
                 f7 = entityclientplayermp.getSwingProgress(par1);
                 f8 = MathHelper.sin(f7 * (float)Math.PI);
                 f6 = MathHelper.sin(MathHelper.sqrt_float(f7) * (float)Math.PI);
                GL11.glTranslatef(-f6 * 0.3F, MathHelper.sin(MathHelper.sqrt_float(f7) * (float)Math.PI * 2.0F) * 0.4F, -f8 * 0.4F);
                GL11.glTranslatef(0.8F * f12, -0.75F * f12 - (1.0F - f1) * 0.6F, -0.9F * f12);
                GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
                GL11.glEnable(GL12.GL_RESCALE_NORMAL);
                f7 = entityclientplayermp.getSwingProgress(par1);
                f8 = MathHelper.sin(f7 * f7 * (float)Math.PI);
                f6 = MathHelper.sin(MathHelper.sqrt_float(f7) * (float)Math.PI);
                GL11.glRotatef(f6 * 70.0F, 0.0F, 1.0F, 0.0F);
                GL11.glRotatef(-f8 * 20.0F, 0.0F, 0.0F, 1.0F);
                mc.getTextureManager().bindTexture(entityclientplayermp.getLocationSkin());
                GL11.glTranslatef(-1.0F, 3.6F, 3.5F);
                GL11.glRotatef(120.0F, 0.0F, 0.0F, 1.0F);
                GL11.glRotatef(200.0F, 1.0F, 0.0F, 0.0F);
                GL11.glRotatef(-135.0F, 0.0F, 1.0F, 0.0F);
                GL11.glScalef(1.0F, 1.0F, 1.0F);
                GL11.glTranslatef(5.6F, 0.0F, 0.0F);
                render = RenderManager.instance.getEntityRenderObject(mc.thePlayer);
                renderplayer = (RenderPlayer)render;
                float f11 = 1.0F;
                GL11.glScalef(f11, f11, f11);
                renderplayer.renderFirstPersonArm(mc.thePlayer);
                GL11.glPopMatrix();
                GL11.glColor3f(1.0f, 1.0f, 1.0f);

            }else f1 = 0;
           GL11.glDisable(GL12.GL_RESCALE_NORMAL);
           RenderHelper.disableStandardItemLighting();
           GL11.glDisable(GL11.GL_LIGHTING);
    }
 

Вложения

  • 1590623962319.png
    1590623962319.png
    136 KB · Просмотры: 31
31
1
1
Сдвинуть?
GL11.glTranslatef(X, Y, Z);
Дергай x y z которые флоаты и всё, только делай это в debug'е, так легче будет понять что это вообще работает
Я понимаю, но я хочу, чтобы предложили какую то другую идею решения, тк, например, glTranslate в хуке, в моем случае, будет двигать руку, а не предмет.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
glPushMatrix - открытие матрицы
glPopMatrix - закрытие матрицы, собственно между этими двумя методами и есть матрица, если обьяснять совсем топорно

Так окей, я ору, щас будет лонгрид.

Если коротко, то при помощи матриц можно описывать т.н. афинные трансформации и их комбинации (а именно rotate (поворот), scale (растягивание) и skew(смещение, типа из прямогольника таким образом делается паралеллограмм)).
Если две матрицы умножить, то эти трансформации комбинируются.
Матрица 3х3 описывает афинную трансформацию для трёхмерного пространства, вот только такие транформации не включают в себя translate (перемещение).
Для этого используются матрицы 4x4 - перемещение в 3д пространстве реализуется при помощи skew (без понятия как нормально назвать на русском) 4-мерного пространства.

В старом-старом OpenGL (которым вы тут пользуетесь) вшиты в код три (вроде-бы) матрицы - Model, View, и Projection, про MVP уже сами гуглите, умру пока опишу.

Всякие glTranslatef, glRotatef и прочие, создают матрицу для перемещения/вращения/итд и домножают текущую (ту которую ты выбираешь из этих трёх при помощи glLoadMatrix вроде-бы), добавляя эту трансформацию к ней, ну и очевидно что они делают это наиболее оптимальным образом, а про создание целой новой матрицы - это я описываю ожидаемую семантику.

Однако, очень часто тебе нужно применить транформацию, отрендерить какой-то кусочек, и потом отменить эту трансформацию (или их набор) обратно к какой-то точке.

Для этого в OpenGL существует стэк матриц - glPushMatrix копирует текущую матрицу и ложит в него, после чего над текущей матрицей можно изгаляться как тебе вздумается, ведь после того как ты её изменишь и с её помощью что-нибудь отрендеришь, ты вызовёшь glPopMatrix который возьмёт верхнюю матрицу из того стэка и заменит ею текущую.

Ну и так как это стек, то можно несколько раз делать push, "сохраняясь" в таких-то точках, и потом делать pop, возвращая те значения матрицы.

А открытие и закрытие матрицы, между которыми и есть матрица - это очень странная, непонятная и неверная аналогия крч.
 
7,099
324
1,509
А открытие и закрытие матрицы, между которыми и есть матрица - это очень странная, непонятная и неверная аналогия крч.
Вероятно, @jopi имел ввиду аналогию с блоками кода
Java:
//variable set one
{
    //variable set two
    {
       
    }
    //variable set two
   
    //variable set three
    {
       
    }
    //variable set three
}
//variable set one
Внутри блока кода множество переменных(речь идет не о значениях) может измениться, а по закрытию блока кода вернуться к предыдущему
В этом плане стек матриц действительно схож
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
В этом плане стек матриц действительно схож
Ну если вообще абстрагироваться от матриц и называть это, не знаю, "объявлением транформаций" (по твоей аналогии с переменными), то ок, возможно в таком смысле оно и схоже.

p.s. все теперь всё хукают (это я к тому, что надо сдвигать не в рендере руки, а в рендере итема, или и того и того), а куда делся ванильный форж с ивентами, мдя
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
@jopi
Да я тут ворвался и выпендрился словом "афинные" (как будто я его когда-либо использовал), забей)

Но вообще в сообщении я попытался слегк описать, что там происходит с матрицами в legacy opengl и пояснить за пуш-поп, может кто-то что-то поймёт, наверн надо это выделить куда-то будет.

Если ты это про хуки говорил, то я прост слегк подудивился распространению той либки hohserg-а (эээм, или gloomyfolken-а, кто-то из них такое делал, абсолютный склероз), если это она.
 
Последнее редактирование:
Сверху