Я не уверен, как описать эту проблему, поэтому, пожалуйста, извините страшное название. У меня есть простая модель (на самом деле это плитка, но я сделал ее кубом, чтобы лучше проиллюстрировать проблему), которая занимает 2 единицы, широкая и глубокая. Чтобы нарисовать непрерывное поле из них, я просто увеличиваю X и Z на 2 соответственно, и они все хорошо выглядят рядом друг с другом. Если я хочу создать шаг вверх, так что у моего плоского поля будет новый уровень, я добавлю 2 к значению Y для сегмента поля, ожидая, что нижняя часть верхнего уровня будет тогда идеально совмещаться с верхней частью нижнего уровня ,opengl y-axis не масштабируется с помощью x или z
Что происходит на самом деле, верхний уровень обеспечивает справедливое расстояние над нижним уровнем. Зачем? Что может вызвать это? Я провел несколько тестов и обнаружил, что мне нужно будет увеличивать Y на число где-то между 0,6 и 0,7, чтобы дно правильно выравнивалось с вершиной.
Я думал, что это был вид, но я думаю, что все в порядке. Модели не выглядят извращенными. Кто-нибудь сталкивался с чем-то подобным раньше?
См. Прикрепленное изображение для примера того, о чем я говорю. Красная линия иллюстрирует это странное разделение верхнего и нижнего слоев.
Рендер функция
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();
}
UPDATE: Это как-то связано с кодом, который я использую для вращения. Если я выберу это, кубы правильно выровнятся ... –