好的,这将是一个很难解释的问题。我正在使用AndEngine为Android制作一个非常基本的“伪3D”赛车游戏(反过来,我认为是openGL)。我不相信使用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,两者看起来都类似于:
当我在没有旋转线的情况下绘制它时,我得到了这个:
它有一条相当直的中间线(我会以这种方式对它们感到满意),但是你可以看到道路的边缘基本上都面对着他们应该面对的完全相反的方式。我想为什么不翻转它们?我以为我必须围绕x轴旋转180度,而只是让它们消失,而我发现90度工作(???)。无论如何,这就是我得到的:
所以是的。这就是我的问题所在 - 中间车道分隔器扭曲成废话!标志着道路边缘的线条奇妙地排列,但无论出于什么原因,它真的搞乱了中间线。我得到了3d背后的大部分数学,但我真的不知道该怎么做...这几乎就像图像被压缩,因为它是以如此尖锐的角度观看,但我真的不知道我怎么能解决这个问题而不仅仅是让它成为一个自上而下的视图? :S
无论如何......欢迎任何想法或指导。对不起,这是一篇如此冗长而复杂的帖子 - 当我真的不知道问题出在哪里时,这很难。
此外 - 值得注意的是,我对OpenGL或3D图形几乎没有经验,对深入了解它们的兴趣甚微。我需要一个创可贴来解决这个问题!
答案 0 :(得分:3)
好的,所以我找到了解决方案!事实证明,这个小问题叫做透视正确纹理,这基本上只是一个需要在OpenGL中打开的标志,以便在用透视图绘制图像时不会使图像偏斜。
在我的相机初始化代码中,我将此行添加到方法setFrustum(GL10 pGL):
pGL.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
这基本上解决了这个问题。线条像现在一样直接:)我在另一个stackoverflow帖子上找到了这个,这个答案实际上不是提问者想要的,但它恰好为我工作:D导致我得到答案的线程可以是找到here。