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