gpt4 book ai didi

java - opengl y轴不随x或z缩放

转载 作者:行者123 更新时间:2023-12-01 11:57:46 25 4
gpt4 key购买 nike

我不太确定如何描述这个问题,所以请原谅这个糟糕的标题。我有一个简单的模型(它实际上是一个图 block ,但我把它做成了一个立方体以更好地说明问题),高、宽和深均为 2 个单位。为了绘制这些连续的场,我只需将 X 和 Z 相应地增加 2,它们就可以很好地彼此相邻地渲染。如果我想创建一个台阶,以便我的平面字段有一个新的级别,我将字段的一部分的 Y 值添加 2,期望顶部级别的底部将与较低级别的顶部完美对齐。

实际发生的情况是顶层在较低层之上渲染了相当的距离。为什么?什么会导致这种情况呢?我运行了一些测试,发现我必须将 Y 增加 0.6 到 0.7 之间的某个数字,以便底部与顶部正确对齐。

我想也许是视口(viewport)的问题,但我认为没关系。模型看起来没有变形。有人遇到过类似的事情吗?

请参阅附图,了解我正在谈论的内容的示例。红线说明了顶层和底层的这种奇怪的分离。

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();
}

最佳答案

对于轮换代码中的第 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 行会发生什么?旋转后您仍然进行平移。

关于java - opengl y轴不随x或z缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28230005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com