2015-01-30 2 views
0

Я не уверен, как описать эту проблему, поэтому, пожалуйста, извините страшное название. У меня есть простая модель (на самом деле это плитка, но я сделал ее кубом, чтобы лучше проиллюстрировать проблему), которая занимает 2 единицы, широкая и глубокая. Чтобы нарисовать непрерывное поле из них, я просто увеличиваю X и Z на 2 соответственно, и они все хорошо выглядят рядом друг с другом. Если я хочу создать шаг вверх, так что у моего плоского поля будет новый уровень, я добавлю 2 к значению Y для сегмента поля, ожидая, что нижняя часть верхнего уровня будет тогда идеально совмещаться с верхней частью нижнего уровня ,opengl y-axis не масштабируется с помощью x или z

Что происходит на самом деле, верхний уровень обеспечивает справедливое расстояние над нижним уровнем. Зачем? Что может вызвать это? Я провел несколько тестов и обнаружил, что мне нужно будет увеличивать Y на число где-то между 0,6 и 0,7, чтобы дно правильно выравнивалось с вершиной.

Я думал, что это был вид, но я думаю, что все в порядке. Модели не выглядят извращенными. Кто-нибудь сталкивался с чем-то подобным раньше?

См. Прикрепленное изображение для примера того, о чем я говорю. Красная линия иллюстрирует это странное разделение верхнего и нижнего слоев.

Test Image illustrating the problem

Рендер функция

public void draw() throws Exception { 

    float x = 0; 
    double y = 0; 
    float z = 0; 
    int cidx = 0; 
    boolean firstCube = true; 

    glfwSwapBuffers(window); // swap the color buffers 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer 

    //calc rotate camera 
    if (updatecamera == true){ 
     updateCamera(); 
    } 

    glUseProgram(shader.iProgram); 

    //some lighting... 
     Vector4f lp = new Vector4f(lightX, lightY, lightZ,1.0f); 
     //float[] lp = {xa, ya + 100, za - 120,1.0f}; //set light source to same as camera eye for now. 

     shader.setUniform(iLightCam, camera); 
     shader.setUniform(iLightVec, lp); 

    //get picking ray 
    if (worldClicked == true){ 
     pick = makeRay(pick, cursorX, (DISPLAY_HEIGHT - ((DISPLAY_HEIGHT - VP_HEIGHT)/2)) - cursorY); 
    } 


    for(Iterator<Quad> qd = quads.iterator(); qd.hasNext();) { 
     //init cull check 
     frust.cullIn = 0; 
     frust.cullOut = 0; 

     quad = qd.next(); 

     pickthisQuad = false; 

     firstCube = true; //the first cube is used to set the values of the Quad OBB. 

     for(Iterator<Cube> i = quad.cubes.iterator(); i.hasNext();) { 

      cb = i.next(); 
      x = cb.x; 
      z = cb.z; 
      //y = cb.y; 

      //testing odd Y behaviour 
      if (y == 0) { 
       y = lightX; 
      }else{ 
       y = 0; 
      } 

      System.out.println(" y: " + y); 

      //init 
      model.setIdentity(); 

      //ROTATE 
      //set translate 
      vTrans.set(transx + x, (float) (transy + y), transz + z); 
      Matrix4f.translate(vTrans, model1, model);     

      vTrans.set(-(transx + x), (float) (-transy + y), -(transz + z));  
      Matrix4f.translate(vTrans, model, model); 
      Matrix4f.rotate((float) Math.toRadians(rotY), new Vector3f(0,1,0), model, model); 
      vTrans.set((transx + x), (float) (transy + y), (transz + z)); 
      Matrix4f.translate(vTrans, model, model); 

      Matrix4f.mul(model, camera, modelview); 
      shader.setUniform(iModelView, modelview); 

      Matrix3f norm = new Matrix3f(); 
      norm.m00 = modelview.m00; 
      norm.m01 = modelview.m01; 
      norm.m02 = modelview.m02; 
      norm.m10 = modelview.m10; 
      norm.m11 = modelview.m11; 
      norm.m12 = modelview.m12; 
      norm.m20 = modelview.m20; 
      norm.m21 = modelview.m21; 
      norm.m22 = modelview.m22; 

      shader.setUniform(iNorm, norm); 
      shader.setUniform(iProj, projection); 
      shader.setUniform(iCam, camera); 
      shader.setUniform(iModel, model); 

      test_renderFrustumandCrosslines(); 

      manageTextures(cb); 

      render(); 

      cidx++; 

     }//cubes 


     cidx = 0; 

    }//quads 

/** 
* TESTING 
*/ 
    glUseProgram(shaderLine.iProgram); 
    Matrix4f mvp = new Matrix4f(); 
    mvp.setIdentity(); 
    Matrix4f.mul(projection, camera, mvp); 
    shaderLine.setUniform(iMVPLine, mvp); 
    renderLine(); 
    renderCross(); 

    worldClicked = false; 

    glFinish(); 
} 
+0

UPDATE: Это как-то связано с кодом, который я использую для вращения. Если я выберу это, кубы правильно выровнятся ... –

ответ

1

Есть ли какие-либо особые мысли о 2 первых транслирует в коде вращения? Переводы x ans z будут отменять друг друга, но не ось y. Это может быть источником проблемы.

 vTrans.set(transx + x, (float) (transy + y), transz + z); 
     Matrix4f.translate(vTrans, model1, model);     

     vTrans.set(-(transx + x), (float) (-transy + y), -(transz + z));  
     Matrix4f.translate(vTrans, model, model); 

Что произойдет, если вы удалите эти 4 строки? Вы по-прежнему выполняете перевод после поворота.

+0

Да, это источник проблемы. Прошлой ночью я попробовал установить оба значения Y в переводе на 0, и он работал нормально. Я оставил его на этом, но теперь, читая ваше сообщение, я вижу, что символ -tive (-transy ...) находится на неправильной стороне скобки. Это должно быть - (transy + y). –

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