Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的lookAt和perspective调用与gluPerspective和glLookat(立方体拉伸)有什么不同_C++_Opengl_Qt4 - Fatal编程技术网

C++ 我的lookAt和perspective调用与gluPerspective和glLookat(立方体拉伸)有什么不同

C++ 我的lookAt和perspective调用与gluPerspective和glLookat(立方体拉伸)有什么不同,c++,opengl,qt4,C++,Opengl,Qt4,旁注:大家好,如果你们觉得我的问题/答案有帮助,请不要忘记投票。我有点需要它 因此,我对矩阵[投影和模型]的实现似乎有一些不同之处,而不是为了调试而注释掉的东西。下面是我在绘制立方体时看到的错误截图。请记住,我会根据窗口大小更新视口和矩阵,并使用float而不是int计算屏幕比率,所以不用麻烦问了,我已经检查了常见的疑点 旁注:调试时,我更改了立方体的距离。要复制屏幕截图,请在workspace.cpp的第76行将mDistance设置为约90,并将窗框拉伸至窗口右下角标注的尺寸 请记住屏幕

旁注:大家好,如果你们觉得我的问题/答案有帮助,请不要忘记投票。我有点需要它

因此,我对矩阵[投影和模型]的实现似乎有一些不同之处,而不是为了调试而注释掉的东西。下面是我在绘制立方体时看到的错误截图。请记住,我会根据窗口大小更新视口和矩阵,并使用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;
}