奇怪的C ++问题,OpenGL游戏

时间:2015-01-27 19:28:53

标签: c++ opengl

Aight所以,我正在制作一个简单的地形程序,而不是一个游戏,但嘿,也许有一天。我将首先描述我的程序如何工作的基础知识。我正在使用二维数组来存储构成三角形网格的顶点的坐标。 x和z值在以下代码中分配:

    //Sets up the array for the vertexes

int e = 0;
int p = 0;
for (int r = 0; r < 10; r++)    {
    for (int x = 0; x < 5; x++) {
        grid[p][0] = x * 2;
        grid[p][2] = e;
        p++;
    }
    e += 2;
}

好的,所以网格数组是我用来存储程序中所有顶点值的那个,第一个参数(第一组[]中的值)用于选择一个点,第二个参数[]是x,y和z值,上面的代码片段仅设置x和z坐标的值。 y值,height,在程序开始时使用以下代码随机化:

    //Random heights for the terrain

if (fir == true)    {

    for (int h = 0; h < 64; h++)    {
        grid[h][1] = rand() % 3;
    }

    fir = false;
}

绘制三角形的代码:

        for (int q = 0; q < 11; q++)    {

        a = q * 5;
        b = a + 1;
        c = a + 5;

        glBegin(GL_TRIANGLE_STRIP);

        for (int dw = 0; dw < 8; dw++)  {

            //a
            glColor3f(grid[a][1], grid[a][1], grid[a][1]);
            glVertex3f(grid[a][0], grid[a][1], grid[a][2]);

            //b
            glColor3f(grid[b][1], grid[b][1], grid[b][1]);
            glVertex3f(grid[b][0], grid[b][1], grid[b][2]);

            //c
            glColor3f(1, 0, 0);
            glVertex3f(grid[c][0], grid[c][1], grid[c][2]);

            a = c;
            t = b;
            b = a + 1;
            c = t;

        }
        glEnd();
    }
glutSwapBuffers();
}

我遇到的问题是,如果没有程序破坏,我无法使网格的大小更大,我希望能够将三角形网格的大小更改为我喜欢的任何内容。当我尝试更改通过x值(第一个代码片段)的for循环时程序中断,我的移动速度急剧增加,移动鼠标对相机旋转没有影响。当我设法找到一组值来工作时,三角形网格搞砸了,第五行之后的任何点都被设置为0,我将发布整个程序,我不知道它是否会运行每个人,但我认为问题是需要整个程序才能解决的问题。 我认为问题可能是由于变量被程序的不同部分共享,我看起来和看起来但似乎找不到任何原因。这是我解决这个问题噩梦的最后手段......

的main.cpp

    /*








*/


#include <iostream>
#include <glut.h>
#include <gl\GL.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include <cstdlib>

#include "vector3f.h"

using namespace std;

//Variables
const int WINDOW_WIDTH = 1280;
const int WINDOW_HEIGHT = 720;
const char* WINDOW_TITLE = "Terrain";

const float WALKING_SPEED = 5.0;
const float MOUSE_SENSITIVITY = 0.3;
const float MAX_TILT = 90.0;

float grid[200][3];

float LAST_TIME;
float CURRENT_TIME;
float DELTA_TIME;

bool KEY[256];

int a;
int b;
int c;
int t;

int MOUSE_LAST_X;
int MOUSE_LAST_Y;

int MOUSE_CURRENT_X;
int MOUSE_CURRENT_Y;

int MOUSE_DELTA_X;
int MOUSE_DELTA_Y;

float red;
float green;
float blue;



bool fir = true;

//Object
vector3f CAMERA_POSITION;
vector3f CAMERA_ROTATION;

//Functions
void initialize();
void display();
void reshape(int w, int h);
void keyboardDown(unsigned char key, int x, int y);
void keyboardUp(unsigned char key, int x, int y);
void mouseMove(int x, int y);
void movement();
double degreesToRadians(double degrees);
double dsin(double theta);
double dcos(double theta);
double dtan(double theta);

void display() {



    //cout << KEY[' '] << endl;

    movement();

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    //Camera transformations
    glRotatef(CAMERA_ROTATION.x, 1, 0, 0);
    glRotatef(CAMERA_ROTATION.y, 0, 1, 0);
    glRotatef(CAMERA_ROTATION.z, 0, 0, 1);
    glTranslatef(-CAMERA_POSITION.x, -CAMERA_POSITION.y, CAMERA_POSITION.z);

    //Draw the basic triangle
    glBegin(GL_TRIANGLES);

        glColor3f(0.0, 0.0, 1.0);
        glVertex3f(-1.0, -1.0, -3.0);

        glColor3f(0.0, 1.0, 0.0);
        glVertex3f(0.0, 1.0, -3.0);

        glColor3f(1.0, 0.0, 0.0);
        glVertex3f(10.0, -1.0, -3.0);
    glEnd();

    /*

    1  0,0,0
    2  2,0,0
    3  4,0,0
    4  6,0,0

    5  0,0,2
    6  2,0,2
    7  4,0,2
    8  6,0,2

    9  0,0,4
    10 2,0,4
    11 4,0,4
    12 6,0,4

    13 0,0,6
    14 2,0,6
    15 4,0,6
    16 6,0,6

    */



    /*//Option 1 (2 for loops, four if statements)
    for (int p = 0; p < 16; p++)    {
        for (int x = 0; x < 7; x += 2)  {
            grid[p][0] = x;
        }
        grid[p][1] = 0;
        if (p < 4)  {
            grid[p][2] = 0;
        }
        if (p < 8 && p >= 4)    {
            grid[p][2] = 2;
        }
        if (p < 12 && p >= 8)   {
            grid[p][2] = 4;
        }
        if (p < 16 && p >= 12)  {
            grid[p][2] = 6;
        }
    }
    */
    //Option 2 (three for loops)


    //Sets up the array for the vertexes

    int e = 0;
    int p = 0;
    for (int r = 0; r < 10; r++)    {
        for (int x = 0; x < 5; x++) {
            grid[p][0] = x * 2;
            grid[p][2] = e;
            p++;
        }
        e += 2;
    }


    //Random heights for the terrain

    if (fir == true)    {

        for (int h = 0; h < 64; h++)    {
            grid[h][1] = rand() % 3;
        }

        fir = false;
    }




    //cout << "point 0: " << grid[0][0] << ", " << grid[0][1] << ", " << grid[0][2] << endl;
    //cout << "point 1: " << grid[1][0] << ", " << grid[1][1] << ", " << grid[1][2] << endl;
    //cout << "point 2: " << grid[2][0] << ", " << grid[2][1] << ", " << grid[2][2] << endl;
    //cout << "point 3: " << grid[3][0] << ", " << grid[3][1] << ", " << grid[3][2] << endl;
    //cout << "point 4: " << grid[4][0] << ", " << grid[4][1] << ", " << grid[4][2] << endl;
    //cout << "point 5: " << grid[5][0] << ", " << grid[5][1] << ", " << grid[5][2] << endl;
    //cout << "point 6: " << grid[6][0] << ", " << grid[6][1] << ", " << grid[6][2] << endl;
    //cout << "point 7: " << grid[7][0] << ", " << grid[7][1] << ", " << grid[7][2] << endl;
    //cout << "point 8: " << grid[8][0] << ", " << grid[8][1] << ", " << grid[8][2] << endl;
    //cout << "point 9: " << grid[9][0] << ", " << grid[9][1] << ", " << grid[9][2] << endl;
    //cout << "point 10: " << grid[10][0] << ", " << grid[10][1] << ", " << grid[10][2] << endl;
    //cout << "point 11: " << grid[11][0] << ", " << grid[11][1] << ", " << grid[11][2] << endl;
    //cout << "point 12: " << grid[12][0] << ", " << grid[12][1] << ", " << grid[12][2] << endl;
    //cout << "point 13: " << grid[13][0] << ", " << grid[13][1] << ", " << grid[13][2] << endl;
    //cout << "point 14: " << grid[14][0] << ", " << grid[14][1] << ", " << grid[14][2] << endl;
    //cout << "point 15: " << grid[15][0] << ", " << grid[15][1] << ", " << grid[15][2] << endl;





        for (int q = 0; q < 11; q++)    {

            a = q * 5;
            b = a + 1;
            c = a + 5;

            glBegin(GL_TRIANGLE_STRIP);

            for (int dw = 0; dw < 8; dw++)  {

                //a
                glColor3f(grid[a][1], grid[a][1], grid[a][1]);
                glVertex3f(grid[a][0], grid[a][1], grid[a][2]);

                //b
                glColor3f(grid[b][1], grid[b][1], grid[b][1]);
                glVertex3f(grid[b][0], grid[b][1], grid[b][2]);

                //c
                glColor3f(1, 0, 0);
                glVertex3f(grid[c][0], grid[c][1], grid[c][2]);

                a = c;
                t = b;
                b = a + 1;
                c = t;

            }
            glEnd();
        }
    glutSwapBuffers();
}

void keyboardDown(unsigned char key, int x, int y)  {

    KEY[key] = true;

}

void keyboardUp(unsigned char key, int x, int y)    {

    KEY[key] = false;

}

void movement() {

    CURRENT_TIME = ((float)glutGet(GLUT_ELAPSED_TIME) / 1000);
    DELTA_TIME = CURRENT_TIME - LAST_TIME;
    LAST_TIME = CURRENT_TIME;

    MOUSE_DELTA_X = MOUSE_CURRENT_X - MOUSE_LAST_X;
    MOUSE_DELTA_Y = MOUSE_CURRENT_Y - MOUSE_LAST_Y;

    MOUSE_LAST_X = MOUSE_CURRENT_X;
    MOUSE_LAST_Y = MOUSE_CURRENT_Y;

    CAMERA_ROTATION.y += (float)MOUSE_DELTA_X * MOUSE_SENSITIVITY;
    CAMERA_ROTATION.x += (float)MOUSE_DELTA_Y * MOUSE_SENSITIVITY;

    if (CAMERA_ROTATION.x > MAX_TILT)   {
        CAMERA_ROTATION.x = MAX_TILT;
    }
    if (CAMERA_ROTATION.x < -MAX_TILT)  {
        CAMERA_ROTATION.x = -MAX_TILT;
    }


    if (KEY['w'] == true)   {
        CAMERA_POSITION.x += (WALKING_SPEED * DELTA_TIME) * dsin(CAMERA_ROTATION.y);
        CAMERA_POSITION.z += (WALKING_SPEED * DELTA_TIME) * dcos(CAMERA_ROTATION.y);
        CAMERA_POSITION.y += (WALKING_SPEED * DELTA_TIME) * dsin(CAMERA_ROTATION.x + 180);
    }
    if (KEY['s'] == true)   {
        CAMERA_POSITION.x += (WALKING_SPEED * DELTA_TIME) * dsin(CAMERA_ROTATION.y + 180);
        CAMERA_POSITION.z += (WALKING_SPEED * DELTA_TIME) * dcos(CAMERA_ROTATION.y + 180);
        CAMERA_POSITION.y += (WALKING_SPEED * DELTA_TIME) * dsin(CAMERA_ROTATION.x);
    }
    if (KEY['a'] == true)   {
        CAMERA_POSITION.x += (WALKING_SPEED * DELTA_TIME) * dsin(CAMERA_ROTATION.y + 270);
        CAMERA_POSITION.z += (WALKING_SPEED * DELTA_TIME) * dcos(CAMERA_ROTATION.y + 270);
    }
    if (KEY['d'] == true)   {
        CAMERA_POSITION.x += (WALKING_SPEED * DELTA_TIME) * dsin(CAMERA_ROTATION.y + 90);
        CAMERA_POSITION.z += (WALKING_SPEED * DELTA_TIME) * dcos(CAMERA_ROTATION.y + 90);
    }
    if (KEY[' '] == true)   {
        CAMERA_POSITION.y += (WALKING_SPEED * DELTA_TIME);
    }
    if (KEY['e'] == true)   {
        exit(1);
    }

}

void mouseMove(int x, int y)    {

    MOUSE_CURRENT_X = x;
    MOUSE_CURRENT_Y = y;



}

double degreesToRadians(double degrees){

    return degrees * M_PI / 180;

}

double dsin(double theta)   {

    return sin(degreesToRadians(theta));

}
double dcos(double theta)   {

    return cos(degreesToRadians(theta));

}
double dtan(double theta)   {

    return tan(degreesToRadians(theta));

}


void reshape(int w, int h)  {

    //Stops the ratio from dividing by 0
    if (h == 0) {
        h = 1;
    }

    float fRatio = (float)w / h;

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    glViewport(0, 0, w, h);
    gluPerspective(60, fRatio, 0.1, 1000);

    glMatrixMode(GL_MODELVIEW);

}

void initialize() {

    glClearColor(0.0, 0.0, 102.0 / 255.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
}

int main(int iArgc, char** cArgv) {

    //Initialise OpenGL and GLUT
    glutInit(&iArgc, cArgv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);

    //Setup window
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
    glutCreateWindow(WINDOW_TITLE);

    //Setup GLUT callback functions
    initialize();
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutKeyboardFunc(keyboardDown);
    glutKeyboardUpFunc(keyboardUp);
    glutMotionFunc(mouseMove);
    glutPassiveMotionFunc(mouseMove);

    glEnable(GL_DEPTH_TEST);

    //Enter main loop
    glutMainLoop();

    return 0;
}

1 个答案:

答案 0 :(得分:0)

一些快速评论:

  • 你的循环访问不同数量的点!
    第一个循环(r,x)初始化50个点
    第二循环(h)初始化64点
    第3循环(q,dw)访问59分

  • glColor3f值应介于0和1之间,但使用网格y值,可获得0,1或2

  • 在尝试旋转视图时要小心gimbal lock problem