powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / [OpenGL] установка камеры.
3 сообщений из 3, страница 1 из 1
[OpenGL] установка камеры.
    #35628212
Дональдак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Подскажите пожалуйста!

Есть программа, которая рисует прямоугольник (сетку). Результат - вид сверху.
Как мне добиться, чтобы результат был похож на тот, что в прикрепленном файле, желательно более развернут к наблюдателю.
Пробывал изменять параметры glulookat, поворачивать картинку glrotated, но ничего не вышло.
Уже совсем запутался! ((

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
#include "stdafx.h"
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>

#define LENGTH  100 
#define WIDTH  50 
#define POINTS_X  50 
#define POINTS_Y  25 

void init(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(- 1 *LENGTH, LENGTH, - 1 *WIDTH, WIDTH, - 1 ,  1 );
	//gluLookAt(0, 0, 1, 0, 0, 0, 0, 1, 0);
	//glRotated(-5, 0, 1, 0);
	//glRotated(-5, 1, 0, 0);
	glMatrixMode(GL_MODELVIEW);
}

void reshape(int w, int h)
{
	glViewport( 0 ,  0 , (GLsizei)w, (GLsizei)h);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

void keyboard(unsigned char key, int x, int y)
{ 
	if(key== 27 ) exit( 0 );
}

void Start_Drawing()
{
	glLineWidth( 1 );
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	glColor3d( 0 ,  1 ,  1 );

	for(float x=-(float)LENGTH/ 2 ; x<(float)LENGTH/ 2 ; x+=(float)LENGTH/POINTS_X)
		for(float y=-(float)WIDTH/ 2 ; y<(float)WIDTH/ 2 ; y+=(float)WIDTH/POINTS_Y)
		{
			glBegin(GL_POLYGON);  
			glVertex3d(x, y,  0 );
			glVertex3d(x+(float)LENGTH/POINTS_X, y,  0 );
			glVertex3d(x+(float)LENGTH/POINTS_X, y+(float)WIDTH/POINTS_Y,  0 );
			glVertex3d(x, y+(float)WIDTH/POINTS_Y,  0 );
			glEnd();
		}

	glFlush();
}

void display(void)
{
	Start_Drawing();
}

int _tmain(int argc, _TCHAR* argv[])
{
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowPosition( 10 , 10 );
	glutInitWindowSize( 840 ,  840 );
	glutCreateWindow("VM");
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutKeyboardFunc(keyboard);
	glutMainLoop();
	return  0 ;
}
...
Рейтинг: 0 / 0
[OpenGL] установка камеры.
    #35630955
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Дональдак:

Дональдак
Код: plaintext
1.
2.
3.
4.
#define LENGTH  100 
#define WIDTH  50 
#define POINTS_X  50 
#define POINTS_Y  25 

Раз Вы пишите на C++ (судя по объявлениям переменных в конструкциях for), то для определения констант лучше использовать не макросы препроцессора, а конструкции языка C++:
Код: plaintext
1.
2.
3.
4.
const int LENGTH =  100 ;
const int WIDTH =  50 ;
const int POINTS_X =  50 ;
const int POINTS_Y =  25 ;

Дональдак
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void init(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(- 1 *LENGTH, LENGTH, - 1 *WIDTH, WIDTH, - 1 ,  1 );
	//gluLookAt(0, 0, 1, 0, 0, 0, 0, 1, 0);
	//glRotated(-5, 0, 1, 0);
	//glRotated(-5, 1, 0, 0);
	glMatrixMode(GL_MODELVIEW);
}

Функция init вызывается один раз в начале программы, здесь не надо звать glClear. glClear надо звать в функции рисования.

Преобразование координат для проецирования (GL_PROJECTION-матрицу) тоже лучше устанавливать в другом месте.

Дональдак
Код: plaintext
1.
2.
3.
4.
5.
void reshape(int w, int h)
{
	glViewport( 0 ,  0 , (GLsizei)w, (GLsizei)h);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

Опять же, здесь не надо звать glClear. Зато здесь самое подходящее место для установки преобразования координат для проецирования (GL_PROJECTION-матрицы):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
void reshape(int w, int h)
{
  glViewport( 0 ,  0 , w, h);

  // установить преобразование координат для проецирования
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  const float MaxSize =  120 ;
  const float HalfMaxSize =  0 . 5  * MaxSize;
  if (w >= h)
  {
    float f = static_cast<float>(h) / static_cast<float>(w);
    glOrtho(-HalfMaxSize, HalfMaxSize, -HalfMaxSize * f, HalfMaxSize * f,  0 ,  500 );
  }
  else
  {
    float f = static_cast<float>(w) / static_cast<float>(h);
    glOrtho(-HalfMaxSize * f, HalfMaxSize * f, -HalfMaxSize, HalfMaxSize,  0 ,  500 );
  }
  glMatrixMode(GL_MODELVIEW);
}

Дональдак
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
void Start_Drawing()
{
	glLineWidth( 1 );
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	glColor3d( 0 ,  1 ,  1 );

	for(float x=-(float)LENGTH/ 2 ; x<(float)LENGTH/ 2 ; x+=(float)LENGTH/POINTS_X)
		for(float y=-(float)WIDTH/ 2 ; y<(float)WIDTH/ 2 ; y+=(float)WIDTH/POINTS_Y)
		{
			glBegin(GL_POLYGON);  
			glVertex3d(x, y,  0 );
			glVertex3d(x+(float)LENGTH/POINTS_X, y,  0 );
			glVertex3d(x+(float)LENGTH/POINTS_X, y+(float)WIDTH/POINTS_Y,  0 );
			glVertex3d(x, y+(float)WIDTH/POINTS_Y,  0 );
			glEnd();
		}

	glFlush();
}

void display(void)
{
	Start_Drawing();
}

Странно Вы рисуете сетку. По-моему, гораздо проще рисовать с помощью линий (режим GL_LINES):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
void display(void)
{
  // а вот здесь как раз имеет смысл звать glClear
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  // задействовать буфер глубины
  glEnable(GL_DEPTH_TEST);

  // установить преобразование координат camera-from-world
  glLoadIdentity();
  gluLookAt(
    /*eyex:*/- 150 , /*eyey:*/- 150 , /*eyez:*/ 150 ,
    /*centerx:*/ 0 , /*centery:*/ 0 , /*centerz:*/ 0 ,
    /*upx:*/ 0 , /*upy:*/ 0 , /*upz:*/ 1 );

  // нарисовать сетку
  const float MinX = - 50 ; // -(float)LENGTH/2
  const float MaxX =  50 ; // (float)LENGTH/2
  const float MinY = - 25 ; // -(float)WIDTH/2
  const float MaxY =  25 ; // (float)WIDTH/2
  const int NumRows =  25 ; // POINTS_Y
  const int NumCols =  50 ; // POINTS_X
  const float CellSizeX = (MaxX - MinX) / NumCols;
  const float CellSizeY = (MaxY - MinY) / NumRows;
  glColor3f( 0 ,  1 ,  1 );
  glBegin(GL_LINES);
  for (int RowSlit =  0 ; RowSlit <= NumRows; RowSlit++)
  {
    float y = MinY + RowSlit * CellSizeY;
    glVertex2f(MinX, y);
    glVertex2f(MaxX, y);
  }
  for (int ColSlit =  0 ; ColSlit <= NumCols; ColSlit++)
  {
    float x = MinX + ColSlit * CellSizeX;
    glVertex2f(x, MinY);
    glVertex2f(x, MaxY);
  }
  glEnd();

  glFlush();
}

Дональдак
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int _tmain(int argc, _TCHAR* argv[])
{
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowPosition( 10 , 10 );
	glutInitWindowSize( 840 ,  840 );
	glutCreateWindow("VM");
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutKeyboardFunc(keyboard);
	glutMainLoop();
	return  0 ;
}

Где вызов glutInit? В самом начале надо звать glutInit:
Код: plaintext
1.
glutInit(&argc, &argv);

Кстати, почему Вы не используете двойную буферизацию? С ней гораздо лучше. Чтобы использовать двойную буферизацию, надо:
* При вызове glutInitDisplayMode указать флаг GLUT_DOUBLE (вместо GLUT_SINGLE).
* Вместо вызова glFlush (который на самом деле здесь не нужен) звать glutSwapBuffers.

P. S. Если будете ещё прикреплять картинки, то очень желательно, чтобы эти картинки были в формате PNG. Этот формат предоставляет беспотерьное сжатие, поэтому PNG-картинки будут занимать меньше места (по сравнению с BMP-картинками). Страница будет грузиться быстрее, трафик снизится.
...
Рейтинг: 0 / 0
[OpenGL] установка камеры.
    #35631527
Дональдак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Вам огромное за такой подробный ответ!
Сейчас все обдумаю, постараюсь реализовать.
Еше раз спасибо!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / [OpenGL] установка камеры.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]