关于c ++:我的lookAt和Perspective调用与VS gluPerspective和glLookat有什么不同(多维数据集拉伸)

What's different with my lookAt and perspective calls VS gluPerspective and glLookat (cube stretched)

旁注:大家好,如果您发现我的问题/答案有所帮助,请不要忘记投票。我有点需要...

因此,我对矩阵[投影和模型]的实现似乎有所不同(除了我出于调试目的而注释掉的东西)。以下是在绘制多维数据集时看到的错误的屏幕截图。请记住,我确实使视口和矩阵与窗口大小保持最新,并使用float和int来计算屏幕比例,所以不要打扰,我已经检查了通常的可疑对象.....

屏幕截图

文件(Linux构建,请参阅./build中的自述文件)
旁注:在调试时,我更改了立方体的距离。要重现屏幕截图,请在workspace.cpp的第76行上将mDistance设置为大约90,然后将窗口框架拉伸到窗口右下角标注的尺寸。

请记住屏幕截图和调试文本输出是单独的事件,因为我一直在调试此问题并获取新的数字。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define _AP_MAA 0
#define _AP_MAB 1
#define _AP_MAC 2
#define _AP_MAD 3
#define _AP_MBA 4
#define _AP_MBB 5
#define _AP_MBC 6
#define _AP_MBD 7
#define _AP_MCA 8
#define _AP_MCB 9
#define _AP_MCC 10
#define _AP_MCD 11
#define _AP_MDA 12
#define _AP_MDB 13
#define _AP_MDC 14
#define _AP_MDD 15

设置相机透视图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
}

设置相机方向:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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;
}

调试输出:

LookTo()从:<0,0,0>到:<-1,0,0>:
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.000000 0.000000 0.000000 1.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.000000 0.000000 -1.000000 0.000000


最后,看起来制造麻烦的人只是FOV。 因此,快速的答案是:没有,我没有做任何事情,从文档的角度来看功能。 对于任何有类似问题的人,2.0f * atan(tan(DEFAULT_FOV_RAD/mRatio) * mRatio)为我做了工作。