具有固定位置的OpenGl广告牌

具有固定位置的OpenGl广告牌,opengl,3d,Opengl,3d,我正在opengl中创建一棵树,它运行良好。它基本上是2d树,所以我正在添加广告牌。。。 当我移动我的相机时,我得到了偏移量的问题,树沿着相机从它的位置移动到另一个位置。。 我正在尽我所能来解决这个问题,但没有成功。。。 帮助源代码 你能帮我解决这个问题吗 这是广告牌代码 void billboardCheatCylindricalBegin() { float modelview[16]; int i, j; // save the current modelvie

我正在opengl中创建一棵树,它运行良好。它基本上是2d树,所以我正在添加广告牌。。。 当我移动我的相机时,我得到了偏移量的问题,树沿着相机从它的位置移动到另一个位置。。 我正在尽我所能来解决这个问题,但没有成功。。。 帮助源代码

你能帮我解决这个问题吗

这是广告牌代码

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();
}
void billboardCheatCylindricalBegin(){
浮动模型视图[16];
int i,j;
//保存当前模型视图矩阵
glPushMatrix();
//获取当前模型视图矩阵
glGetFloatv(GL_模型视图_矩阵,模型视图);
对于(i=0;i<3;i+=2)
对于(j=0;j<3;j++){
如果(i==j)
modelview[i*4+j]=1.0;
其他的
modelview[i*4+j]=0.0;
}
//设置modelview矩阵
glLoadMatrixf(模型视图);
}
树()//我的树调用在2d中没有广告牌的情况下可以正常工作,但在使用广告牌时可以随相机移动
无效广告牌结束(){
//恢复以前的
//存储模型视图矩阵
glPopMatrix();
}

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

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

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

完整算法

glGetFloatv(GL_MODELVIEW_矩阵,MODELVIEW);
对于(i=0;i<3;i++)
{
对于(j=0;j<3;j++)
modelview[i*4+j]=i==j?1.0f:0.0f;
}
glLoadMatrixf(模型视图);
如果矩阵具有缩放组件,则需要计算缩放因子并通过缩放因子设置对角线:

float*m=modelview;
float scaleX=sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);
浮点数=sqrt(m[4]*m[4]+m[5]*m[5]+m[6]*m[6]);
浮点数=sqrt(m[8]*m[8]+m[9]*m[9]+m[10]*m[10]);
对于(i=0;i<3;i++)
{
对于(j=0;j<3;j++)
模型视图[i*4+j]=0.0f;
}
modelview[0]=scaleX;
modelview[5]=scaleY;
modelview[10]=scaleZ;

@Struggler你所说的“仍然偏移”是什么意思?你们有比例矩阵吗?我的意思是它不会影响任何东西(仍然沿着相机移动)…是的,我正在使用glScalef对其进行缩放,因为使用您的代码后,它被放置在表面上,非常薄。@Struggler确保投影矩阵设置为当前
GL_投影
矩阵,并且所有其他变换都设置为当前
GL_模型视图
矩阵(请参阅)。此外,你还必须考虑这个比例——@ Struggler,你调用<代码> ByBoADReCaltualCurrasalActudio< <代码> >在代码> GLRADION/COD>和 BelBoADRead 右>代码> GLTENT/COD>,不是吗?用你的代码修复它……只是GLTANTLAFF在我的位置上的错位。