Рендирането на терена на картата на височината на OpenGL не се изчертава

Имам растерна карта, създадена от dted файл. Искам да използвам това растерно изображение и да създам 3D изобразяване на терен. Опитвам се да го направя с върхови вектори, но изобщо не можах да постигна целта си. Ето моят paintGL код:

void render::paintGL(){
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glTranslatef(0,0,-100);
for(int z=0;z<dted.width()-1;z++){
    glBegin(GL_TRIANGLE_STRIP);
    for(int x = 0; x<dted.height()-1; x++){
        glColor3f(matrix[x][z], matrix[x][z], matrix[x][z]);
        glVertex3f(x, matrix[x][z], -z);
        //vertex0 ends here

        glColor3f(matrix[x+1][z], matrix[x+1][z], matrix[x+1][z]);
        glVertex3f(x+1, matrix[x+1][z], -z);
        //vertex1 ends here

        glColor3f(matrix[x][z+1], matrix[x][z+1], matrix[x][z+1]);
        glVertex3f(x, matrix[x][z+1], -z-1);
        //vertex2 ends here

        glColor3f(matrix[x+1][z+1], matrix[x+1][z+1], matrix[x+1][z+1]);
        glVertex3f(x+1, matrix[x+1][z+1], -z-1);
        //vertex3 ends here


    }
    glEnd();
}}

Трябваше да напиша кода вместо копиране и поставяне поради проблеми с интернет. Така че може да има неща, които съм забравил, но съм дал всичко от себе си. Нека обясня променливите и другите неща по-горе:

dted е изображението dted, което създадох, и зададох граници от стойностите на ширината и височината на това изображение. matrix е 2d матрица, която съдържа стойностите на надморската височина, които получавам от предварително създадените dted пиксели на изображението.

След целия код по-горе не успях да изобразя терена. Не знам дали изобразява терена, но просто не ми го показва или изобщо не изобразява. Ако обясните къде ми е грешката и предложите решение за нея, ще бъде страхотно.

Съжалявам за граматическите грешки, ако съм направил такива, и се надявам, че съм обяснил добре проблема си. Ако предоставеният от мен код не е достатъчен, не се колебайте да споменете това и мога да запиша и другите части.

Приятен ден.

Редактиране: Добре, имам свежи новини тук. Успях да нарисувам равнина, след като се справих с някои проблеми с мишката. Въпреки това, когато се опитам да получа амплитуда, тя не показва нищо. Предполагам, че поради твърде голямата амплитуда, но когато го разделя на константа като 15, същата равнина се показва отново. Дали това е защото използвах GL_TRIANGLE_STRIP?


person user3483948    schedule 12.06.2015    source източник
comment
Първо се уверете, че сте способни да рисувате: започнете с един триъгълник на твърдо кодирано място. Второ: matrix стойностите са между 0 и 1? Трябва, ако ги въведете в glColor3f. Можете ли да проверите това?   -  person Sga    schedule 12.06.2015
comment
Проверих го и видях, че не е така. Въпреки това го разделих на 255 (стойностите на пикселите бяха от 0 до 255) и все още не показва нищо. Между другото вече нарисувах куб и се оказа добре.   -  person user3483948    schedule 12.06.2015
comment
Сега трябва да проверите камерата си: твърде далеч ли е? Равнината перпендикулярна ли е на него (така че става само тънка линия)? Опитайте да преувеличите стойностите на Y с множител   -  person Sga    schedule 12.06.2015
comment
Настроих събитие на мишката за това, което намалява мащаба при щракване с десен бутон и увеличава при щракване с левия бутон, което променя стойността z на функцията translatef. Умножих амплитудата на Y по 15 (матрица[x][z]*15) и неочаквано не можах да го видя. Мислите ли, че проблемът е в камерата?   -  person user3483948    schedule 12.06.2015
comment
Да, може да се посочи другаде   -  person Sga    schedule 12.06.2015
comment
Е, не знам добре opengl, но както разбрах от куба, който създадох за пробната версия, камерата е центрирана към началото по подразбиране, а функцията translatef просто поставя изобразения елемент в тази координатна система. Ето защо променям параметрите на функцията translatef. Ето защо се опитвам да създам картата част по част. Така че започнах да мисля, че изобщо не го изобразява. Имате ли идея за това?   -  person user3483948    schedule 12.06.2015
comment
Превключете към GL_POINTS с glPointSize(50)   -  person Sga    schedule 12.06.2015
comment
И това не помогна.   -  person user3483948    schedule 12.06.2015
comment
Започнете отново с куба... И го начертайте близо до вашите точки   -  person Sga    schedule 12.06.2015
comment
Направих го и се представи добре.   -  person user3483948    schedule 12.06.2015
comment
Какво се случва, ако използвате 0 вместо вашето matrix[][]?   -  person Sga    schedule 12.06.2015
comment
Същото като в началото. Не рисува нищо.   -  person user3483948    schedule 12.06.2015
comment
Добре, имам свежи новини тук. Успях да нарисувам равнина, след като се справих с някои проблеми с мишката. Въпреки това, когато се опитам да получа амплитуда, тя не показва нищо. Предполагам, че поради твърде голямата амплитуда, но когато го разделя на константа като 15, същата равнина се показва отново. Дали това е защото използвах GL_TRIANGLE_STRIP?   -  person user3483948    schedule 12.06.2015
comment
Трудно е да разберете проблема без останалата част от вашия код за изобразяване, но едно нещо: вярвам, че вашите индекси може да са проблем: гледате от 0 до ширина-1, но след това имате достъп до x и (x+1), което може така стават ширина.   -  person Knowleech    schedule 12.06.2015
comment
Индексите на @Knowleech са добре, няма препълване   -  person Sga    schedule 12.06.2015
comment
Успях да изобразя нещо, но изглежда, че е твърде голямо за виждане и колкото и да намалявам мащаба, не изглежда като разбираем изобразен обект. За изглед под ъгъл добавих този код: 'glRotatef(45,0,1,0)'   -  person user3483948    schedule 15.06.2015
comment
Ти каза: но когато го разделя на константа като 15, същата равнина се появява отново. Възможно ли е да си правил interger-Divison и да си закръглен до нула? Не забравяйте да напишете matrix[][] / 15.0f   -  person Knowleech    schedule 16.06.2015
comment
Благодаря за цялата ви помощ, момчета. Най-накрая мога да го направя. Не можех да го направя без вашата помощ. Благодаря много...   -  person user3483948    schedule 17.06.2015


Отговори (2)


Вашият код за изобразяване изглежда странен: изграждате своята трилентова лента с дегенерирани триъгълници и може да получите достъп до данни, които не са там. Предположих останалата част от вашия подход и се опитах да поправя вашия метод. Опитайте тази:

void render::paintGL(){
  glLoadIdentity();
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  glMatrixMode(GL_MODELVIEW);
  glTranslatef(0,0,-100);
  for(int z = 0; z < dted.width() - 2; z++) {
    glBegin(GL_TRIANGLE_STRIP);
    for(int x = 0; x < dted.height() - 1; x++){
        glColor3f(matrix[x][z], matrix[x][z], matrix[x][z]);
        glVertex3f(x, matrix[x][z], -z);
        //vertex0 ends here

        glColor3f(matrix[x][z + 1], matrix[x][z + 1], matrix[x][z + 1]);
        glVertex3f(x, matrix[x][z + 1], -z - 1);
        //vertex1 ends here

    }
    glEnd();
}}

Освен това, триъгълните ленти са добри. Ако все още не виждате нищо, следвайте предложението на Sga и използвайте GL_POINTS. След това поправете кода на вашата камера/друг рендиращ код, докато не ги видите.

person Knowleech    schedule 12.06.2015
comment
Успях да изобразя нещо, но изглежда, че е твърде голямо за виждане и колкото и да намалявам мащаба, не изглежда като разбираем изобразен обект. За изглед под ъгъл добавих този код: 'glRotatef(45,0,1,0)' - person user3483948; 15.06.2015
comment
Необходима ли е триъгълна лента? Мога ли да използвам многоъгълник или четириъгълници? Подходящо е повече за целта ми, тъй като искам да го изобразя парче по парче като изобразяване на 2d изображение пиксел по пиксел. - person user3483948; 15.06.2015
comment
Кодът за изобразяване, който публикувах, е доста минималистичен и трябва да работи. Ако геометрията е екстремна, проверете стойностите, които получавате от вашите матрични класове. Като тест можете (отново) да замените цялата матрица[][] с нула или друга константа. Ако все още не работи, проверете матриците, които използвате като модел и проекция. Намирам за странно, че извиквате glLoadIdentity(), преди да извикате glMatrixMode. - person Knowleech; 16.06.2015
comment
... и, между другото, TRIANGLE_STRIP е това, което искате да използвате. QUAD или POLYGON са остарели в съвременните графики и е добре да ги избягвате. За вашето разбиране, еквивалентът на пиксел не е четириъгълникът (или триъгълникът), а върхът. Триъгълниците уточняват връзките, напр. структурата, върху която да се интерполира. - person Knowleech; 16.06.2015
comment
Благодаря за цялата ви помощ, момчета. Най-накрая мога да го направя. Не можех да го направя без вашата помощ. Благодаря много... - person user3483948; 17.06.2015

За другите момчета, които търсят решение в това: Уверете се, че вашият параметър zNear на glFrustum е достатъчно далеч, за да видите нещата. Моите бяха за затваряне и като го увеличих проблема се реши.

person user3483948    schedule 12.08.2015