计算 gluLookAt、glOrtho 和 glFrustum

2023-12-14

我正在做一项绘制线框过剩标准对象的作业。这看起来很简单,但我们被告知不能使用 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;
}

有人可以帮忙解决这个问题吗?


我们被告知不能使用 gluAtLook()、glOrtho()、glFrustrum,但必须使用 glTranslate()、glScale() 和 glRotate

gluLookAt设置世界来观看空间变换,glOrtho确实考虑到正交投影空间变换和glFrustum确实查看到透视投影空间变换。当你说你的导师不允许使用它时,这显然意味着你的目的是首先了解这些功能是如何工作的。

互联网上有很多资源可以教您这些知识。这是一个由加州大学伯克利分校著名教授 Ravi Ramamoorthi 博士撰写。宋浩有好文章这将帮助您做同样的事情。


I can demonstrate a simple case in 2D. Say we've a world defined with objects (for simplicity we take a point P); we want the camera to be at (3, 3) with its X and Y axes pointing in directions opposite to world's X and Y axes. For simplicity we'll assume both frames have the same scaling factor i.e. 1 unit in both X and Y directions measure the same distance (magnitude) for both systems. So the two frames differ only by orientation and origin location (W0 and V0 are the symbols denoting them).

We need to derive Mworld->view i.e. the matrix which maps points in world space to view space. This is what the now-deprecated gluLookAt function calculates and multiplies with GL_MODELVIEW matrix stack. This matrix will be used to get a view of the world from the camera's viewpoint.

We know that Mworld->view = Tview->world. The matrix which maps points of frame A to frame B will also be the matrix which transforms B's frame into A's frame. The derivation goes like this

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

The point P in world has (1, 2) = Pw as coordinates, we're effectively finding a matrix, which when multiplied with Pw will give Pv i.e. the same point's coordinates in view frame. The point is written as a 3D point since homogeneous extension of a 2D point would be a 3D point; the homogeneous coordinate would be 1 since it's a point; had it been a vector, it'd be 0.

第一步是旋转;将视图框架旋转 -180°(右手系统,+ve 旋转为逆时针);现在两个框架的轴都沿着相同的方向。我们必须解决原点差异,这是通过平移完成的,这是步骤 2。将两者相乘将得到所需的矩阵。请注意,每一步都会将视图的框架转换为更接近世界的框架后乘法。此外,每个转换都基于我们所处的当前局部框架,而不是基于起始全局(世界)框架。

同样的想法也可以扩展到 3D,但需要付出更多的努力。在上面的推导中,我所需要的只是旋转矩阵、平移矩阵和矩阵乘法;不gluLookat.我给您的链接应该有助于计算 3D 的相同值。投影矩阵的推导有点复杂。但是,您仍然可以在不使用的情况下获得结果glOrtho;我上面给出的链接有最终矩阵的公式;您可以使用它组成一个矩阵并将其乘以 GL_PROJECTION 矩阵堆栈。

Note:上述推导假设列向量,因此变换矩阵(如旋转)和乘法顺序是基于此完成的。如果您假设行向量约定,则转置所有矩阵并反转乘法的顺序,因为

(AB)^T = B^T A^T

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算 gluLookAt、glOrtho 和 glFrustum 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 线性/非线性纹理映射扭曲的四边形

    In my 上一个问题 https stackoverflow com questions 10832909 quad strip texturing distortion 已经确定 当对四边形进行纹理化时 面被分解为三角形 并且纹理坐标以
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 用于评估数组单调性的算法(即判断数组的“排序性”)

    EDIT 哇 很多很棒的回复 是的 我使用它作为适应度函数来判断遗传算法执行的排序的质量 因此 评估成本很重要 即 它必须是快速的 最好是O n 作为我正在使用的人工智能应用程序的一部分 我希望能够根据候选整数数组的单调性 也称为 排序性
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • Java中的用户输入字符串和整数[重复]

    这个问题已经存在了 System out print Name String name in nextLine System out print Age int age in nextInt System out print City St
  • 通过代理curl不返回任何内容

    我现在正在编写一个 PHP 脚本 该脚本向我们学校的服务器发送请求 以获取有关不同课程班级规模的实时信息 当我不使用代理时 该脚本运行得非常好 返回一个包含课程编号和可用座位的字符串 不过 我想让这个为学生提供服务 我担心如果我发出太多请求
  • 如何根据列值组合检索唯一行?

    我有一张桌子mytable像下面这样 product tag lot 1111 101 2 1111 102 5 2222 103 6 3333 104 2 4444 101 2 5555 101 2 5555 102 5 6666 102
  • 确保您使用为位于“dir:\projectPath\venv\Scripts\python.exe”的 Python 解释器安装的正确版本的“pip”

    我正在使用 python 3 6 5 和 PyCharm 尝试安装任何软件包时 都会出现错误 尝试从系统终端运行此命令 确保使用为位于 C projectPath venv Scripts python exe 的 Python 解释器安装
  • Spark 忽略 SPARK_WORKER_MEMORY?

    我使用的是独立集群模式 1 5 2 即使我正在设置SPARK WORKER MEMORY in spark env sh 看起来这个设置被忽略了 我在下面的脚本中找不到任何指示bin sbin that Xms Xmx已设置 如果我使用ps
  • 如何将自定义日期时间格式转换为时间戳?

    知道为什么我得到下面的结果吗 scala gt val b to timestamp DATETIME ddMMMYYYY HH mm ss b org apache spark sql Column to timestamp DATETI
  • 如何在 Android 自定义键盘中动态更改按键的背景颜色或主题

    我正在开发自定义键盘应用程序 我需要设置或更改键盘的背景主题或颜色 应用程序中的setting xml 视图 用户可以在其中选择不同的背景主题和关键行的不同颜色 在第一次启动应用程序期间 它工作正常 但下次自定义键盘显示主题时不会更改 我正
  • 填充 RecyclerView 时出现 ArrayIndexOutOfBoundsException

    当我尝试填充 RecyclerView 时 我经常收到错误 但该错误似乎发生在内部StaggeredGridLayoutManager 我从数据库填充 RecyclerView 然后使用此将图像添加到我的适配器 List
  • mysql:将分数字符串转换为数字

    我有像 3 4 和 5 9 这样的字符串 还有一些像 1 2 km 和 3 4 Degree 存储在mysql列中 我想将它们转换成数字 在第一种情况下 3 4 gt 0 75 在更复杂的第二种情况下 去掉 公里 和 度 等单位 这样 1
  • 显示隐藏键盘在 Android PhoneGap 中无法正常工作

    我按照此链接使用 Simon mac donald Defination 1 来使用键盘事件 在这种情况下 当键盘隐藏时我会显示我的页脚 当键盘显示时我会隐藏我的页脚 字典我的键盘是show但事件是转到键盘hide功能 所以我的页脚显示 我
  • 使用 Javascript 的仅会话 cookie

    我想知道是否可以使用 Javascript 创建仅会话 cookie 当浏览器关闭时 cookies 应该被删除 我无法在服务器上使用任何内容 因为该网站仅是 HTML 所以没有使用服务器端脚本 我在这里读到了一些相关内容 http blo
  • 埃拉托斯特尼筛法 - 寻找素数 Python

    只是澄清一下 这不是作业问题 我想为我正在构建并遇到的数学应用程序找到素数埃拉托斯特尼筛法方法 我已经用 Python 编写了它的实现 但速度非常慢 比如说 如果我想找到所有小于 200 万的素数 需要 gt 20 分钟 我此时停止了 我怎
  • WPF 日历:绑定到 MVVM 命令?

    我正在将 WPF 日历连接到 MVVM 视图模型 我不确定如何将日期选择和月份更改绑定到 MVVM ICommand 对象 例如 要处理选定的日期更改 我将在 XAML 中将什么对象绑定到视图模型中相应的命令属性 据我所知 我被代码隐藏中的
  • 动态惰性列表

    大家好 我想做this懒惰者动态 我首先尝试过使用图像 但它会强制关闭 如果我的方法有误 请指导 这是代码 public class Test extends Activity ListView list LazyAdapter adapt
  • Breeze.js 混合 DTO 和实体

    在沃德的文章中 Breeze 服务器 随心所欲 典型的业务应用程序至少有 200 个领域模型 类型 90 以上的时间我通过网络发送的数据的形状 电线与我的商业模型中实体的形状相同 当客户实体的形状与实体的形状不一致时 服务器端业务实体 我可
  • Android studio - 应用程序在跨步时崩溃

    当我在调试模式下进行单步执行 快捷键 F8 时 我在 Android studio 中遇到崩溃 如果我设置断点 那么它会跳转到下一个断点 使用快捷键 F9 我遇到以下错误 A zygote jdwp handler cc 1221 Chec
  • 使用“set time_zone = ...”连接到数据库后更改时区

    我试图在连接到数据库后立即将时区更改为 欧洲 伦敦 这是我原来的代码 pdo new PDO mysql host localhost dbname exampletable exampleuser examplepassw array P
  • 从 Django 中的表单发送 DELETE 请求

    我正在尝试从 Django 中的表单发送 DELETE 请求 并从 jQuery 获取帮助 参考下面的链接 https baxeico wordpress com 2014 06 25 put and delete http request
  • 如何将依赖项注入到XUnit中的IClassFixture中?

    我正在使用 XUnit 需要在运行测试套件之前执行一些操作 所以 我尝试使用XUnit的IClassFixture功能 但我找不到将依赖项注入 Fixture 类的方法 我的代码结构如下 public class MyFixture IDe
  • 计算 gluLookAt、glOrtho 和 glFrustum

    我正在做一项绘制线框过剩标准对象的作业 这看起来很简单 但我们被告知不能使用 gluAtLook glOrtho glFrustrum 但必须使用 glTranslate glScale 和 glRotate 如何在不使用 glMatrix