具有固定位置的 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迭代i
和j
,通过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;
我正在用 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迭代i
和j
,通过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;