Android OpenGL 中 setLookAtM 方法的怪异

2024-03-01

作为 android 和 openGL 2.0 es 的初学者,我正在测试简单的东西并看看它是如何进行的。

我在以下位置下载了示例http://developer.android.com/training/graphics/opengl/touch.html http://developer.android.com/training/graphics/opengl/touch.html .

我更改了代码以检查是否可以设置相机围绕正方形中心 (0,0,0) 点旋转的动画。

所以我这样做了:

public void onDrawFrame(GL10 unused) {
    // Draw background color
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    // Set the camera position (View matrix)
    long time = SystemClock.uptimeMillis() % 4000L;
    float angle = ((float) (2*Math.PI)/ (float) 4000) * ((int) time);
    Matrix.setLookAtM(mVMatrix, 0, (float) (3*Math.sin(angle)), 0, (float) (3.0f*Math.cos(angle)),     0 ,0, 0,     0f, 1.0f, 0.0f);

    // Calculate the projection and view transformation
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);

    // Draw square
    mSquare.draw(mMVPMatrix);
}

I expected the camera to look always to the center of the square (the (0,0,0) point) but that's not what happens. The camera is indeed rotating around the square but the square does not stay in the center of the screen.. instead it is moving along the X axis...: enter image description here enter image description here

我还期望如果我们给 eyeX 和 eyeY 与 centerX 和 centerY 相同的值,如下所示:

Matrix.setLookAtM(mVMatrix, 0, 1, 1, -3,     1 ,1, 0,     0f, 1.0f, 0.0f);

正方形将保持其形状(我的意思是,您的视野将被拖动,但沿着与正方形平行的平面),但这也不是发生的情况:

这是我的投影矩阵:

float ratio = (float) width / height;

// this projection matrix is applied to object coordinates
// in the onDrawFrame() method
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 2, 7);

这里发生了什么?


查看您下载的示例的源代码,我可以明白为什么您会遇到这个问题,它与矩阵乘法的顺序有关。

通常,在 OpenGL 源代码中,您会看到矩阵设置为

transformed vertex = projMatrix * viewMatrix * modelMatrix * input vertex

但是,在您下载的源示例程序中,它们的着色器设置如下:

" gl_Position = vPosition * uMVPMatrix;"

与矩阵另一侧的位置。您可以通过这种方式使用 OpenGL,但它要求您反转矩阵乘法的左/右。

长话短说,在您的情况下,您应该将着色器更改为:

" gl_Position = uMVPMatrix * vPosition;"

然后我相信你会得到预期的行为。

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

Android OpenGL 中 setLookAtM 方法的怪异 的相关文章

  • 从ndk中的不同线程调用java方法

    我正在尝试使用 android 的 NDK 从 C 中的独立线程调用 java 静态方法 到目前为止我已经 JNIEnv env AttachJava jclass cls2 env gt FindClass com actvt showd
  • Android Studio 模拟器无法加载 Windows 10

    我在 Windows 10 上全新安装了 android studio 其中包含 android api 22 的所有软件包 当我运行模拟器时 我收到以下消息 C Users admin AppData Local Android sdk
  • React-Native 中的导航抽屉

    我是反应原生的新手 不介意我问一个基本问题 我想知道 实现抽屉式导航的分步过程是什么 推荐链接这个链接 https github com react native community react native side menu usage
  • 使用 ViewPager 从 Activity 到 Fragment 的通信

    我有一个 Activity 和两个 Fragmentstablayout含有一个viewpager 现在我可以通过实现谷歌的指南回调接口从片段到活动进行通信 但我怎样才能以另一种方式沟通从活动到片段 如果活动中发生了一些事情 外部事件 我想
  • Android 操作栏 SearchView 作为自动完成功能?

    我在操作栏中使用 SearchView 我想在搜索视图上使用自动完成功能来从数据库中获取结果 这可能吗 或者我是否需要使用自定义文本框 然后添加自动完成功能 所以我只需要对 v7 版本执行此操作 并沮丧地发现我不能简单地使用 ArrayAd
  • 从txt文件中读取数据而不下载它?

    我想从提供的文本文件中解析信息 有没有一种方法可以在应用程序中执行此操作 而无需先下载文件 以某种方式传输文本内容 打开到 URL 的 Http 连接 使用内置 HttpURLConnection 或使用 commons httpclien
  • Gradle 构建过程失败

    我的项目正在成功构建 突然我在 Android studio 中收到以下错误 无法找到方法 org gradle api publish maven internal publication MavenPublicationInternal
  • Google play APK 上传错误重复权限声明

    我尝试上传新的 apk 使用我自己的发布密钥存储签名 并在 google play 开发者控制台中收到以下错误 重复的许可声明 android permission ACCESS COARSE LOCATION 与不同 maxSdkVers
  • 如何将webview内容划分为多个页面

    我必须使用 Android 上的 PdfDocument 从 webView 创建 PDF https developer android com reference android graphics pdf PdfDocument htm
  • Android Studio 与 Google Play 服务的编译问题

    我正在运行 Android Studio 0 8 4 并在 Android Studio 0 8 2 上尝试过此操作 我正在运行 Java JDK 1 8 0 11 并尝试使用 JDK 1 8 0 05 每当我尝试构建我的 android
  • 如何切换状态栏?

    我正在寻找一种显示和隐藏状态栏的方法onClickListener 但仅显示其有效 WindowManager LayoutParams lp getWindow getAttributes if isStatusbarVisible lp
  • Horizo​​ntalScrollView 将 GridView 缩小为小行

    当我将 Horizo ntalScrollView 放在 GridView 周围时 GridView 会被压缩到左侧的一个小列中 Gridview 的垂直滚动条甚至出现在左侧 Horizo ntalScrollView 的宽度设置为 fil
  • 在 Unity 中构建 apk 应用程序时包含文件

    在unity中构建apk文件时如何将文件和文件夹添加到apk文件中 我需要的是在Android上安装应用程序后 在应用程序的父目录 android data com company product files 中存在一些文件和文件夹 这是我
  • 标签栏随键盘一起上升

    这个问题之前已经发过 但是没有答案 Problem TabBar gt 2 个选项卡 选项卡一有一个Scrollview and an EddiText 标签二 其他 贴带时EditText 软键盘上升 TabBar与它一起 一个丑陋的解决
  • Android 导航 DeepLinks - 如何区分使用导航操作进行导航与深层链接

    我有导航操作和深层链接 根据您导航的位置 将您带到某个片段 我想确定是使用了深层链接还是仅使用了导航操作 这正是KEY DEEP LINK INTENT https developer android com reference andro
  • 2D 矩阵上的 Numpy where()

    我有一个像这样的矩阵 t np array 1 2 3 foo 2 3 4 bar 5 6 7 hello 8 9 1 bar 我想获取行包含字符串 bar 的索引 在一维数组中 rows np where t bar 应该给我索引 0 3
  • Android 模拟器提示和技巧 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • android中如何将字符串转换为unicode

    我正在解析一些unicodes from json to my android应用程序 API 给出unicodes像这样的图标 ue600 当我将这个unicode直接添加到textview like textview setText u
  • AsyncTask的并行执行

    An 异步任务单击时执行 List
  • 无法 ACTION_VIEW 外部存储上的文件

    我的 Android 手机的外部存储中有一个文件 在本例中是模拟的 知道通往它的路径和 或拥有File代表它的对象 我如何使用Intent在适当的应用程序中打开它 我尝试的第一件事是 startActivity new Intent Int

随机推荐

  • 如何从表中的列中删除默认值?

    如何更改列以删除默认值 该列是通过以下内容创建的 ALTER table sometable Add somecolumn nchar 1 NOT NULL DEFAULT N 然后修改为 alter table sometable alt
  • 计算每个派生类的类实例

    有没有办法让所有派生类计算它们的实例 如何 用 C C Java 之一编写代码 想象一下 我可以访问根类 例如对象 并且每个其他类都是 直接或间接 从该类派生的 我想要的是 AnyDerivedClass InstancesCount 问题
  • 对象原型不“实时更新”

    我有以下代码 var Test function Test prototype doSomething function return done 现在 我创建一个 Test 对象 var t new Test alert t doSomet
  • 在虚拟环境中安装我自己的 python 模块

    我拥有的 我想要将其转换为模块的本地 Python3 文件test module test module包含空文件夹 init py a setup py文件 见下文 和具有多个源的子目录 文件 我想要的是 不断努力和改进test modu
  • 锁定Web API控制器方法

    我正在使用 C 和 Net Framework 4 7 开发 ASP NET Web Api 应用程序 我在控制器中有一种方法 我只想一次仅由一个线程执行 换句话说 如果有人调用此方法 则另一个调用必须等待该方法完成 我找到了这个所以答案
  • RAILS_ROOT 需要吗?

    我正在尝试访问 lib 目录中的文件中的 RAILS ROOT 常量 但我无法 未初始化常量错误 我需要做些什么才能做到这一点吗 是的 您应该需要environment rb require File dirname FILE config
  • 如何从私有 azure devops feed 恢复 nuget 包?

    背景 我在 azure devops 上的私有 nuget feed 中有 nuget 包 我尝试从本地 TFS 中使用它们 这有效 但只持续了几个小时 在 azure devops 中 我导航到 Artifacts gt Connect
  • 使用 NSubstitute 模拟表达式

    我有一个包含以下方法签名的接口 TResult GetValue
  • 在 yii 中对 CListView 进行排序

    请考虑这一点 class User extends CActiveRecord public function relations return array articleCount gt array self STAT Article u
  • 如何在 Spark 窗口函数中使用 orderby() 降序排列?

    我需要一个窗口函数 该函数按某些键 列名称 进行分区 按另一个列名称进行排序并返回排名前 x 的行 这对于升序来说效果很好 def getTopX df DataFrame top x String top key String top v
  • 如何在 Java 中逐步解码大型多字节字符串文件?

    我有一个程序可能需要处理可能包含多字节编码的大文件 我当前执行此操作的代码存在创建内存结构来保存整个文件的问题 如果文件很大 这可能会导致内存不足错误 Charset charset Charset forName UTF 8 Charse
  • 仅当这些消息存在时,如何在 primefaces 中显示带有 requiredMessages 的弹出窗口?

    当我单击提交按钮时 我想显示一个弹出窗口 其中包含某些 inputText 字段的 requiredMessages 但仅限于有这些消息的情况 我已经尝试在 oncomplete 标签上使用 bean 变量和 javascript 但我无法
  • 反应本机嵌套堆栈导航显示空屏幕

    我正在尝试使用 Stack navigator 实现嵌套反应本机导航example https reactnavigation org docs 5 x nesting navigators 来自网站 我还检查了 SO 中的其他问题 但无法
  • 删除作品但不隐藏?

    为选择菜单创建过滤器并遇到一些问题 第一个是 filterContentMenu option contains a hide 不起作用但是 filterContentMenu option contains a remove does 实
  • 确保 SQLite 表只有一行

    如何强制表只有一行 以下是我尝试过的 这UPDATE触发器可能会起作用 但是CREATE触发肯定不会 对于创建 我想使用SET 然而 SETSQLite 不支持 CREATE TABLE IF NOT EXISTS config id TI
  • 二维条码与一维条码 - 速度、准确性、尺寸

    我想为我的移动项目需求之一实现条形码 要存储的数据量非常少 扫描速度 尺寸 移动相机识别所需的最小显示尺寸 这更重要 准确性 从典型的处理和SDK角度考虑 最好是zxing 我会使用二维码 特别是如果您打算使用手机摄像头 二维码具有使透视校
  • 仅在拉取请求中包含特定提交

    假设我已经克隆了存储库 创建了新分支 主题 1 进行了更改 提交了它们 然后将它们推送到远程存储库git push origin Topic1 之后我向 master 分支发出了拉取请求 然后在我的本地存储库上 我从分支 Topic1 签出
  • 即使手机锁定/睡眠时也能保持应用程序运行 - Ionic4

    应用程序是一个 ionic4 电容器应用程序 它也使用很少的 cordova 插件 我有一个与蓝牙设备关联的计时器功能 即使手机进入睡眠状态或处于锁定模式 该功能也必须保持运行 使用 cordova background mode 插件 该
  • 尝试在数据存储中存储 Utf-8 数据时出现 UnicodeEncodeError

    尝试将 utf 8 存储到数据存储中并收到错误 Traceback most recent call last File sinfo google appengine google appengine ext webapp init py
  • Android OpenGL 中 setLookAtM 方法的怪异

    作为 android 和 openGL 2 0 es 的初学者 我正在测试简单的东西并看看它是如何进行的 我在以下位置下载了示例http developer android com training graphics opengl touc