Билборд в LWJGL

Опитвах се да направя билборд с помощта на LWJGL и успях частично. Четворката се появява и се изправя пред камерата, когато се нахвърлям. Въпреки това, веднага щом завъртя камерата по някоя от осите, четворката също се движи по осите по различни начини. Ето кода, който използвам:

/***************************************************************************************************************************************************************************************************
 * All rendering happens here...
 **************************************************************************************************************************************************************************************************/
private void render() {

    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
    GL11.glLoadIdentity(); // Reset The View

    //GL11.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, lightPosition); // Position The Light

    GL11.glRotatef(360.0f - yrot, 0, 1.0f, 0);
    GL11.glRotatef(lookupdown, 1.0f, 0, 0);

    GL11.glTranslatef(-xpos, 0, -zpos);


    GL11.glCallList(blocksList);
    GL11.glCallList(tilesList);
    GL11.glCallList(roofList);

    /* Render billboards */
    Billboard bb = lvLoader.currentLevel.billboards[0];
    GL11.glPushMatrix();
    GL11.glRotatef(360.0f - yrot, 0, -1.0f, 0);
    GL11.glRotatef(lookupdown, -1.0f, 0, 0);
    GL11.glBegin(GL11.GL_QUADS);
    GL11.glVertex3f(bb.origin.x + 0.5f, bb.origin.y + 0.5f, bb.origin.z);
    GL11.glVertex3f(bb.origin.x - 0.5f, bb.origin.y + 0.5f, bb.origin.z);
    GL11.glVertex3f(bb.origin.x - 0.5f, bb.origin.y - 0.5f, bb.origin.z);
    GL11.glVertex3f(bb.origin.x + 0.5f, bb.origin.y - 0.5f, bb.origin.z);
    GL11.glEnd();
    GL11.glPopMatrix();

Ето функциите, контролиращи lookupdown и yrot.

if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { // Is PageUp Being Pressed?
        lookupdown -= 1.0f; // Rotate The Secene Downwards
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { // Is PageDown Being Pressed?
        lookupdown += 1.0f; // Rotate The Scene Upwards
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT))
    {
        yrot -= 1.5f; // Rotate The Scene To The Left
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_LEFT))
    {
        yrot += 1.5f; // Rotate The Scene To The Left
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_W))
    {
        adjustXZ((float) Math.sin(yrot * piover180) * 0.05f, (float) Math.cos(yrot * piover180) * 0.05f, false, false);
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_S))
    {
        adjustXZ((float) Math.sin(yrot * piover180) * 0.05f, (float) Math.cos(yrot * piover180) * 0.05f, true, true);
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_D))
    {
        adjustXZ((float) Math.sin((yrot-90) * piover180) * 0.05f, (float) Math.cos((yrot-90) * piover180) * 0.05f, false, false);
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_A))
    {
        adjustXZ((float) Math.sin((yrot+90) * piover180) * 0.05f, (float) Math.cos((yrot+90) * piover180) * 0.05f, false, false);
    }

private void adjustXZ(float x, float z, boolean xAdd, boolean zAdd)
{
    if (collisionCheck(x, z, xAdd, zAdd))
        return;

    if (xAdd)
        xpos += x;
    else if (!xAdd)
        xpos -= x;

    if (zAdd)
        zpos += z;
    else if (!zAdd)
        zpos -= z;
}

person Myzreal    schedule 23.11.2011    source източник
comment
Бихте ли дали малко пояснение откъде получавате yrot и lookupdown? Изглежда, че това може да са стойности за камерата, но е трудно да бъдем сигурни без повече информация.   -  person vaughandroid    schedule 23.11.2011
comment
Да, те контролират камерата. Добавих ги към основната публикация.   -  person Myzreal    schedule 23.11.2011


Отговори (1)


Не съм запознат с LWJGL, така че не съм 100% сигурен какво очаква, но въз основа на опита ми с други 3D API звучи много така, сякаш сте преобразували матрицата си в грешен ред.

Опитайте да промените кода си, както следва:

GL11.glPushMatrix();
GL11.glTranslatef(bb.origin.x, bb.origin.y, bb.origin.z); // Translation here
GL11.glRotatef(360.0f - yrot, 0, -1.0f, 0);
GL11.glRotatef(lookupdown, -1.0f, 0, 0);
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex3f(0.5f, 0.5f, 0); // No translation here anymore
GL11.glVertex3f(0.5f, 0.5f, 0;
GL11.glVertex3f(0.5f, 0.5f, 0);
GL11.glVertex3f(0.5f, 0.5f, 0);
GL11.glEnd();

Като отделна бележка, вие не използвате конвенционална техника за поставяне на билбордове. Вместо билбордовете винаги да са обърнати към камерата, вие ги карате винаги да са перпендикулярни на камерата. Това ще бъде забележимо за билбордови обекти близо до краищата на фруструма на вашия изглед. Ще оставя на вас да разгледате това по-нататък!

person vaughandroid    schedule 24.11.2011
comment
Благодаря, това реши проблема. Наистина трябва да разбера по-добре как работят преводите и ротациите в openGL. Може би имате статии за това? Мисля, че перпендикулярните билбордове ще са достатъчни за моя малък проект, но ще проуча този въпрос допълнително. Благодаря за отделеното време! - person Myzreal; 24.11.2011
comment
Съжалявам, не съм сигурен, че мога да бъда много полезен при намирането на статии/уроци. Измина известно време, откакто работих директно с OpenGL, тъй като съм повече програмист на геймплей, отколкото на графичен програмист. Все пак има много неща, просто потърсете в Google и рано или късно ще попаднете на сайт или два с прилични уроци, които отговарят на вашия стил на учене и ниво на опит... Успех! - person vaughandroid; 24.11.2011