java - openGL以伪3D视角绘制扭曲的 Sprite (图像)

标签 java android opengl-es 3d andengine

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

无论如何,我复制了一些代码,允许通常的 2d AndEngine 具有 3d 视角(可以找到此类教程 here 。这工作得很好,而且我也不相信这有太多作用与我的问题有关,但我不完全理解 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           
}

这也非常有效,除了一件事!它扭曲了我的图像。这些图像是简单的 png,都与 CAMERA_WIDTH 匹配,并且看起来都类似于: "road" segment - 320 x 16

当我在没有旋转线的情况下绘制它时,我得到: without the rotating

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

final product

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

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

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

最佳答案

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

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

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

这基本上解决了问题。线条一如既往地笔直:)我在另一篇 stackoverflow 帖子中发现了这一点,其中这个答案实际上不是提问者想要的,但它恰好对我有用:D 引导我找到答案的线程可以是找到here .

关于java - openGL以伪3D视角绘制扭曲的 Sprite (图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13673876/

相关文章:

android - 水平 ScrollView 问题

android - ScrollView 中的可缩放 TextView

android - 在 Android 上使用 OpenGL ES 显示透明纹理时出现问题

java - MyBatis/Ibatis错误: The content of element type "update" must match

java - 在 Java 中存储数据的最佳方式是什么? (数组与数组列表)

java - 如何在数据库中存储Enum类名和枚举值

android - 预期类( 'com.google.android.gms.location.FusedLocationProviderClient' 的声明)在 native react 中

android - 关于用 opengl es 渲染相邻立方体的神器?

ios - 纹理缓存不渲染到 iOS 中的帧缓冲区对象

Java 类未找到异常