有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java opengl yaxis不使用x或z缩放

我甚至不知道如何描述这个问题,所以请原谅这个糟糕的标题。我有一个简单的模型(它实际上是一块瓷砖,但为了更好地说明这个问题,我把它做成了一个立方体),高、宽、深各2个单位。为了画出一个连续的区域,我只需适当地将X和Z增加2,它们彼此相邻地很好地渲染。如果我想创建一个台阶,使我的平面场有一个新的标高,我会在该场段的Y值上加2,期望顶部标高的底部与较低标高的顶部完美对齐

实际情况是,顶层渲染的距离比底层要远。为什么?这是什么原因造成的?我运行了一些测试,发现我必须将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();
}

共 (1) 个答案

  1. # 1 楼答案

    对于旋转代码中的2个第一个翻译有什么特别的想法吗?x和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行,会发生什么?在旋转之后,你仍然要做平移