我正在使用 OpenGL 为 Android 编写我的第一个 2D 应用程序。我在我的 Desire 上写它,所以我的屏幕坐标在横向模式下应该是 0,0 到 799,479。我试图让 OpenGL 在世界坐标中使用这个范围。
到目前为止,该应用程序运行良好,但我不得不调整数字以使内容出现在屏幕上,我对无法理解投影矩阵之间的关系感到沮丧,以及这方面的纹理渲染。
设置投影矩阵:
gl.glViewport(0, 0, width, height);
float ratio = (float) width / height;
float size = .01f * (float) Math.tan(Math.toRadians(45.0) / 2);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-size, size, -size / ratio, size / ratio, 0.01f, 100.0f);
// GLU.gluOrtho2D(gl, 0,width, 0, height);
我想在这里了解0.01f和100.0f。我用什么来描述 0,0 -> 799,479 且 z 值为零的二维世界?
此外,我不确定什么是“最好的”——使用 glFrustumF 或 GLU.gluOrtho2D 后者具有更简单的参数——只是视口(viewport)的尺寸——但我对此一无所知。 (有些站点的高度为 0,相反的方向为 0,但这没有区别。)但这不应该是 2D 使用 OpenGL 的自然选择吗?我是否必须在某处设置一些内容以对 OpenGL 说“我在 2D 中执行此操作 - 为了速度,请无视任何地方的三维空间”?
绘制我的纹理:
我正在使用 2 个带纹理的三角形绘制东西。我的 init 的相关部分(让我知道是否需要更详细地编辑我的问题)是:
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatex(nXpos, nYpos, nZoomin);
gl.glRotatef(nRotZ, 0, 0, 1);
gl.glScalef((float)nScaleup,(float)nScaleup, 0.0f);
...
...
gl.glVertexPointer(2, GL10.GL_FIXED, 0, mVertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
mVertexBuffer is an IntBuffer and contains:
int vertices[] =
{
-1, -1,
1, -1,
-1, 1,
1, 1
};
最终,我不打算必须传递 nZoomin - 我已经这样做了,因为这是我发现实际看到任何东西所需的“神奇数字”的方式!目前我需要在那里使用 -1000,数字越小,图像越小。当投影矩阵设置正确时,我是否认为必须有某种方法使 nZoomin 的值为零?
我的纹理目前是 128x128(但最终可能会变成不同的尺寸,尽管可能总是正方形)。我无法知道它们目前何时以实际尺寸显示。我希望能够为 nScaleup 传递一个值,比如 128,以便以实际大小绘制它。这与投影矩阵有关,还是我有两个不同的问题?
最佳答案
如果您在 2D 中工作,则不需要 glFrustum,只需使用 glOrtho .像这样:
void glOrthof(0, 800, 0, 480, -1, 1);
这会将原点放在左下角。如果你想要它在左上角,使用:
void glOrthof(0, 800, 480, 0, -1, 1);
对于 480 和 800,您显然应该替换 View 的实际尺寸,这样您的应用将适用于不同的屏幕尺寸和配置。
我为 z 范围传递了 -1 和 1,但这些并不重要,因为正交投影将 (x, y, z) 放在屏幕上的同一位置,无论 z 的值如何. (虽然近和远不能相等。)这是告诉 OpenGL 忽略 z 坐标的唯一方法;没有特定的“2D”模式,您的矩阵仍然是 4x4,二维顶点的 z 坐标将为 0。
请注意,您的坐标不范围从 0 到 799,但实际上是从 0 到 800。原因是 OpenGL 将坐标解释为位于 像素之间,而不是 < em="">在他们身上。把它想象成一把 30 厘米的尺子:它上面有 30 个一厘米的间隔,刻度编号为 0-30。
您使用的顶点缓冲区不起作用,因为您使用的是 GL_FIXED 格式。这意味着小数点前 16 位和小数点后 16 位,因此要在原点周围指定一个 2x2 正方形,您需要将每个值乘以 0x10000:
int vertices[] =
{
-0x10000, -0x10000,
0x10000, -0x10000,
-0x10000, 0x10000,
0x10000, 0x10000
};
这可能就是您如此需要对其进行扩展的原因。如果你使用这个数组,没有缩放,你应该得到一个 2x2 像素的正方形。将其变成 1x1 正方形,以便可以通过比例因子直接控制大小,留给读者作为练习;)
关于android - 帮助我为 2D 配置 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4914921/
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我是ruby的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO