【问题标题】:gluLookAt alternative doesn't workgluLookAt 替代方法不起作用
【发布时间】:2011-02-21 23:35:55
【问题描述】:

我正在尝试自己计算一个观察矩阵,而不是使用 gluLookAt()。 我的问题是我的矩阵不起作用。但是,在 gluLookAt 上使用相同的参数确实有效。

我创建观察矩阵的方式:

Vector3 Eye, At, Up; //these should be parameters =)

Vector3 zaxis = At - Eye;           zaxis.Normalize();
Vector3 xaxis = Vector3::Cross(Up, zaxis);  xaxis.Normalize();
Vector3 yaxis = Vector3::Cross(zaxis, xaxis);   yaxis.Normalize();

float r[16] = 
{
    xaxis.x,    yaxis.x,    zaxis.x,    0,
    xaxis.y,    yaxis.y,    zaxis.y,    0,
    xaxis.z,    yaxis.z,    zaxis.z,    0,
    0,          0,          0,          1,
};
Matrix Rotation;
memcpy(Rotation.values, r, sizeof(r));

float t[16] = 
{
     1,      0,      0,     0,
     0,      1,      0,     0,
     0,      0,      1,     0,
    -Eye.x, -Eye.y, -Eye.z, 1,
};
    Matrix Translation;
    memcpy(Translation.values, t, sizeof(t));


View = Rotation * Translation; // i tried reversing this as well (translation*rotation)

现在,当我尝试使用此矩阵调用 glMultMatrixf 时,我的引擎中没有显示任何内容,而在 gluLookAt 上使用相同的眼睛、lookat 和 up 值就像我之前所说的那样完美。

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(View);

问题一定出在我在这里发布的代码中,我知道问题不在我的 Vector3/Matrix 类中,因为它们在创建投影矩阵时工作正常。

【问题讨论】:

  • “视图”在将其传递给 glMultMatrix() 时是否以列主要顺序正确存储? (来自 glMultMatrix() 的 OpenGL 文档中的注释:“这与矩阵元素的标准行优先 C 排序不同。”)
  • 我的代码生成的两个矩阵的存储方式与我将结果传递给 glMultMatrix() 的方式相同

标签: c++ opengl


【解决方案1】:

我假设你有一个右手坐标系(它在 OpenGL 中是默认的)。 试试下面的代码。我认为您忘记了标准化,您必须将“-zaxis”放入矩阵中。

Vector3 Eye, At, Up; //these should be parameters =)

Vector3 zaxis = At - Eye; zaxis.Normalize();
Up.Normalize();
Vector3 xaxis = Vector3::Cross(Up, zaxis);  xaxis.Normalize();
Vector3 yaxis = Vector3::Cross(zaxis, xaxis);   yaxis.Normalize();

float r[16] = 
{
    xaxis.x,    yaxis.x,    -zaxis.x,    0,
    xaxis.y,    yaxis.y,    -zaxis.y,    0,
    xaxis.z,    yaxis.z,    -zaxis.z,    0,
    0,          0,          0,          1,
};

【讨论】:

  • 很遗憾,当它工作时我再也没有回到这里。原来我在 Vector3 的构造函数中遇到了一些问题。这工作得很好,我什至在其他地方使用它。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 2010-11-28
  • 2012-11-03
相关资源
最近更新 更多