- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在完成一项绘制线框 GLUT 标准对象的任务。这看起来很简单,但我们被告知我们不能使用 gluAtLook()、glOrtho()、glFrustrum,但我们必须使用 glTranslate()、glScale() 和 glRotate。如何在不使用 glMatrixMode(GL_PROJECTION) 中的这些函数的情况下投影对象?
这是我目前所拥有的:
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <math.h> // for sqrt()
#include <glut.h>
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glLoadIdentity(); /* clear the matrix */
/* viewing transformation */
glTranslatef(0.0, 0.0, -5.0);
glScalef(1.0, 2.0, 1.0); /* modeling transformation */
glutWireCube(1.0);
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
//glTranslatef(0.0, 0.0, -5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
有人可以帮忙吗?
最佳答案
we are told we cannot use gluAtLook(), glOrtho(), glFrustrum but we must use glTranslate(), glScale() and glRotate
gluLookAt
设置世界 View 空间变换,glOrtho
做 View 到正交投影空间变换,glFrustum
做 View 到透视投影空间转型。当你说你的导师不允许使用它时,这显然意味着意图是首先了解这些功能是如何工作的。
互联网上有很多资源可以教您这些。 Here's one由著名的加州大学伯克利分校教授 Ravi Ramamoorthi 博士撰写。 SongHo有good articles这将帮助您做同样的事情。
我可以在 2D 中演示一个简单的案例。假设我们有一个用对象定义的世界(为简单起见,我们取一个点 P);我们希望相机位于 (3, 3),其 X 轴和 Y 轴指向与世界 X 轴和 Y 轴相反的方向。为简单起见,我们假设两个帧具有相同的比例因子,即 X 和 Y 方向上的 1 个单位对两个系统测量相同的距离(幅度)。所以这两个框架的区别仅在于方向和原点位置(W0 和 V0 是表示它们的符号)。
我们需要推导出 Mworld->view,即将世界空间中的点映射到 View 空间的矩阵。这就是现已弃用的 gluLookAt
函数计算并与 GL_MODELVIEW 矩阵堆栈相乘的结果。该矩阵将用于从相机的视点获取世界 View 。
We know that Mworld->view = Tview->world。将框架 A 的点映射到框架 B 的矩阵也将是将 B 的框架转换为 A 的框架的矩阵。推导过程是这样的
世界中的点 P 以 (1, 2) = Pw 作为坐标,我们有效地找到一个矩阵,当它与 Pw 相乘时将得到Pv 即相同点在 View 框架中的坐标。该点被写为 3D 点,因为 2D 点的均匀扩展将是 3D 点;齐次坐标为 1,因为它是一个点;如果它是一个 vector ,它将是 0。
第一步是旋转;将 View 的框架旋转 -180°(右手系统,+ve 逆时针旋转);现在两个框架的轴都沿着相同的方向。我们必须解决原点差异,这是通过翻译完成的,这是第 2 步。将两者相乘将得到所需的矩阵。请注意,通过后乘,每一步都会将 View 的框架更接近世界的框架。此外,每个转换都基于我们所在的当前本地框架,而不是基于起始的全局(世界)框架。
同样的想法也可以扩展到 3D,需要更多的努力。在上面的推导中,我只需要旋转矩阵、平移矩阵和矩阵乘法;没有 gluLookat
。我给你的链接应该有助于计算 3D 的相同值。投影矩阵推导有点复杂。但是,您仍然可以在不使用 glOrtho
的情况下获得结果;我上面给出的链接有最终矩阵的公式;您可以使用它组成一个矩阵并将其乘以 GL_PROJECTION 矩阵堆栈。
注意:上述推导假设列 vector ,因此变换矩阵(如旋转)和乘法顺序是基于它完成的。如果您采用行 vector 约定,则转置所有矩阵并反转乘法顺序,因为
(AB)^T = B^T A^T
关于c++ - 计算 gluLookAt、glOrtho 和 glFrustum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22715044/
我在 OpenGL 的天空盒内制作过山车,并且没有太多关于它的功能或计算机图形的背景知识,这被证明是非常困难的。我使用 Catmull-Rom 样条插值绘制了一个过山车,并使用 glVertex3f
我正在尝试制作一个在 3D 空间中自由移动的相机。 glulookat 函数如下所示: gluLookAt(g_eye[0],g_eye[1],g_eye[2], g_look
我正在尝试将我的太空入侵者游戏切换为第一人称视角,即从船上看世界的视角。我对应该关注什么点感到有点困惑。我目前在 gluLookAt 中使用这些参数: GL11.glMatrixMode(GL11.G
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
我正在尝试使用 gluLookAt() 函数来控制放大和缩小。现在它根本没有改变矩阵,我不知道为什么。 相关代码如下: // Basic Opengl display function void on
我没有多少 OpenGL 经验。我正在尝试画一个茶壶并在茶壶周围移动相机。为此,我使用了 gluLookAt 函数。问题是,当我调用 gluLookAt 时,屏幕是空白的,我看不到我的茶壶。 #inc
我刚买了一台新电脑,现在必须让我的演示程序与 SDL2/OpenGL 一起运行。我使用该程序尝试了各种技术并使用了 gluLookAt(显然,不应该再使用它,甚至永远不应该使用它)。 现在我正在寻找一
我使用 Eclipse 在 OpenGL 中创建了一个保龄球游戏。 现在我想在按下按键时更改相机的 View 。 但是当我按下 x 按钮时,一切都消失了。 这里是我们的代码:- #include #
我正在用 opengl 编程,我想更改相机 View : ... void RenderScene() //Zeichenfunktion { glClearColor( 1.0, 0.5, 0.0
伪代码: drawScene() { for(every 3Dobject) { glMatrixMode(GL_MODELVIEW); glLoadIdent
这就是我计算视线 vector 和向上 vector 的方式。 ly = sin(inclination); lx = cos(inclination)*sin(azimuth);
我正在使用 openGL/GLUT 只是想绘制一个图元并使用 gluLookAt() 来移动相机。遇到麻烦,我只看到黑色。这是我的渲染函数代码。 glMatrixMode(GL_MODELVIEW);
为什么 gluLookAt 不工作? 它对场景没有任何影响,就好像它甚至没有被调用一样。 是因为我正在使用 glMatrixMode(GL_MODELVIEW); 如果我不包含它,屏幕上什么也看不到。
我有一个 OpenGL 程序,当我调用它时它可以工作: gluLookAt(0.1,0.1,0.1, 0,0,0, 0,0.1,0); ...但不是当我这样称呼时: gluLookAt(0.01,0.
通过这条指令 gluLookAt: gluLookAt( p1, p2, p3, l1, l2, l3, u1, u2, u3 ); 如何将相机向左移动一个单位,同时保持注视同一点的方向? 显然我不能
我正在尝试使用 gluLookAt() 设置视角 这里有我的代码,我尝试在其中设置相机但没有结果 这里的函数displaycone(): void displayCone(void) { gl
我想使用 Camera 外部矩阵和 gluLookAt 函数在图像上显示模型。 模型平移到原点,即模型的质心位于原点。 (模型坐标系以右手为准) 然后使用 cvFindExtrinsicCameraP
我尝试自己计算观察矩阵,而不是使用 gluLookAt()。我的问题是我的矩阵不起作用。然而,在 gluLookAt 上使用相同的参数确实有效。 我创建观察矩阵的方法: Vector3 Eye, At
据我了解, gluLookAt( eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x,
我正在开发一个简单的 2D 自上而下 OpenGL 游戏,其中相机跟随玩家。我使用 gluLookAt 将相机定位在玩家上方并朝其方向看。然而,在运行游戏时,即使没有输入,相机也会围绕轴旋转。 旋转速
我是一名优秀的程序员,十分优秀!