(OpenGL ES) 远离视图中心的对象被拉伸

2023-11-27

所以我在 OpenGL ES 中生成了一个球体(具体来说,OpenGL ES 2.0,Java 中,适用于 Android)。当这个球体放置在与我的视图矩阵的中心相同的位置时,效果很好,但是当偏离中心时,球体会严重扭曲(见下文)。

为什么会发生这种情况,我该如何阻止它?

enter image description here

这是同一个球体。右上角的那个只是转换为 x 和 y(而不是 z)。

我的 GLSurfaceView.renderer 实现中的一些代码片段,

public void onSurfaceCreated(GL10 unused, EGLConfig config) {
    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    GLES20.glEnable(GLES20.GL_CULL_FACE);
    GLES20.glEnable(GLES20.GL_DEPTH_TEST);

    // Both centred on (0,0,0), of radius 1.0.
    outerSphere = new Sphere();
    centreSphere = new Sphere();
}

public void onSurfaceChanged(GL10 unused, int width, int height) {
    GLES20.glViewport(0, 0, width, height);

    ratio = (float) width / height;

    final float left = -ratio;
    final float right = ratio;
    final float bottom = -1.0f;
    final float top = 1.0f;
    final float near = 1.0f;
    final float far = 100.0f;

    Matrix.frustumM(projMatrix, 0, left, right, bottom, top, near, far);
}

public void onDrawFrame(GL10 unused) {
    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);

    float eyeX = 0.0f;
    float eyeY = 0.0f;
    float eyeZ = 10.0f;

    final float lookX = 0.0f;
    final float lookY = 0.0f;
    final float lookZ = 0.0f;

    final float upX = 0.0f;
    final float upY = 1.0f;
    final float upZ = 0.0f;

    Matrix.setLookAtM(viewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ,
                      upX, upY, upZ);

    // Set identity matrix as input for translations.
    Matrix.setIdentityM(outerModelMatrix, 0);

    // Translate outer sphere by 5 in x and y.
    Matrix.translateM(outerModelMatrix, 0, 5.0f, 5.0f, 0.0f);

    // MVP matrix = Projection * View * Model.
    Matrix.multiplyMM(centreMVPMatrix, 0, viewMatrix, 0, centreModelMatrix, 0);
    Matrix.multiplyMM(centreMVPMatrix, 0, projectionMatrix, 0, centreMVPMatrix, 0);
    Matrix.multiplyMM(outerMVPMatrix, 0, viewMatrix, 0, outerModelMatrix, 0);
    Matrix.multiplyMM(outerMVPMatrix, 0, projectionMatrix, 0, outerMVPMatrix, 0);

    outerSphere.draw(outerMVPMatrix);
    centreSphere.draw(outerMVPMatrix);

}

我的着色器很简单,

private final static String vertexShaderCode =
    "uniform mat4 u_MVPMatrix;" +
    "attribute vec4 a_Position;" +
    "uniform vec4 u_Color;" +
    "void main() {" +
    "    gl_Position = u_MVPMatrix * a_Position;" +
    "}";
private final static String fragmentShaderCode = 
    "precision mediump float;" +
    "uniform vec4 u_Color;" +
    "void main() {" +
    "    gl_FragColor = u_Color;" +
    "}";

我省略了 Sphere 类中的几乎所有代码,以及其他我认为不必要的东西(?),但如果需要它们,我会将它们放在上面。


欢迎来到透视畸变!

更详细一点:您的视野太窄,您必须塑造平截头体,使其更大一点。

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

(OpenGL ES) 远离视图中心的对象被拉伸 的相关文章

  • 检查 WebView 元素时的 UiAutomator 错误

    I have recently started automation testing in android and was using UiAutomator tool for inspecting UI elements Surprisi
  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • 在 Cordova 应用程序中获取额外功能

    我们有两个 Android 应用程序 一个使用本机 Java 实现 另一个使用 Ionic 编写 Ionic 应用程序启动我的应用程序 这是使用灯插件 https github com lampaa com lampa startapp 我
  • ExoPlayer2 - 如何使 HTTP 301 重定向工作?

    我开始使用 ExoPlayer 来传输一些音频 一切都很顺利 直到我遇到一个带有 301 永久移动 重定向的 URL ExoPlayer2 默认情况下不处理该问题 我已经看过这个线程 https github com google ExoP
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • Android - AudioRecord类不读取数据,audioData和fftArray返回零

    我是 Android 新手 一直在开发音调分析器应用程序 最低 SDK 8 我读了很多关于如何实现 Audiorecord 类的文章 但我想知道为什么它在我录制时不读取任何数据 我尝试显示 audioData 和 fftArray 的值 但
  • Android 构建发布失败,原因为:java.lang.ArrayIndexOutOfBoundsException:213(pr​​oguard 问题)

    我的项目使用调试构建变体构建得很好 但使用发布变体 Android Studio 会抛出 引起原因 java lang ArrayIndexOutOfBoundsException 213 可能是什么问题 如果我设置minifyEnable
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • 插件“Android Bundle Support”不兼容

    大家好 自从上次更新以来 当我启动 android studio 时 我遇到了一个非常奇怪的错误 我有这个错误 插件错误 插件 Android Bundle Support 不兼容 直到构建 AI 195 SNAPSHOT 我在网上找不到任
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A
  • 发布的 Android apk 出现错误“包文件未正确签名”

    我最近将我的应用程序上传到 Android 市场 但是由于错误 下载时它拒绝运行 包文件未正确签名 我首先使用 eclipse 发布了数据包 右键单击导出 创建密钥库然后发布 但它拒绝工作 然后我下载了 keytool 和 jarsigne
  • 有没有任何代码可以在android中设置壁纸而无需裁剪和缩放?

    我正在创建一个画廊应用程序 我的第一个应用程序 这是我的代码 Bitmap bmd BitmapFactory decodeStream is try getApplicationContext setWallpaper bmd catch

随机推荐

  • 复制的重复文件(Android Studio 0.4.0)[重复]

    这个问题在这里已经有答案了 在我的项目中 我使用 Apache 的 httpcore 和 httpmime 库 将 Android Studio 更新到 0 4 0 后 我在构建项目时遇到了以下问题 Duplicate files copi
  • 用于更新查找表中向量的某些值的规范 tidyverse 方法

    我经常需要根据查找表重新编码数据框列中的一些 不是全部 值 我对我所知道的解决问题的方法不满意 我希望能够在清晰 稳定 高效方式 在编写自己的函数之前 我想确保我没有复制已经存在的标准 Toy example data data frame
  • Chrome 扩展程序历史记录 API

    我正在编写一个 chrome 扩展 需要分析最近的浏览历史记录对于特定选项卡 The chrome history API允许我搜索全局历史记录中的项目 但似乎没有提供将结果本地化到特定选项卡的方法 我是否错过了什么 或者这是不可能得到的
  • 初始化后向Select2添加选项

    这似乎是一件标准的事情 但我正在努力寻找一个清晰而简单的解决方案 我希望能够向已初始化的 Select2 添加一个或多个附加选项 我正在使用旧版本的 Select2 但不确定该版本是什么 您可以像在标准中解决大多数问题一样解决涉及 Sele
  • Android:保存应用程序单例类中存储的数据的最佳方法

    保存 Android 应用程序的应用程序类 单例 中存储的数据的最佳方法是什么 我有一个安静的大应用程序 可以在活动之间共享大量数据 所以大部分都存储在Application Singleton上 一切都很好 util应用程序被操作系统在内
  • 一直向下滚动到 UITableView 的底部

    I ve a UITableView我试图将 36 行加载到其中 然后一直向下滚动到最后一个单元格 我试过这个 func reloadData chatroomTableView reloadData chatroomTableView s
  • PHP Artisan 使用 MAMP 和 Unix Socket 进行迁移

    我最初是在 Laravel 4 2 中开发我的应用程序 但后来决定将其移动到 5 0 版本 以便它涵盖 5 0 相对 4 2 的更多变化和优势 我正在尝试运行我的迁移 但是收到错误 PDOException SQLSTATE HY000 2
  • SwingWorker 中的错误处理

    我的问题是基于理论的问题 但它确实满足了我的特定需求 当您的 SwingWorker 抛出异常时 您 a 可以预见并且 b 需要恢复并继续 但您想通知用户此错误已经发生 您会怎么做 如何捕获预期的异常并通知用户而不违反 No Swing c
  • Storyboard Xcode 6 中的自适应转场是否已弃用?

    Xcode 6 interface builder by default has new checkbox use size classes It makes views adaptive When I try to make segue
  • Android 偏好设置摘要默认颜色?

    我已经在真正的手机中安装了我的应用程序 即使在模拟器中的所有文本 偏好摘要似乎是相同的颜色 在真正的手机中 颜色是不同的 某种蓝色 但我想这取决于手机的型号 如何将此颜色设置为我的自定义首选项组件 我已经实现了自己的搜索栏 其摘要文本颜色与
  • 在 git 存储库中通过相应 blob 的哈希值查找文件?

    假设我有一个文件可能已经在 git 存储库中 并且它可能驻留在多个路径名下 甚至在同一个提交中 如何查找包含 blob 的所有提交以及与该文件对应的哈希值 并列出这些提交以及每个文件所在的路径名 是否有一种按哈希查找文件的技术也可以搜索索引
  • 在 for 循环中将数据帧附加在一起

    我有一个for loop每次迭代后都会生成一个数据框 我想将所有数据框附加在一起 但发现这很困难 以下是我的 我正在尝试 请建议如何修复它 d NULL for i in 1 7 vector output model lt some pr
  • 有没有一个搜索引擎可以直接给出答案? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我一直想知道这个问题有一段时间了 我不明白为什么谷歌还没有尝试过 或者也许他们已经尝试过 但我只是不知道 有没有一个搜索引擎 您可以在其中输入一个问
  • 如何初始化常量/非常量静态引用成员?

    class Foo private int m i public Foo int i m i i class FooA private const static Foo m foo static Foo m foo2 Q1 gt 如何初始化
  • Azure 应用程序网关 V2 无法使用 NSG 配置

    我已使用 WAF V2 SKU 配置应用程序网关 然后 我将后端池配置为指向 WebApp 并添加 IP 限制以仅允许来自 WAF IP 的流量 然后 我尝试将 NSG 添加到预配的子网 以进一步限制流向前端 IP 地址的流量 我收到错误
  • 防止 C# 子类覆盖方法

    假设我有一个名为 Parent 的抽象父类 它实现了一个名为 DisplayTitle 的方法 我希望这个方法对于继承 Parent 的每个子类都是相同的 如果子类尝试实现自己的 DisplayTitle 方法 我希望出现编译错误 我怎样才
  • 根据下载的图像高度调整表格单元格高度

    我在运行时获取图像的 URL 并且想要下载这些图像并将其显示在表格中 图像将异步下载 更重要的是我想以实际尺寸显示所有这些图像 请帮助我 提前致谢 在委托方法上 您必须在完成下载后更新图像 您可以使用 tableView reloadRow
  • 通过JavaScript异步跨域POST请求?

    我可以创建一个表单并使用它向任何站点发出 POST 请求 但 FORM 方法不是异步的 我需要知道页面何时完成加载 我尝试使用内部带有表单的 iframe 来解决这个问题 但没有成功 有任何想法吗 EDIT 不幸的是我无法控制响应数据 它从
  • 使用 $GLOBALS['HTTP_GET_VARS'] 是否已弃用?

    我知道使用 HTTP GET VARS已被弃用 但是使用怎么样 GLOBALS HTTP GET VARS 那个数组键将来有可能消失吗 我基本上在一个需要与 CMS 集成的遗留项目中拥有以下内容 除非绝对必要 否则我真的不想更新它 func
  • (OpenGL ES) 远离视图中心的对象被拉伸

    所以我在 OpenGL ES 中生成了一个球体 具体来说 OpenGL ES 2 0 Java 中 适用于 Android 当这个球体放置在与我的视图矩阵的中心相同的位置时 效果很好 但是当偏离中心时 球体会严重扭曲 见下文 为什么会发生这