- 1,015
- 9
- 102
Захотел сделать метод, который бы рисовал 3D линии с заданной толщиной от каких-либо координат к другим координатам. Сделал метод, который рисует полигон этой линии:
Потом написал метод, который бы рисовал полностью линию, которая идет от from к to:
Как видно, я рисую линию только вдоль оси X, и поворачиваю её в зависимости от её угла наклона к конечной точке. По осям XZY, XY, X, Y она рисуется нормально, но если мы будет рисовать вдоль оси YZ, то поворот по Y её не поднимет, а повернет её куда-то в сторону. Вот скрины:
Когда дебажил понял, что градусы при повороте просчитываются нормально, и ость тоже. Т.е. -
Если кто хорошо разбирается в openGL, то помогите, а то я уже второй день не понимаю, почему так происходит
Код:
private void drawPolygon(Tessellator tes, double length, float size, EnumFacing facing){
VertexBuffer buf = tes.getBuffer();
int angle = facing == EnumFacing.DOWN ? 180 : facing == EnumFacing.EAST ? 90 : facing == EnumFacing.WEST ? 270 : 0; // Угол поворота, в зависимости от того, какую сторону линии мы рисуем
GL11.glPushMatrix();
GL11.glTranslatef(0, -size/2, size/2);
GL11.glRotated(angle, 1, 0, 0);
GL11.glTranslatef(0, size/2, -size/2);
buf.begin(GL11.GL_POLYGON, DefaultVertexFormats.POSITION);
buf.pos(0, 0, 0).endVertex();
buf.pos(0, 0, size).endVertex();
buf.pos(length, 0, size).endVertex();
buf.pos(length, 0, 0).endVertex();
tes.draw();
GL11.glPopMatrix();
}
Потом написал метод, который бы рисовал полностью линию, которая идет от from к to:
Код:
private void drawLine(Tessellator tes, Vec3d from, Vec3d to, float size){
VertexBuffer buf = tes.getBuffer();
double length = to.distanceTo(from);
Vec3d vec = to.subtract(from).normalize(); // Находим единичный вектор нашей линии для её поворота
GL11.glPushMatrix();
GL11.glTranslated(from.xCoord, from.yCoord, from.zCoord);
GL11.glRotated(vec.xCoord > 0 ? -Math.toDegrees(Math.asin(vec.zCoord)) : Math.toDegrees(Math.asin(vec.zCoord)-135), 0, 1, 0); // Поворачиваем линию по горизонту
GL11.glRotated(Math.toDegrees(Math.asin(vec.yCoord)) * (vec.xCoord < 0 ? -1 : 1), vec.zCoord, 0, vec.xCoord); // Поднимаем или опускаем линию, в зависимости от Y
drawPolygon(tes, length, size, EnumFacing.UP);
drawPolygon(tes, length, size, EnumFacing.EAST);
drawPolygon(tes, length, size, EnumFacing.DOWN);
drawPolygon(tes, length, size, EnumFacing.WEST);
GL11.glPopMatrix();
}
Как видно, я рисую линию только вдоль оси X, и поворачиваю её в зависимости от её угла наклона к конечной точке. По осям XZY, XY, X, Y она рисуется нормально, но если мы будет рисовать вдоль оси YZ, то поворот по Y её не поднимет, а повернет её куда-то в сторону. Вот скрины:
Вот поворот по XYZ (Тут всё нормально):
А это поворот по YZ (Линия сдвинулась не по YZ, а по XZ):
Код:
drawLine(tes, new Vec3d(x, y, z), new Vec3d(x+1, y+1, z+1), 0.1f);
А это поворот по YZ (Линия сдвинулась не по YZ, а по XZ):
Код:
drawLine(tes, new Vec3d(x, y, z), new Vec3d(x, y+1, z+1), 0.1f);
Когда дебажил понял, что градусы при повороте просчитываются нормально, и ость тоже. Т.е. -
Код:
GL11.glRotated(Math.toDegrees(Math.asin(vec.yCoord)) * (vec.xCoord < 0 ? -1 : 1), vec.zCoord, 0, vec.xCoord); // При повороте по YZ тут angle будет равен 45, а ось по x = 0.7f, по z = 0
Если кто хорошо разбирается в openGL, то помогите, а то я уже второй день не понимаю, почему так происходит