openGL以伪3D视角绘制扭曲的精灵(图像)

2023-12-31

好吧,这将是一个很难解释的事情。我正在使用 AndEngine(我认为是 openGL)为 Android 制作一个非常基本的“伪 3d”赛车游戏。我不相信使用 AndEngine 真的与这个问题有任何关系,因为我直接访问 openGL 函数来完成我的绘图。

无论如何,我复制了一些代码,允许正常的 2d AndEngine 具有 3d 视角(可以找到这样的教程here http://www.andengine.org/forums/tutorials/3d-perspective-tutorial-t1790.html。这工作得很好,我也不相信这与我的问题有太大关系,但我不完全理解 openGL,所以这对我来说有点难说。以下是 onLoadEngine 中的代码(在应用程序启动时调用),用于设置具有 3D 视角的相机:

this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT) {
    //other methods...
    private void setFrustum(GL10 pGL) {
        // set field of view to 60 degrees
        float fov_degrees = 60;
        float fov_radians = fov_degrees / 180 * (float)Math.PI;                        

        // set aspect ratio and distance of the screen
        float aspect = this.getWidth() / (this.getHeight());
        float camZ = this.getHeight()/2 / (float)Math.tan(fov_radians/2);                              

        // set projection
        GLHelper.setProjectionIdentityMatrix(pGL);
        GLU.gluPerspective(pGL, fov_degrees, aspect, camZ/10, camZ*10); 

        // set view
        GLU.gluLookAt(pGL, 0,120f, camZ, 0, 0, 0f, 0, 1, 0); // move camera back+up
        pGL.glScalef(1,-1,1); // reverse y-axis
        pGL.glTranslatef(-CAMERA_WIDTH/2,-CAMERA_HEIGHT/2,0); // origin at top left
    }
};

然后在 onLoadScene (绘图发生的地方)中,我画了一堆图像,如下所示:

for (int n=0;n<=100;n++) {
    final int k = n;

    final Sprite line = new Sprite(0, 0,CAMERA_WIDTH,16f, [AndEngine texture holding road img]) {
    @Override
        protected void applyTranslation(GL10 pGL) {
            pGL.glTranslatef(this.mX, 120f, 15f*k); //16*k causes a sliver of a space between each segment
            pGL.glRotatef(90f, 1, 0, 0); //**MAY BE MY ISSUE**
        }           
    };
    scene.attachChild(line); //actually draws the image to the screen           
}

Which works pretty darn well as well, except for one thing! It distorts the shit out of my images. The images are simple pngs, both matching the CAMERA_WIDTH, and both looking similar to this: "road" segment - 320 x 16

And when I draw it without the rotate line, I get this: without the rotating

它有一条相当笔直的中线(说实话,我对这种方式很满意),但是你可以看到道路的边缘基本上都面向与它们应该面向的方向完全相反的方向。我想为什么不把它们翻转过来呢?我以为我必须将它们绕 x 轴旋转 180 度,但这只会让它们消失,相反我发现 90 度有效(???)。无论如何,这就是我得到的:

嗯是的。这就是我的问题所在 - 中间车道分隔线被扭曲得一塌糊涂!标记道路边缘的线排列得非常好,但无论出于何种原因,它确实扰乱了中间线。我掌握了 3d 背后的大部分数学知识,但我真的不知道该怎么做……这几乎就像图像被压缩一样,因为它是以如此锐利的角度观看的,但我真的不知道我到底如何才能解决这个问题而不简单地将其设为自上而下的视图? :S

无论如何......欢迎任何想法或指导。抱歉,这是一篇又长又复杂的文章——当我真的不知道问题出在哪里时,这让我变得很困难。

另外 - 可能值得注意的是,我对 openGL 或 3d 图形几乎没有经验,并且对深入了解它们更没有兴趣。我需要创可贴来解决这个问题!


好的,我找到了解决方案!原来有一个小问题叫做透视正确纹理,这基本上只是一个需要在 OpenGL 中打开的标志,以使其在使用透视绘制图像时不会倾斜图像。

在我的相机初始化代码中,我将此行添加到方法 setFrustum(GL10 pGL) 中:

pGL.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

认为这基本上解决了问题。线条一如既往地笔直:)我在另一篇 stackoverflow 帖子中发现了这一点,其中这个答案实际上不是提问者想要的,但它恰好对我有用:D 引导我找到答案的线程可以是成立here https://stackoverflow.com/questions/5424078/perspective-correction-of-texture-coordinates-in-3d.

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

openGL以伪3D视角绘制扭曲的精灵(图像) 的相关文章

随机推荐

  • Delphi 2007 和 {$IFDEF...} 指令,无法看到我们的条件

    我们的代码库中的组件文件中有以下内容 IFDEF ADO FDatabase TADODatabase ELSE FDatabase TODBCDatabase ENDIF 原因是 对于各种遗留应用程序 将使用一种或另一种类型的数据库连接和
  • Python heapq:如何使用列表列表的第 n 个元素对堆进行排序?

    所以我有一些列表被添加到堆中 例如 n 1 5 93 2 6 44 4 7 45 6 3 12 heapq heapify n print n 这将根据列表的第一个元素进行比较和排序 我的问题是 如何对 heapq 进行排序 以便它比较每个
  • 如何在 python 中使用 os.system() 来运行 shell 命令

    在某些 shell 脚本中 您需要确认 yes 才能运行 shell 更简单的方法是使用 yes 和管道 如下所示 yes test py 然后 您可以自动运行 shell 脚本 而无需再回答 是 今天 当我在 python 中尝试使用它时
  • 简码输出在新行后添加

    我正在尝试创建一个短代码来将 CSS 样式属性添加到页面 我将以下代码添加到主题的functions php中 function add style atts content null return add shortcode style
  • UIVisualEffectView 创建一个灰色框而不是模糊

    我正在使用 UIVisualEffectView 模糊 SpriteKit 中的屏幕部分 如下所示 let blur UIBlurEffect UIBlurEffect style UIBlurEffectStyle Dark let UI
  • 在 Linux 中将 RCurl 安装为 R 开发工具的一部分时出错

    首先 我对 Linux 还很陌生 我在 Linux 服务器 Ubuntu 12 10 Quantal Quetzal 上安装了 R 3 1 1 最新版本 并尝试在 R 中安装 devtools 包 当我运行install packages
  • gcc 命令中 -fsyntax-only 选项有什么用?

    我读到了关于 fsyntax only选项中gcc命令的手册页 我知道它显示丢失头文件的错误 并且忽略用户编码错误 我需要知道我的理解是否正确 我也需要更多地了解这个选项 那么有人可以解释一下这个选项吗 fsyntax only防止编译器生
  • 为什么不能在drawRect中改变UIView的背景颜色?

    理论上 您可以通过以下方式轻松设置背景颜色 self backgroundColor UIColor redColor 在drawRect中 但这没有任何效果 您可以更改视图的大小 边框 子视图等 但不能更改背景颜色 类似的 SO 查询建议
  • 如何在 shell 脚本中的 curl 命令中传递变量

    我有一个curl命令 curl u USER ID PASSWORD X GET http blah gso woo com 8080 rest job execution job details job id 变量job id其中有一个值
  • Backbone.Collection 上的 toJSON#在哪里?

    我不知道为什么 但我无法让它工作 var friends new Backbone Collection name Athos job Musketeer name Porthos job Musketeer name Aramis job
  • 创建 COM 互操作类的实例

    我正在尝试使用 C 从我的程序中打开 CorelDRAW 到目前为止 我已经能够通过引用适当的 com 库并调用来做到这一点 CorelDRAW Application draw new CorelDRAW Application draw
  • Python - ElementTree - 不能在元素上使用绝对路径

    当我尝试运行以下代码时 我在 ElementTree 中收到此错误 SyntaxError cannot use absolute path on element 我的 XML 文档如下所示
  • JSON 迭代器的类型安全警告

    我的问题来自于从 JSONObject 获取迭代器 最简单形式的代码生成错误 String json client retrieveList JSONObject jsonList new JSONObject json Iterator
  • Java - 不可变数组线程安全

    我有一个关于 Java 内存模型的问题 这是一个呈现问题的简单类 public class ImmutableIntArray private final int array public ImmutableIntArray array n
  • 如何有效地从 std::set 中选择随机元素

    如何有效地从一个随机元素中选择一个std set A std set iterator is 不是随机访问迭代器 所以我不能像为一个随机选择的元素那样直接索引std deque or std vector I could获取从返回的迭代器s
  • 表达式 lambda 和语句 lambda 之间的区别

    表达式 lambda 和语句 lambda 之间有区别吗 如果是这样 有什么区别 在下面的链接中找到了这个问题 但无法理解答案 什么是 Lambda 表达式 C 面试题 http csharpinterviewfaq blogspot in
  • MFMailComposeViewController 未从视图中消失

    我有以下代码 当调用操作表上的按钮时会调用该代码 但是 当我按取消 然后删除草稿时 它只是收费并且不会关闭 我在应用程序的其他地方使用相同的代码 并从选择的表格视图单元格中调用它 并且它可以在那里找到 有什么想法为什么它在这里不起作用吗 当
  • 当变量超出范围时是否意味着它不存在?

    我不确定我是否理解作用域 超出作用域的变量 我正在使用 Ruby 是否存在于内存中的某处 或者它是否停止存在 我知道你无法访问它 说超出范围的变量不再存在是不准确的吗 也许这是一个哲学问题 如果您使用托管语言 那么您不会分配和取消分配内存
  • Google Oauth2 userinfo API 不返回用户名数据

    在过去的几个月里 我一直在使用 OAuth 登录后使用此 url 来检索用户的名称和信息 https www googleapis com oauth2 v1 userinfo alt json 这给了我以下格式的 JSON id 1234
  • openGL以伪3D视角绘制扭曲的精灵(图像)

    好吧 这将是一个很难解释的事情 我正在使用 AndEngine 我认为是 openGL 为 Android 制作一个非常基本的 伪 3d 赛车游戏 我不相信使用 AndEngine 真的与这个问题有任何关系 因为我直接访问 openGL 函