帮助理解 gluLookAt()

2024-05-08

想象一下你站在地上,抬头看着天空中的一个立方体。当你倾斜头部时,立方体就会移动。我试图在 iPhone 上使用 OpenGL ES 来复制这一点,方法是操纵相机的倾斜,同时查看围绕原点绘制的简单 3D 立方体。我正在使用gluLookAt()Cocos2d 中的函数应该模拟 OpenGL 版本,似乎当我尝试修改任何值时,我的立方体消失了。

我的问题是:你能提供一个gluLookAt()这里的用法会让我开始操作相机,这样我就能弄清楚它是如何工作的?我真的很感兴趣学习如何沿 Y 轴倾斜相机。

这是我当前的代码:

视口配置

glBindFramebufferOES(GL_FRAMEBUFFER_OES, _viewFramebuffer);
glViewport(0, 0, _backingWidth, _backingHeight);

投影矩阵

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Maybe this should be a perspective projection?? If so,
// can you provide an example using gluPerspective()?
glOrthof(-_backingWidth, _backingWidth,-_backingHeight, _backingHeight, -1, 1);

模型视图矩阵

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

gluLookAt() // What goes here?

绘图代码

static const GLfloat cubeVertices[] = {
    -1.0, -1.0,  1.0,
    1.0, -1.0,  1.0,
    -1.0,  1.0,  1.0,
    1.0,  1.0,  1.0,
    -1.0, -1.0, -1.0,
    1.0, -1.0, -1.0,
    -1.0,  1.0, -1.0,
    1.0,  1.0, -1.0,
};

static const GLushort cubeIndices[] = {
    0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1
};

static const GLubyte cubeColors[] = {
    255, 255,   0, 255,
    0,   255, 255, 255,
    0,     0,   0,   0,
    255,   0, 255, 255,
    255, 255,   0, 255,
    0,   255, 255, 255,
    0,     0,   0,   0,
    255,   0, 255, 255
};

glVertexPointer(3, GL_FLOAT, 0, cubeVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, cubeColors);
glEnableClientState(GL_COLOR_ARRAY);    
glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_SHORT, cubeIndices);

我不完全确定你到底想要什么,但这里有一些解释:

gluLookAt需要 3 个向量(每个向量为 3 个双倍):首先是相机的位置(眼点),然后是您观察的位置(中心点),最后是指定向上方向的向上向量(这不必是完美的正交向上方向,因为无论如何它都是重新正交的)。

因此,如果您站在 (0,0,5) 处并查看立方体(位于中心)并希望 y 轴为向上方向,您可以调用gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)看到你的立方体的美丽。

如果你想将头向一侧倾斜,你只需要改变向上向量并将其稍微向一侧旋转即可。或者,如果你想向上看,但不将头倾斜到一侧,你仍然使用 y 轴作为向上向量,但你只是看另一个点,所以你将中心点更改为上方和前方的点你的(可能围绕眼睛位置旋转)。但如果你想直视上方,这将不起作用,在这种情况下,你需要将向上向量更改为与 y 轴正交的向量(当然,除了将中心点设置为你正上方的点之外) )。

但我认为你想要一个透视投影。您当前的正交至少与您的坐标相当不合适,因为它指定了一个坐标系,其中坐标的大小为像素大小,因此您的 [-1,1] 立方体大约为屏幕上像素的大小。尝试gluPerspective(60.0, ((double)_backingWidth)/_backingHeight, 0.1, 100.0)。如果您确实想要没有任何现实透视变形的正交投影,您可以使用glOrtho,但在这种情况下,您应该保持glOrtho参数和模型的坐标大致同步(因此不要指定屏幕大小的正交并使用 [-1,1] 范围内的坐标)。

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

帮助理解 gluLookAt() 的相关文章

  • OpenGL ES 2.0 iPhone - 在后台线程块主线程上渲染

    我在后台线程上使用与主线程不同的 EAGLContext 渲染 OpenGL 上下文 我用这样的东西 void renderInBackground EAGLContext context EAGLContext alloc init EA
  • 减少 OpenGL ES 1.1 中纹理的内存使用

    我在 OpenGL ES 中的场景需要几个大分辨率纹理 但它们是灰度的 因为我仅将它们用于蒙版 我需要减少内存使用 我尝试使用 Bitmap Config ALPHA 8 和 RGB 565 加载这些纹理 ALPHA 8 似乎实际上增加了内
  • 帮助理解 gluLookAt()

    想象一下你站在地上 抬头看着天空中的一个立方体 当你倾斜头部时 立方体就会移动 我试图在 iPhone 上使用 OpenGL ES 来复制这一点 方法是操纵相机的倾斜 同时查看围绕原点绘制的简单 3D 立方体 我正在使用gluLookAt
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 有没有任何工具可以将 PVR 纹理分割成一组图块?

    我有一张大的 png 纹理 4096x4096 我需要将其部分加载到内存中 我已经将大 png 纹理分割成 16 个 1024x1024 块 然后将它们转换为 PVR 压缩文件 问题是 当我绘制这些图块时 图块之间的边缘与 png 的边缘不
  • Android中的OpenGL用于视频显示

    是否可以使用 OpenGL 来显示视频并能够在运行时调整视图大小 是的 它的工作原理是通过 glTexSubImage2D 将每个帧作为纹理上传 我已经测试了基于 FFmpeg 的解码器的输出 效果很好
  • Cocos2d - 将 GLImageProcessing 效果应用于 CCSprite

    苹果的oplenglGL图像处理 http developer apple com library ios samplecode GLImageProcessing Introduction Intro html加载图像并应用图像调整 亮度
  • Android 中的 OpenGL 缩小

    我正在使用 3D 对象并渲染它并通过扩展 GLSurfaceView 实现渲染器来显示它 问题是如何通过捏合和捏合进行缩小 下面是我的班级 package com example objLoader import java nio Byte
  • 不明确的 OpenGL 默认相机位置

    在我的Opengl程序中 在我应用透视投影矩阵之前 每当我绘制一些对象时 我都会在世界坐标系的原点处绘制它 但是几乎所有Opengl教程都指出相机 我的投影视图 位于原点朝向正 z 轴 这取决于您稍后如何处理投影矩阵中的 z 值 但是如果这
  • 在没有 SurfaceView 的 Android 上获取 GPU 信息

    在Android上 有没有一种方法可以在不创建SurfaceView的情况下获取GPU信息 我不想使用 OpenGL 绘制任何内容 但我只需要获取硬件信息 例如供应商 OpenGL ES 版本 可用扩展等 抱歉 我不知道如何在 Androi
  • Android 7 GraphicBuffer 替代方案,用于直接访问 OpenGL 纹理内存

    从移动设备具有 CPU 和 GPU 共享内存这一事实中获利的唯一方法是使用GrphicBuffer 但由于 Android 7 限制对私有本机库 包括 gralloc 的访问 因此无法再使用它 问题 是否有其他方法可以直接内存访问纹理的像素
  • 在 iOS 上使用 OpenGL ES 2.0 进行实例化绘制

    简而言之 谁能确认是否可以使用内置变量gl InstanceID or gl InstanceIDEXT 在 iOS 上使用 OpenGL ES 2 0 的顶点着色器中GL EXT draw instanced启用 Longer 我想使用绘
  • glColor4f() - alpha 值的效果

    我正在使用 glColor4f 令人惊讶的是 更改 alpha 即第四个参数 不会导致透明度发生任何变化 代码段是 const GLfloat squareVertices 0 5 0 5 0 0 0 5 0 5 0 0 0 5 0 5 0
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 为什么 GDB 调试器不断冻结 Xcode 4?

    这真是一个奇怪的错误 我正在开发一个使用相机源的 iPhone 项目 并通过 OpenGL 着色器运行它以对其应用效果 然而 每次我在代码中简单地创建一个新的 GLfloat 时 调试器都会在启动时冻结 我无法复制和粘贴文本 因为整个 XC
  • iPhone OpenGL ES 工具中的 Tiler Utilization 统计数据意味着什么?

    我一直在尝试执行一些 OpenGL ES 性能优化 以提高 iPhone 应用程序中每秒渲染的三角形数量 但我遇到了困难 我尝试将 OpenGL ES 数据类型从固定点转换为浮点 每苹果的推荐 http developer apple co
  • Android opengl在绘制调用后修改顶点数组

    在opengl中 绘制顶点数组后这是不好的做法还是不建议修改它 It s not如果在将顶点数组绘制为普通顶点数组时修改它 这是一种不好的做法 It s如果在绘制方法中使用顶点缓冲区对象 则修改顶点数组是不好的做法 这是因为编辑后您必须将其
  • 三星 S4 上的 Open GL 错误配置错误

    我在 Samsung S4 上收到以下错误 10 21 16 25 44 100 E AndroidRuntime 29778 FATAL EXCEPTION GLThread 11320 10 21 16 25 44 100 E Andr
  • 改进OpenGL粒子系统

    我正在寻找一种提高粒子系统性能的方法 因为它在 FPS 方面的成本非常高 这是因为我打电话 glDrawElements GL TRIANGLE STRIP mNumberOfIndices GL UNSIGNED SHORT 0 我为应用
  • Quartz 2D/OpenGLES 图像上的几何变形(最好使用 CGImage)

    实现诸如收缩 鱼眼等几何变形的首选方法是什么 使用iPhone SDK 我知道 OSX 的 Core Image 库内置了所有这些类型的过滤器 但 iPhone SDK 没有 我可以在给定原始源位图数据的特定位置和半径处创建位移图 但我不确

随机推荐

  • PHP memcache - 检查池中是否有可用的服务器?

    我有以下代码 cluster local array host gt 192 168 1 1 port gt 11211 weight gt 50 cluster local2 array host gt 192 168 1 2 port
  • 在 Excel 2010 中添加基本功能区的 VBA 代码?

    我已经使用产品在 C addin express 中为 Excel 编写功能区 但我需要知道如何使用 vba 生成功能区 有人能为我提供一些代码来为此在工具栏中插入一个额外的功能区吗 我所说的功能区是指上面写着 公式 数据 评论 等的地方
  • Kestrel + IIS 反向代理请求中止未触发

    我们有一个 ASP NET Core 2 x 应用程序 它实现了自定义中间件 充当另一个 基于 Java 的 服务器 应用程序前面的代理 此应用程序 中间件的客户端通常会在服务器请求完成之前频繁中止 取消其请求 我们已将此应用程序部署到 I
  • 能否从 Vista Shell 获取 48x48 或 64x64 图标?

    如果 Vista Shell 中存在 48x48 或 64x64 图标 如何使用 SHGetFileInfo 获取在 TImage 中显示图标的句柄 我想从图像列表中选择一个代表文件夹路径的图标 并在 Timage 中显示 48x48 或
  • 位置:固定在 iPad 和 iPhone 上不起作用

    I have been struggling with fixed positioning in iPad for a while I know iScroll http cubiq org iscroll and it does not
  • 如何在 Angular 6 中包含外部 html 文件和 js 文件?

    我想在我的 Angular 6 项目中包含一些 html 文件并使用一些外部 js 文件中的函数 如何在 Angular 6 中包含外部 html 文件和 js 文件 您可以将这些文件放在src assets文件夹并指定路径angular
  • 如何在 Eclipse 中的独立(Swing)应用程序中配置 hibernate?

    我通常在Web应用程序中使用hibernate和spring 所以我使用DI和maven进行配置 现在我想在不使用maven或spring的桌面 swing应用程序中使用hibernate 我想知道以下内容 我需要什么罐子 如何配置休眠 以
  • Django - 使用 get_FOO_display 进行聚合

    考虑以下 status queryset values status annotate count Count status where status字段是一个CharField with choices 这将产生一个字典列表statusD
  • ModuleNotFoundError:没有名为“模型”的模块

    我有一个非常简单的 django 应用程序 我试图将其部署到 heroku 但它不断崩溃 在我的本地机器上一切正常 但在 Heroku 上却不行 这是我收到的错误 切到相关部分 File app hello admin py line 4
  • React Native 循环这个

    当我把onPress在地图循环中 它不起作用 如何修复它 var PageOne React createClass handlePress this props navigator push id 2 render return
  • 将值数组附加到 React JS 中某个状态的当前数组

    我的状态值为 this state emp id 1 name A id 2 name B id 3 name B 我怎样才能添加一个像这样的数组var arr id 4 name D 给国家emp而不删除数组的当前值 我只想将新的值数组附
  • TryXXX 类似带有“out”参数的方法与返回可为空值类型的方法?

    我经常在 C 中看到这样的方法 进行可能会或可能不会给出结果的计算 bool TrySomething SomeType inputData out SomeOtherType result 为什么人们不使用这样的东西呢 Nullable
  • HashMap 无法转换为 java.lang.string

    我正在尝试从列表视图中获取值 列表视图由hashmap类型的数组列表设置 因此 如果我尝试获取字符串中的值 则会出现错误HashMap cannot be cast to java lang string 详细信息1 java packag
  • 不使用修剪方法从字符串中删除空格?

    给定的字符串是 家 甜蜜的家 如果用户输入模式为 0 那么 o p 应该是 home sweet home 如果用户输入模式为 1 那么 o p 应该是 Do this https stackoverflow com questions 5
  • Android Gradle 构建缓慢

    我试图找出为什么我们的 Gradle 构建如此缓慢 目前 每次您在不进行任何更改的情况下进行构建时 构建时间约为 45 秒 这是一个单模块项目 我已经打开了分析 大部分时间都花在了 app dexDebug 我们使用 Gradle 2 8
  • 如何在Python中连接两个整数?

    如何在Python中连接两个整数 例如 给定10 and 20 我想要一个返回值1020 将两者都转换为字符串 连接字符串 然后将结果转换回整数 z int str x str y
  • 从开放的 HTTP 流中读取数据

    我正在尝试使用 NET WebRequest WebResponse 类来访问 Twitter 流 API 此处 http stream twitter com spritzer json 我需要能够打开连接并从打开的连接中增量读取数据 目
  • PHP文件上传错误tmp_name为空

    我的文件上传遇到这个问题 我尝试在检查验证时上传 PDF 文件TMP NAME是空的 当我检查时 FILES document attach error 该值为 1 意味着存在错误 但当我尝试上传其他 PDF 文件时 它已成功上传 为什么其
  • CollapsingToolbarLayout setTitle() 不会更新,除非折叠

    使用新的设计库 我们应该在CollapsingToolbarLayout 不是Toolbar本身 至少在使用折叠工具栏时 但setTitle 仅在以下特定情况下更新标题 当 的时候CollapsingToolbarLayout还没有标题 此
  • 帮助理解 gluLookAt()

    想象一下你站在地上 抬头看着天空中的一个立方体 当你倾斜头部时 立方体就会移动 我试图在 iPhone 上使用 OpenGL ES 来复制这一点 方法是操纵相机的倾斜 同时查看围绕原点绘制的简单 3D 立方体 我正在使用gluLookAt