gpt4 book ai didi

c++ - OpenGL 中的蠕虫爬行运动?

转载 作者:行者123 更新时间:2023-11-28 06:40:42 24 4
gpt4 key购买 nike

我正在尝试找出一种在 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;
}

最佳答案

所以首先,我们想让生活更轻松,您应该尝试将您的蠕虫抽象为一个类。我假设你之后可能想继续开发这个,但无论如何它仍然是很好的做法。这也将使我们的绘图调用更加容易。

好吧,假设我们现在有了我们的 Worm 类,该类将有自己的绘图函数,我们想尝试将我们的绘图调用保留在 display() 中我们主要的功能尽可能简单。想象一下,如果您想画另一条蠕虫,您将不得不做什么。

因此在您的蠕虫类中,您的draw() 方法将如下所示:

void Worm::draw()
{
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();
}

好的,这只是它的基础知识,但我仍然没有回答您的实际问题。我不确定您使用的是哪个版本的 freeglut,但希望您使用的是最新版本。一般来说,如果您计划做的不仅仅是渲染,您应该尽量远离 glutmainloop();。它基本上阻止您在渲染循环之外执行任何逻辑,这实际上意味着您程序中的所有内容都将被锁定到帧速率。相反,您应该考虑在主函数中编写一个游戏循环,然后每次您要渲染帧时调用 glutmainloopevent()

所以现在更多的是运动,一旦你创建了你的游戏循环,逻辑上你可以把所有的更新功能放在这里,在循环结束时,你可以调用 glutmainloopevent() 注意这个循环也是一个半无限循环。它会在某些标志为真时运行,然后一旦您的蠕虫已经足够蠕动,您就可以终止它。 :P

现在我们可以向我们的蠕虫类添加更多功能来移动我们的蠕虫并增加它的宽度我们可以将其称为 move()。为了简化事情,我们可以给我们的蠕虫添加一个标志,告诉我们他应该缩小还是增长。这只是一个 bool 值,在创建我们的蠕虫对象时被初始化为 false。

void Worm::move(bool direction)
{
if(growing)
{
wormWidth += 1;
if(wormWidth > thresholdWidth)
{
growing = false;
}
}
else
{
wormWidth += 1;
if(wormWidth > thresholdWidth)
{
growing = false;
}
}
if(direction)
{
wormx += 1;
}
else
{
wormx -= 1;
}
}

现在我还没有测试过这个功能,但我想它应该做一些接近你正在寻找的事情。我目前在我的工作电脑上没有过剩设置,也没有 openGL 就此而言。但是,如果这不能完全满足您的需求,请给我一些评论,我下类回家后可以看看。

最后要注意的是,您还将在游戏循环中调用移动函数,现在对于您的游戏循环,您可能只需要一个 while 循环来执行此操作,但最终您可以将其设置为仅更新 X 数量每秒次数,每秒绘制 Y 次。

需要注意的一件事是,因为您每帧绘制的对象不超过一个,所以不会有什么不同。你可以继续画你的蠕虫,这就是 gLClear() 函数为你做的,它会清除颜色缓冲区中当前的所有内容,如果你正忙于一个明确使用 3D 的应用程序,你会还需要添加深度缓冲区,否则不会以正确的顺序绘制事物,您可能会遇到 z-fighting 或某些事物被实际位于它们后面的事物所吸引。

希望我没有离题,希望这篇文章对您有所帮助!

祝你好运!

关于c++ - OpenGL 中的蠕虫爬行运动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26027303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com