好的,所以这将是一个非常难以解释的问题。我正在使用AndEngine(反过来,我认为是openGL)为Android制作一个非常基本的“伪3d”赛车游戏。我不相信使用 AndEngine 真的与这个问题有任何关系,因为我直接访问 openGL 函数来完成我的绘图。
无论如何,我复制粘贴了一些代码,使通常的 2d AndEngine 具有 3d 透视图(可以在此处找到此类教程。这很好用,我也不相信这与我的问题有太大关系, 但我并不完全理解 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 图形的经验,而且对深入了解它们的兴趣更小。我需要一个创可贴来解决这个问题!