在OpenGL中,我正在建立一个足球游戏,允许你通过首先移动高度指示器来左右拍摄球,然后在按下按钮时根据指示器进行拍摄。这是它的样子:
当移动这些指示器时,我的球需要在垂直指示器(y)的高度移动,如果是垂直指示器(x)则需要向左或向右移动。
首先,这是移动我的指标的代码(只是在我的RenderScene()
函数中绘制的纹理)
void SpecialKeys(int key, int x, int y){
if (key == GLUT_KEY_RIGHT) { // moves the bottom indicator RIGHT
horizontalBarX += 5.0f;
}
if (key == GLUT_KEY_LEFT) {
horizontalBarX -= 5.0f; // moves the bottom indicator LEFT
}
if (key == GLUT_KEY_UP) { // moves the top indicator UP
verticalBarY += 5.0f;
verticalBarX += 1.0f;
}
if (key == GLUT_KEY_DOWN) { // moves the top indicator DOWN
verticalBarY -= 5.0f;
verticalBarX -= 1.0f;
}
}
我的足球移动计算
现在,为了让我的足球在移动指标后移动,我需要将以下计算应用于球的x
,y
和z
轴:
x = sin(theta)* cos(phi)y = cos(theta)* sin(phi)z = cos(theta)
其中θ= z-x中的角度,phi = z-y中的角度
因此,我试图首先获取theta和phi角度的值,只需根据你在SpecialKeys()
函数中按下的高度指示器递增它们:
void SpecialKeys(int key, int x, int y){
if (key == GLUT_KEY_RIGHT) { // moves the bottom indicator RIGHT
horizontalBarX += 5.0f;
theta += 5; // Increase theta angle by 5
}
if (key == GLUT_KEY_LEFT) {
horizontalBarX -= 5.0f; // moves the bottom indicator LEFT
theta -= 5; // Decrease theta angle by 5
}
if (key == GLUT_KEY_UP) { // moves the top indicator UP
verticalBarY += 5.0f;
verticalBarX += 1.0f;
phi += 5; // Increase theta angle by 5
}
if (key == GLUT_KEY_DOWN) { // moves the top indicator DOWN
verticalBarY -= 5.0f;
verticalBarX -= 1.0f;
phi -= 5; // Decrease phi angle by 5
}
}
既然我有角度,我想将计算出的值插入到drawFootball()参数中,顺便说一句,这个参数最初是在我的RenderScene函数中调用的......
drawFootBall(0, 40, 500, 50); // x,.y, z, r
......以下是我试图通过上述计算发球的方法:
void SpecialKeys(int key, int x, int y){
// indicator if statements just above this line
if (key == GLUT_KEY_F1) {
drawFootBall(sin(theta)*cos(phi), cos(theta)*sin(phi), cos(theta), 50);
}
}
但是当我点击启动按钮 F1 时,根本不会发生任何事情。我搞砸了哪里?
修改
如果有帮助,这是我的drawFootball()
功能:
void drawFootBall(GLfloat x, GLfloat y, GLfloat z, GLfloat r)
{
glPushMatrix();
glFrontFace(GL_CCW);
glTranslatef(x,y,z);
//create ball texture
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_BALL]);
//glDisable(GL_LIGHTING);
glColor3f(0.5,0.5,0.5);
quadricFootball = gluNewQuadric();
gluQuadricDrawStyle(quadricFootball, GLU_FILL);
gluQuadricNormals(quadricFootball, GLU_SMOOTH);
gluQuadricOrientation(quadricFootball, GLU_OUTSIDE);
gluQuadricTexture(quadricFootball, GL_TRUE);
gluSphere(quadricFootball, r, 85, 50);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
}
答案 0 :(得分:0)
首先确保您的theta
和phi
位于正确的单位,即Radians。如果在度数中使用sin(theta * PI/180.0f)
等将它们转换为弧度,则假设已定义PI。
我相信你在计算的是Ball的方向向量。 d(x,y,z)
是球应该行进的方向(假设没有重力或其他力)。它可能是踢球的方向。
我想如果你只是想移动你的球,你需要将这个方向乘以一个长度。由于您的球的半径为50个单位,请尝试将其转换为此半径的2倍。
glTranslatef(2.0f*r*x,2.0f*r*y,2.0f*r*z);
这会将球移动到所需方向的半径的2倍。 但是你可能想要一些物理学来进行更逼真的运动。