具有固定位置的 OpenGl 广告牌

OpenGl Billboards with Fix Position

我正在用 opengl 创建一棵树,它工作正常。它基本上是 2d 树,所以我正在添加广告牌... 当我移动我的相机时,我遇到了偏移问题,树沿着相机从它的位置移动到另一个位置.. 我正在尝试我所知道的一切来解决这个问题但没有成功...... 来自 http://lighthouse3d.com/opengl/billboarding/billboardingtut.pdf

的帮助代码

你能帮我解决这个问题吗?

这是广告牌代码

void billboardCheatCylindricalBegin() {

    float modelview[16];
    int i, j;

    // save the current modelview matrix
    glPushMatrix();

    // get the current modelview matrix
    glGetFloatv(GL_MODELVIEW_MATRIX, modelview);

    for (i = 0; i < 3; i += 2)
        for (j = 0; j < 3; j++) {
            if (i == j)
                modelview[i * 4 + j] = 1.0;
            else
                modelview[i * 4 + j] = 0.0;
        }

    // set the modelview matrix
    glLoadMatrixf(modelview);
}

Tree(); //my tree call which works fine without billboard in 2d but moves with camera while using Billboard

void billboardEnd() {

    // restore the previously 
    // stored modelview matrix
    glPopMatrix();
}

您需要将模型视图矩阵的左上角 3x3 更改为单位矩阵。从0到<3迭代ij,通过i * 4 + j.
计算字段的索引 您错误地将 i 增加了 2 而不是 1:

for (i = 0; i < 3; i += 2)

for (i = 0; i < 3; i ++)

完整算法

glGetFloatv(GL_MODELVIEW_MATRIX, modelview);

for (i = 0; i < 3; i++)
{
    for (j = 0; j < 3; j++)
        modelview[i*4 + j] = i == j ? 1.0f : 0.0f;
}

glLoadMatrixf(modelview);

如果矩阵有缩放分量,需要计算缩放因子,并通过缩放因子设置对角线:

float *m = modelview;
float scaleX = sqrt(m[0]*m[0] + m[1]*m[1] + m[2]*m[2]); 
float scaleY = sqrt(m[4]*m[4] + m[5]*m[5] + m[6]*m[6]);
float scaleZ = sqrt(m[8]*m[8] + m[9]*m[9] + m[10]*m[10]);

for (i = 0; i < 3; i++)
{
    for (j = 0; j < 3; j++)
        modelview[i*4 + j] = 0.0f;
}

modelview[0] = scaleX;
modelview[5] = scaleY;
modelview[10] = scaleZ;