C++ 我的lookAt和perspective调用与gluPerspective和glLookat(立方体拉伸)有什么不同
旁注:大家好,如果你们觉得我的问题/答案有帮助,请不要忘记投票。我有点需要它 因此,我对矩阵[投影和模型]的实现似乎有一些不同之处,而不是为了调试而注释掉的东西。下面是我在绘制立方体时看到的错误截图。请记住,我会根据窗口大小更新视口和矩阵,并使用float而不是int计算屏幕比率,所以不用麻烦问了,我已经检查了常见的疑点 旁注:调试时,我更改了立方体的距离。要复制屏幕截图,请在workspace.cpp的第76行将mDistance设置为约90,并将窗框拉伸至窗口右下角标注的尺寸 请记住屏幕截图和调试文本输出是独立的事件,因为我一直在调试这个问题并获得新的数字 守则: 设置摄影机透视图:C++ 我的lookAt和perspective调用与gluPerspective和glLookat(立方体拉伸)有什么不同,c++,opengl,qt4,C++,Opengl,Qt4,旁注:大家好,如果你们觉得我的问题/答案有帮助,请不要忘记投票。我有点需要它 因此,我对矩阵[投影和模型]的实现似乎有一些不同之处,而不是为了调试而注释掉的东西。下面是我在绘制立方体时看到的错误截图。请记住,我会根据窗口大小更新视口和矩阵,并使用float而不是int计算屏幕比率,所以不用麻烦问了,我已经检查了常见的疑点 旁注:调试时,我更改了立方体的距离。要复制屏幕截图,请在workspace.cpp的第76行将mDistance设置为约90,并将窗框拉伸至窗口右下角标注的尺寸 请记住屏幕
void APCamera::setPerspective(GMFloat_t fov, GMFloat_t aspect, GMFloat_t near, GMFloat_t far)
{
GMFloat_t difZ = near - far;
GMFloat_t *data;
mProjection->clear(); //set to identity matrix
data = mProjection->getData();
GMFloat_t v = 1.0f / tan(fov / 2.0f);
data[_AP_MAA] = v / aspect;
data[_AP_MBB] = v;
data[_AP_MCC] = (far + near) / (difZ);
data[_AP_MCD] = -1.0f;
data[_AP_MDD] = 0.0f;
data[_AP_MDC] = (2.0f * far * near)/ (difZ);
mRatio = aspect;
mInvProjOutdated = true;
mIsPerspective = true;
}
设置摄影机方向:
bool APCamera::lookTo(Coordinate &to, Coordinate &from, Coordinate &up)
{
Coordinate f, unitUp, right;
GMFloat_t *data;
CoordinateOp::diff(&to, &from, &f);
VectorOp::toUnit(&f, &f);
VectorOp::toUnit(&up, &unitUp);
VectorOp::cross(&f, &unitUp, &right);
if((fabs(right.x) < FLOAT_THRESHOLD) && (fabs(right.y) < FLOAT_THRESHOLD) && (fabs(right.z) < FLOAT_THRESHOLD))
{
return false;
}
mCamPt = from;
VectorOp::toUnit(&right, &mRight);
mForward = f;
VectorOp::cross(&mRight, &mForward, &mUp);
mModelView->clear();
data = mModelView->getData();
data[_AP_MAA] = mRight.x;
data[_AP_MBA] = mRight.y;
data[_AP_MCA] = mRight.z;
data[_AP_MAB] = mUp.x;
data[_AP_MBB] = mUp.y;
data[_AP_MCB] = mUp.z;
data[_AP_MAC] = -mForward.x;
data[_AP_MBC] = -mForward.y;
data[_AP_MCC] = -mForward.z;
//translation part is commented out to narrow bugs down, "camera" is kept at the center (0,0,0)
//data[_AP_MDA] = (data[_AP_MAA] * -mCamPt.x) + (data[_AP_MBA] * -mCamPt.y) + (data[_AP_MCA] * -mCamPt.z);
//data[_AP_MDB] = (data[_AP_MAB] * -mCamPt.x) + (data[_AP_MBB] * -mCamPt.y) + (data[_AP_MCB] * -mCamPt.z);
//data[_AP_MDC] = (data[_AP_MAC] * -mCamPt.x) + (data[_AP_MBC] * -mCamPt.y) + (data[_AP_MCC] * -mCamPt.z);
mInvViewOutdated = true;
return true;
}
调试输出:
查找从:到::
0.000000 0.000000 -1.000000 0.000000
0.000000 1.000000 0.000000 0.000000
1.000000 -0.000000 -0.000000 0.000000
0.0000000.0000000.0000001.000000
setPerspective fov:0.785398比率:1.185185近距离:0.500000远距离:100.000000:
2.036993 0.000000 0.000000 0.000000
0.000000 2.414213 0.000000 0.000000
0.000000 0.000000 -1.010050 -1.005025
0.0000000.000000-1.0000000.000000最后,看起来麻烦制造者只是FOV。所以快速的回答是不,我没有做任何不同于文档中的透视图和函数的事情。对于任何有类似问题的人,2.0f*atantanDEFAULT\u FOV\u RAD/mRatio*mRatio为我做了这项工作 你的矩阵看起来很好,所以。。。。从这里到哪里?你回答的最后一个问题暗示这是矩阵。它可能是在两周内。或者矩阵的应用方式。您曾经提到您已将完整的源代码粘贴/链接到某个地方。我没见过这个。但是我想看看。我已经附上了一个文件的链接。这有点乱,希望构建文件夹中的自述文件能有所帮助……加载到opengl时,您是否检查了矩阵转换?
bool APCamera::lookTo(Coordinate &to, Coordinate &from, Coordinate &up)
{
Coordinate f, unitUp, right;
GMFloat_t *data;
CoordinateOp::diff(&to, &from, &f);
VectorOp::toUnit(&f, &f);
VectorOp::toUnit(&up, &unitUp);
VectorOp::cross(&f, &unitUp, &right);
if((fabs(right.x) < FLOAT_THRESHOLD) && (fabs(right.y) < FLOAT_THRESHOLD) && (fabs(right.z) < FLOAT_THRESHOLD))
{
return false;
}
mCamPt = from;
VectorOp::toUnit(&right, &mRight);
mForward = f;
VectorOp::cross(&mRight, &mForward, &mUp);
mModelView->clear();
data = mModelView->getData();
data[_AP_MAA] = mRight.x;
data[_AP_MBA] = mRight.y;
data[_AP_MCA] = mRight.z;
data[_AP_MAB] = mUp.x;
data[_AP_MBB] = mUp.y;
data[_AP_MCB] = mUp.z;
data[_AP_MAC] = -mForward.x;
data[_AP_MBC] = -mForward.y;
data[_AP_MCC] = -mForward.z;
//translation part is commented out to narrow bugs down, "camera" is kept at the center (0,0,0)
//data[_AP_MDA] = (data[_AP_MAA] * -mCamPt.x) + (data[_AP_MBA] * -mCamPt.y) + (data[_AP_MCA] * -mCamPt.z);
//data[_AP_MDB] = (data[_AP_MAB] * -mCamPt.x) + (data[_AP_MBB] * -mCamPt.y) + (data[_AP_MCB] * -mCamPt.z);
//data[_AP_MDC] = (data[_AP_MAC] * -mCamPt.x) + (data[_AP_MBC] * -mCamPt.y) + (data[_AP_MCC] * -mCamPt.z);
mInvViewOutdated = true;
return true;
}