我正試圖找出一種在OpenGL中執行以下行爲的有效方法。OpenGL中的蠕蟲爬行運動?
我給一個類似蠕蟲的傢伙製作了一個動畫(基本上我想要一個帶有可見眼睛的矩形 - 沒有什麼複雜的),它應該通過擴展到其前部長度的兩倍來移動,並且從背部。當它到達窗口邊緣時,蠕蟲會反轉方向。
我在獲得正確的動作方面存在很大的困難,並且在定位眼睛時有些微小的困難。如果我只是畫兩個多邊形一個其他同它們的相對位置後,我可以期待後者被畫了前者?我現在的動議呈現出一個無限循環,我無法在概念上改變另一種方法。我無法弄清楚循環結構是否有雙倍/收縮運動並有效地終止方法。
電流以下代碼:
#define GLUT_DISABLE_ATEXIT_HACK
#include <GL/glut.h>
#include <GL/gl.h>
float wormX = 0;
float wormY = 0;
float wormWidth = 100;
float wormHeight = 75;
bool wormCrawl = true;
void timer(int value)
{
const int w = glutGet(GLUT_WINDOW_WIDTH);
if(wormX + wormWidth >= w/2) //If worm hits edge, reverse direction!
{
wormX = 2;
}
while(wormCrawl)
{
wormX += 2; //Move the worm
wormWidth = 2*wormWidth; //Extend the front
wormWidth = (1/2)*wormWidth; //Retract the back
}
glutTimerFunc(16, timer, 0);
glutPostRedisplay();
}
void display()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
const int w = glutGet(GLUT_WINDOW_WIDTH);
const int h = glutGet(GLUT_WINDOW_HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-w/2, w/2, -h/2, h/2, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
const float leftCorner = wormX;
const float rightCorner = leftCorner + wormWidth;
const float bottomCorner = wormY;
const float topCorner = bottomCorner + wormHeight;
//Worm
glBegin(GL_POLYGON);
glColor3f(0.0, 1.0, 0.0);
glVertex2d(leftCorner, topCorner);
glVertex2d(rightCorner, topCorner);
glVertex2d(rightCorner, bottomCorner);
glVertex2d(leftCorner, bottomCorner);
glEnd();
//Worm eye
glBegin(GL_POLYGON);
glColor3f(0.0, 0.0, 0.0);
glVertex2d(leftCorner, topCorner);
glVertex2d(leftCorner + 10, topCorner);
glVertex2d(leftCorner + 10, bottomCorner);
glVertex2d(leftCorner, bottomCorner);
glEnd();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow ("Inchworm Crawl");
glutDisplayFunc(display);
glutTimerFunc(0, timer, 0);
glutMainLoop();
return 0;
}
@ user2864740只有在使用深度緩衝區時,只有問題中的代碼沒有執行深度緩衝。 – duskwuff 2014-09-24 22:09:25
@duskwuff然後這就是它自己的問題:< – user2864740 2014-09-24 22:10:19
你認爲在這種情況下使用深度緩衝是可取的,還是有其他選擇?我不是最熟悉使用深度緩衝區實現,但我會看看文檔。 – 2014-09-24 22:12:55