OpenGL 3D旋转看起来并不像预期的那样

时间:2014-03-31 21:34:41

标签: c++ qt opengl 3d rotation

我需要在OpenGL 2.1(实际兼容性配置文件)中获得植物细胞二维层的略微3D表示。它到目前为止看起来还不错,没有变换:

Happy day scenario

您在中心看到的是我为了比较目的而绘制的一个小型3D立方体。它使用与所有其他模型相同的变换矩阵。每个单元由挤压高原(较轻的部分)和倾斜的墙壁(阴影位)组成。有一个漫射白光源从眼睛周围的某个地方指向细胞。

现在是我被卡住的部分。缩放和翻译工作得很好,但我不能让单元格的3D旋转起作用。围绕(0,0,0)定义的立方体完全按照预期旋转,但是单元格表现出一种我无法解释的奇怪行为。

这里的模型略微旋转。

enter image description here

首先,阴影是不同的(正如我所预料的那样)。光源不动。我尝试过移动它,但它并没有真正改变太多,所以这完全是另一个问题。我特别喜欢的是细胞切断的方式。左下角有缺件。可以说我们正在寻找那个细胞的那个部分,但那个细胞的另一部分看起来并不像预期的那样。或者灯光是不是很糟糕?

我正在寻找这种仅略微3D模型的旋转,这种模型看起来更令用户满意。我会改变照明吗?请注意,我无法使用Glu,因此没有gluLookAt来查看我的相机。会有另一种方式吗?鼓励创意答案。简而言之,我需要一种方法让用户在这个略微3D的模型中导航,知道它主要是2D,感觉很直观。

上下文的更多图片。该应用程序通过使用鼠标在屏幕上拖动来支持旋转,因此很容易玩。

围绕y轴旋转90度(OK)

Rotated 90 degrees about the y axis

旋转得非常轻微

enter image description here

enter image description here

转换:

    glLoadIdentity();

glScalef(m_preferences->m_mesh_magnification, m_preferences->m_mesh_magnification, 1.0);
glRotatef(m_totalRotation.x() / 5., 0, 1, 0); // user rotation
glRotatef(m_totalRotation.y() / 5., -1, 0, 0); // user rotation

resizeGL(w, h)的正文,负责投影视图:

    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
glOrtho(-((GLdouble) w) / 2, ((GLdouble) w) / 2, ((GLdouble) h) / 2, -((GLdouble) h) / 2, -1.0, 1.0);
//glFrustum(...) if we want a realistic projection
glMatrixMode (GL_MODELVIEW);

基本上我让y指向下并且在中间有(0,0)。 y方向我认为模仿Qt的默认,而原点的位置是项目决策。

编辑:旋转后的最终结果

enter image description here

1 个答案:

答案 0 :(得分:1)

glOrtho(-((GLdouble) w) / 2, ((GLdouble) w) / 2, ((GLdouble) h) / 2, -((GLdouble) h) / 2, -1.0, 1.0);

-1.0, 1.0是你的近和远剪裁平面。不会绘制在近平面前面或远平面后面的任何东西。你需要增加这些值 - 但不要超过你需要的值,因为你将失去Z缓冲区的精度。

相关问题