gpt4 book ai didi

c++ - 计算 gluLookAt、glOrtho 和 glFrustum

转载 作者:太空狗 更新时间:2023-10-29 23:40:15 24 4
gpt4 key购买 nike

我正在完成一项绘制线框 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 的框架的矩阵。推导过程是这样的

Step by step transformation of view's frame into world's frame

世界中的点 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com