2015-07-29 3 views
-1

Я пытаюсь сделать рельеф из сетки вершин, и у меня есть ошибка, и просто не могу найти его. Я застрял с ним в течение 3 часов. Я использую C++ и opengl.Im планируют использовать blendmap для текстурирования и высота карты later.Anyway вот код:C++ OpenGL рельеф местности

вот как это должно выглядеть следующим образом: http://postimg.org/image/9431kcvy7/

вот как это выглядит: http://postimg.org/image/xxsoesqkp/

как вы можете видеть tringles отделены друг от друга 1 и он выглядит так, как все нижние точки образуют треугольник с точкой, которая имеет координаты (0,0,0)

Я знаю, что эта проблема может показаться легко решить, но ив потерял уже 3 часа trying.Please помощь :)

Map.h

#ifndef MAP_H 
#define MAP_H 

#include <string> 
#include <vector> 
#include <iostream> 
#include <fstream> 
#include <SFML/OpenGL.hpp> 
#include <SFML/Graphics.hpp> 
#include <windows.h> 
using namespace std; 

struct coordinate{ 
    float x,y,z; 
}; 

struct face{ 
    int v[3]; 
    int n[3]; 
}; 

struct uv{ 
    float x; 
    float y; 
}; 


class Map 
{ 
    private: 
     int mapX,mapY; 
     vector<coordinate> vertex; 
     vector<uv>textureCoordinates; 
     vector<coordinate>normals; 
     vector< vector<face> > faces; 
     string fileNameString; 
     sf::Image image[5]; 
     sf::Color faceColor,blendPixel,p0,p1,p2; 
     sf::Image texture; 
     sf::Uint8 pixels[256*256*4]; 
     unsigned int imageID[3],textureID; 
    public: 
     void load(const char *fileName); 
     void draw(); 
}; 

#endif // MAP_H 

И Map. каст

#include "Map.h" 

#define blendMap 3 
#define heightMap 4 

void Map::load(const char *fileName) 
{ 
    int i,j; 
    fileNameString=fileName; 
    vector<face> F; 
    coordinate v; 
    face f; 

    image[0].loadFromFile(fileNameString+"/0.png"); 
    image[1].loadFromFile(fileNameString+"/1.png"); 
    image[2].loadFromFile(fileNameString+"/2.png"); 
    image[blendMap].loadFromFile(fileNameString+"/blendMap.png"); 
    image[heightMap].loadFromFile(fileNameString+"/heightMap.png"); 

    mapX=image[blendMap].getSize().x; 
    mapY=image[blendMap].getSize().y; 

    for(i=-mapY/2;i<mapY/2;i++) 
     for(j=-mapX/2;j<mapX/2;j++) 
     { 
      v.x=j*0.5; 
      v.z=i*0.5; 
      vertex.push_back(v); 
     } 
    for(i=0;i<mapY-1;i++) 
    { 
     for(j=0;j<2*(mapX-1);j++) 
      F.push_back(f); 
     faces.push_back(F); 
    } 

    for(i=0;i<mapY-1;i++) 
     for(j=0;j<(mapX-1)*2;j+=2) 
     { 
      faces[i][j].v[0]=i*mapX+j; 
      faces[i][j].v[1]=i*mapX+j+1; 
      faces[i][j].v[2]=(i+1)*mapX+j; 

      faces[i][j+1].v[0]=i*mapX+j+1; 
      faces[i][j+1].v[1]=(i+1)*mapX+j+1; 
      faces[i][j+1].v[2]=(i+1)*mapX+j; 
     } 

    for(i=0;i<mapX*mapY;i++) 
     { 
      color=image[heightMap].getPixel(i/mapX,i%mapX); 
      vertex[i].y=0;//(float)color.r/25.5-10; 
     } 
} 

void Map::draw() 
{ 
    unsigned int i,j; 

    for(i=0;i<mapY-1;i++) 
     for(j=0;j<(mapX-1)*2;j+=2) 
     { 
      glBindTexture(GL_TEXTURE_2D,imageID[0]); 
      glBegin(GL_TRIANGLES); 
       glTexCoord2f (0,0); 
       glVertex3f(vertex[faces[i][j].v[0]].x , vertex[faces[i][j].v[0]].y , vertex[faces[i][j].v[0]].z); 
       glTexCoord2f (1,0); 
       glVertex3f(vertex[faces[i][j].v[1]].x , vertex[faces[i][j].v[1]].y , vertex[faces[i][j].v[1]].z); 
       glTexCoord2f (0,1); 
       glVertex3f(vertex[faces[i][j].v[2]].x , vertex[faces[i][j].v[2]].y , vertex[faces[i][j].v[2]].z); 

       glTexCoord2f (0,0); 
       glVertex3f(vertex[faces[i][j+1].v[0]].x , vertex[faces[i][j+1].v[0]].y , vertex[faces[i][j+1].v[0]].z); 
       glTexCoord2f (1,0); 
       glVertex3f(vertex[faces[i][j+1].v[1]].x , vertex[faces[i][j+1].v[1]].y , vertex[faces[i][j+1].v[1]].z); 
       glTexCoord2f (0,1); 
       glVertex3f(vertex[faces[i][j+1].v[2]].x , vertex[faces[i][j+1].v[2]].y , vertex[faces[i][j+1].v[2]].z); 
      glEnd(); 
     } 
} 
+0

На самом деле 3 часа на самом деле не для отладки кода OpenGL. В некоторых случаях я провел несколько дней (например, «инстинктивная ошибка»). Однако то, что я вижу первым, заключается в том, что вы используете устаревшие функции OpenGL! Они устарели с 2007 года! –

+0

Можете ли вы рассказать мне, какие функции вы говорите? Я только начинаю, поэтому любой совет полезен –

+0

'glBegin',' glTexCoord2f', 'glVertex3f' - все устарели, вместо этого используйте VAO & Shaders. –

ответ

0

несколько вещей:

for(i=-mapY/2;i<mapY/2;i++) 

Это опасно и, вероятно, не намерение цикла. Вы хотите петли mapY раз. Однако, если mapY нечетно, вы будете зацикливаться только mapY - 1 раз. Например. если mapY = 3, то -mapY/2 = -1; mapY/2 = 1. Таким образом, вы будете зацикливаться со значениями -1 и 0. Это первая проблема, которая приводит к тому, что в вашем буфере слишком мало вершин (это, вероятно, основная проблема). Вместо того, чтобы сделать переключение на координатную уровне:

for(i = 0; i < mapY; i++) 
    for(j = 0; j < mapX; j++) 
    { 
     v.x = j * 0.5 - mapY/2.0; 
     v.z = i * 0.5 - mapX/2.0; 
     vertex.push_back(v); 
    } 

Есть причина, почему вы используете vector<vector<...>> для лица? Это даст вам всевозможные проблемы с индексацией, как вы уже заметили. Просто используйте vector<Face> и положите туда все свои лица. Обычно вы создаете эту структуру один раз и никогда не трогаете ее снова. Поэтому 2D-индексация, вероятно, не нужна. Если вы хотите, чтобы остаться с 2D индексации, этот цикл имеет неправильные оценки:

for(j=0;j<(mapX-1)*2;j+=2) 

Эта верхняя граница инклюзивный границы. Поэтому используйте

for(j = 0; j <= (mapX - 1) * 2; j += 2) 
+0

alright.ty для справки –

 Смежные вопросы

  • Нет связанных вопросов^_^