OpenGL: модель не отображается правильно. (Надо исправить нарисовать расстояние?)
Вопрос
Я новичок в OpenGL. Я играю вокруг с Jogl.
У меня есть модель .obj, которую я рисую как многоугольники. Это выглядит нормально, за исключением того, что большинство из них окраивается. Поэтому я думаю, что мне нужно увеличить расстояние розыгрыша.
Я не совсем уверен, как это сделать. Вот мой код рендера:
private void render(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
GLUgl2 glu = new GLUgl2();
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
// Position the camera
glu.gluLookAt(cameraPos.x, cameraPos.y, cameraPos.z, cameraPos.x
+ cameraForward.x, cameraPos.y + cameraForward.y, cameraPos.z
+ cameraForward.z, cameraUp.x, cameraUp.y, cameraUp.z);
// uncommenting out this line will make everything disappear.
// glu.gluPerspective(2, 1, 10, 1000);
// ****** Start of example code ******
gl.glCallList(axes); // Show X, Y, Z axes
gl.glCallList(secondLines);
gl.glCallList(triangle);
gazebo.render(gl);
// ...
Возможно, что моя проблема является чем-то другим. gazebo
имеет тип ObjModel
, класс, который читает и представляет .obj
файлы. Вот его визуализация и построить методы вытягивания списка:
private int drawID = 0;
public ObjModel(String fn, GL2 gl) {
// ...
readFile(fn);
drawID = buildDrawList(gl);
}
public void render(GL2 gl) {
gl.glCallList(drawID);
}
private int buildDrawList(GL2 gl) {
int result = gl.glGenLists(1);
gl.glNewList(result, GL2.GL_COMPILE);
gl.glPushMatrix();
gl.glBegin(GL2.GL_POLYGON);
for (Point3f vert : vertices) {
gl.glVertex3f(vert.x, vert.y, vert.z);
}
gl.glEnd();
gl.glPopMatrix();
gl.glEndList();
return result;
}
private void readFile(String filename) {
try {
BufferedReader input = new BufferedReader(new FileReader(fileName));
try {
String newLine = null;
while ((newLine = input.readLine()) != null) {
int indVn = newLine.indexOf("vn ");
if (indVn != -1) {
readNormal(newLine);
continue;
}
int indV = newLine.indexOf("v ");
if (indV != -1) {
readVertex(newLine);
continue;
}
int indF = newLine.indexOf("f ");
if (indF != -1) {
readPolygon(newLine);
continue;
}
int indVt = newLine.indexOf("vt ");
if (indVt != -1) {
readTexture(newLine);
continue;
}
}
} finally {
input.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
Я могу опубликовать скриншоты, если требуется дополнительная информация.
Любой совет? Спасибо.
Решение
Похоже, ваша модель имеет вершины за пределами плоскости отсечения. Для этого есть несколько решений.
1) масштабируйте свою модель, чтобы все вершины вписались в координаты клипа (используйте glScale()
)
2) Используйте Glupperspection для настройки «камеры», которая имеет более глубокую отсечение плоскости. Хотя вы пробовали это, я подозреваю, что ваши нежелательные результаты, потому что вы не изменяете матрицу проекции при использовании этого вызова. Пытаться:
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 60, 1, 0.1, 1000.0 );
3) Использование glFrustrum()
модифицировать отсечения плоскостей. Это похоже на Glupperspective, но обеспечивает большую гибкость на дорогой из некоторой добавленной сложности.
FYI Вы все еще можете использовать Glupperspection или GLFRULLUM, когда в режиме ModelView Matrix, но имейте в виду, что порядок, с которого вы делаете эти звонки и другие вызовы трансформации матрицы (например, Glscale, Gltranslate, Glrotate).
Другие советы
Попробуйте это вместо этого: Glupperspective (60, 1, 0,1, 1000);