Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 21.04.2009, 13:52   #1
PitNN
 
Регистрация: 16.04.2009
Сообщений: 4
По умолчанию Помогите с построением тени в OpenGL

Добрый день. Проблема собственно в следующем. Нужно построить сцену с площадкой и кубиком на ней, который бы отбрасывал тень на площадку. Вся загвоздка в том, что все это дело нужно реализовать в ортогональной проекции. Нашел готовый пример для перспективной прекции. Все шуршит и все работает (объекты рисуются с тенями). При переводе всего этого дела на ортогональную проекцию тень пропала Хотя все остальное так же отрисовывается и перемещается. Помогите плиз, курсовая горит.
PitNN вне форума
Старый 21.04.2009, 15:23   #2
PitNN
 
Регистрация: 16.04.2009
Сообщений: 4
По умолчанию

Прикладываю имеющийся проект. Он уже в ортогональной проекции, но без тени. Возможно есть какой-то нюанс при переходе от одного типа проекции к дугой.
Вложения
Тип файла: rar Lesson27.rar (9.9 Кб, 91 просмотров)
PitNN вне форума
Старый 22.04.2009, 12:54   #3
PitNN
 
Регистрация: 16.04.2009
Сообщений: 4
По умолчанию

Путем проб и ошибок был обнаружен следующий момент.
Вот код прорисовки тени:
Код:
void  CastShadow(glObject *o, float *lp){
	unsigned int	i, j, k, jj;
	unsigned int	p1, p2;
	sPoint			v1, v2;
	float			side;

	//set visual parameter
	for (i=0;i<o->nPlanes;i++){
		// chech to see if light is in front or behind the plane (face plane)
		side =	o->planes[i].PlaneEq.a*lp[0]+
				o->planes[i].PlaneEq.b*lp[1]+
				o->planes[i].PlaneEq.c*lp[2]+
				o->planes[i].PlaneEq.d*lp[3];
		if (side >0) o->planes[i].visible = TRUE;
				else o->planes[i].visible = FALSE;
	}

 	glDisable(GL_LIGHTING);
	glDepthMask(GL_FALSE);
	glDepthFunc(GL_LEQUAL);

	glEnable(GL_STENCIL_TEST);
	//glColorMask(0, 0, 0, 0);   // <-- Если раскоментировать то все плохо
	glStencilFunc(GL_ALWAYS, 1, 0xffffffff);

	// first pass, stencil operation decreases stencil value
	glFrontFace(GL_CCW);
	glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
	for (i=0; i<o->nPlanes;i++){
		if (o->planes[i].visible)
			for (j=0;j<3;j++){
				k = o->planes[i].neigh[j];
				if ((!k) || (!o->planes[k-1].visible)){
					// here we have an edge, we must draw a polygon
					p1 = o->planes[i].p[j];
					jj = (j+1)%3;
					p2 = o->planes[i].p[jj];

					//calculate the length of the vector
					v1.x = (o->points[p1].x - lp[0])*100;
					v1.y = (o->points[p1].y - lp[1])*100;
					v1.z = (o->points[p1].z - lp[2])*100;

					v2.x = (o->points[p2].x - lp[0])*100;
					v2.y = (o->points[p2].y - lp[1])*100;
					v2.z = (o->points[p2].z - lp[2])*100;
					
					//draw the polygon
					glBegin(GL_TRIANGLE_STRIP);
						glVertex3f(o->points[p1].x,
									o->points[p1].y,
									o->points[p1].z);
						glVertex3f(o->points[p1].x + v1.x,
									o->points[p1].y + v1.y,
									o->points[p1].z + v1.z);

						glVertex3f(o->points[p2].x,
									o->points[p2].y,
									o->points[p2].z);
						glVertex3f(o->points[p2].x + v2.x,
									o->points[p2].y + v2.y,
									o->points[p2].z + v2.z);
					glEnd();
				}
			}
	}

	// second pass, stencil operation increases stencil value
	glFrontFace(GL_CW);
	glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
	for (i=0; i<o->nPlanes;i++){
		if (o->planes[i].visible)
			for (j=0;j<3;j++){
				k = o->planes[i].neigh[j];
				if ((!k) || (!o->planes[k-1].visible)){
					// here we have an edge, we must draw a polygon
					p1 = o->planes[i].p[j];
					jj = (j+1)%3;
					p2 = o->planes[i].p[jj];

					//calculate the length of the vector
					v1.x = (o->points[p1].x - lp[0])*100;
					v1.y = (o->points[p1].y - lp[1])*100;
					v1.z = (o->points[p1].z - lp[2])*100;

					v2.x = (o->points[p2].x - lp[0])*100;
					v2.y = (o->points[p2].y - lp[1])*100;
					v2.z = (o->points[p2].z - lp[2])*100;
					
					//draw the polygon
					glBegin(GL_TRIANGLE_STRIP);
						glVertex3f(o->points[p1].x,
									o->points[p1].y,
									o->points[p1].z);
						glVertex3f(o->points[p1].x + v1.x,
									o->points[p1].y + v1.y,
									o->points[p1].z + v1.z);

						glVertex3f(o->points[p2].x,
									o->points[p2].y,
									o->points[p2].z);
						glVertex3f(o->points[p2].x + v2.x,
									o->points[p2].y + v2.y,
									o->points[p2].z + v2.z);
					glEnd();
				}
			}
	}

	glFrontFace(GL_CCW);
	glColorMask(1, 1, 1, 1);

	//draw a shadowing rectangle covering the entire screen
	glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff);
	glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
	glPushMatrix();
	glLoadIdentity();
	glBegin(GL_TRIANGLE_STRIP);
		/*glVertex3f(-0.1f, 0.1f,-0.10f);
		glVertex3f(-0.1f,-0.1f,-0.10f);
		glVertex3f( 0.1f, 0.1f,-0.10f);
		glVertex3f( 0.1f,-0.1f,-0.10f);*/
		glVertex3f(-15.1f, 10.1f,-40.10f);
		glVertex3f(-15.1f,-10.1f,-40.10f);
		glVertex3f( 15.1f, 10.1f,-40.10f);
		glVertex3f( 15.1f,-10.1f,-40.10f);
	glEnd();
	glPopMatrix();
	glDisable(GL_BLEND);

	glDepthFunc(GL_LEQUAL);
	glDepthMask(GL_TRUE);
	glEnable(GL_LIGHTING);
	glDisable(GL_STENCIL_TEST);
	glShadeModel(GL_SMOOTH);
}
Данный кусок взят из примера NEHE урок 27. Если оставить закоментированной строку glColorMask(0, 0, 0, 0); то идет отрисовка усеченной пирамиды от объекта в бесконечность. Если же эту строку раскоментировать, то эффект получается такой же как если бы процедура рисования тени совсем не вызывалась. Т.е. рисуется объект и сцена и все.
Как влияет вызов процедуры glColorMask(0, 0, 0, 0)? Подскажите пожалуйста
PitNN вне форума
Старый 23.04.2009, 17:01   #4
PitNN
 
Регистрация: 16.04.2009
Сообщений: 4
По умолчанию

Все, разобрался. Тема закрыта
PitNN вне форума
Старый 08.04.2010, 14:05   #5
AK BULLETS
Пользователь
 
Регистрация: 18.03.2010
Сообщений: 88
По умолчанию

прикольно...))
AK BULLETS вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с построением графика xaero93 Помощь студентам 2 28.02.2009 21:30
Помогите пожалуйста с построением дерева RussoTuristo Помощь студентам 1 17.10.2008 14:36
помогите с OpenGL shepelin Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 10.07.2008 02:19
Тени в OpenGL - оцените, пожалуйста мой метод... WittySpark Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 14.11.2007 17:54