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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2012, 19:27   #1
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию openGl направленный источник света

вопрос следующий - делаю источник света, устанавливаю угол, динамически меняю направление - оно не изменяется в нужном мне направлении, объясняю, вот код (Java, libgdx)

Код:
float[]direct = new float[]{directVector.x,directVector.y,directVector.z};//1f};
float[]pos = new float[]{posVector.x,posVector.y,posVector.z,1f};
gl.glEnable(GL10.GL_LIGHTING);
		
		
gl.glEnable(GL10.GL_LIGHT0);
gl.glEnable(GL10.GL_COLOR_MATERIAL);
	
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_SPOT_CUTOFF,FloatBuffer.wrap(new float[]{angle}));
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, FloatBuffer.wrap(pos));//, 0);
		
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_SPOT_DIRECTION,FloatBuffer.wrap(direct));//,0);
		
		
WallTex.bind();// кубики чтобы видеть, куда направлен источник света (или должен быть направлен
		
gl.glPushMatrix();
gl.glTranslatef(posVector.x,posVector.y,posVector.z);
WallObj.render(GL10.GL_TRIANGLES);
gl.glPopMatrix();
	
gl.glPushMatrix();
gl.glTranslatef(directVector.x,directVector.y,directVector.z);
WallObj.render(GL10.GL_TRIANGLES);
gl.glPopMatrix();
так вот, свет светит из источника света, цель (кубик) вращается вокруг второго кубика (источника света), но свет упрямо светит в одну точку, точнее, он не следует за direct-ом, он светит в какую-то свою сторону, то есть, видимо, вращается не в той плоскости. Вопрос - где я ошибся с направлением, вот картинка:
свет.png
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 05.02.2012, 01:01   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Может я и ошибаюсь, и имя функции поворота в Java отличено от Delphi и С++, но Translate - это перенос начала координат на заданные новые координаты. Иными словами Ты меняешь местоположение, а не направление.А вот glRotated (угол, x,y,z) меняет направление. Используется во внутренней сцене:
Код:
 glPopMatrix;glRotated(54,1,1,0);glPushMatrix;
Приведу кусок кода на Delphi, где куб крутится вокруг тора, при этом одна сторона куба освещается :
Код:
 
const //                                         х     у    z    точечный ист-ник  света
  position : Array [0..3] of GLFloat = (0.0, 0.0, 0.0, 1.0);
...
 glPushMatrix;     
    glRotated (spin, 1.0, 0.0, 0.0);// spin - угол поворота. Крутим вокруг ОХ
    glLightfv (GL_LIGHT0, GL_POSITION, @position);

    glTranslated (0.0, 0.0, 1.5);// перенесли начало координат
    glutSolidCube (0.5);// цель (кубик)
  glPopMatrix;

  glDisable (GL_LIGHTING);
  glutSolidTorus (0.1, 0.15, 8, 15); // источник (Тор)
  glEnable (GL_LIGHTING);
...
По таймеру увеличивается spin, внутренняя сцена поворачивается, устанавливаем позицию источника точечного света, переносим начало координат, рисуем кубик, и возвращаемся во внешнюю сцену.
Ну и исходник с exe (на случай, если Delphi не установлен).
p.s. Если не разберёшься , то комменты в своём коде "нарисуй" , чтобы разобраться , что по чём. Тогда я Тебе накидаю рабочий код. Просто в С-образных языках с OpenGL ещё не разбирался.
Изображения
Тип файла: png Безымянный.png (17.2 Кб, 91 просмотров)
Вложения
Тип файла: rar Ex01.rar (178.4 Кб, 18 просмотров)
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 05.02.2012 в 09:19.
Rin вне форума Ответить с цитированием
Старый 05.02.2012, 16:05   #3
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

благодарю за ответ, итак

Код:
float[]direct = new float[]{directVector.x,directVector.y,directVector.z};//1f};
float[]pos = new float[]{posVector.x,posVector.y,posVector.z,1f};
gl.glEnable(GL10.GL_LIGHTING);//активируем свет
		
gl.glEnable(GL10.GL_LIGHT0);//активируем нулевой свет
gl.glEnable(GL10.GL_COLOR_MATERIAL);//включаем освещение материала (???)

//задаем угол освещения (	
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_SPOT_CUTOFF,FloatBuffer.wrap(new float[]{angle}));

//задаем позицию света pos - float-массив из 4х чисел
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, FloatBuffer.wrap(pos));//, 0);
		
//задаем направление света, direct - float-массив из 3х чисел
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_SPOT_DIRECTION,FloatBuffer.wrap(direct));//,0);
		
//дальнейший код про кубики никоим образом не влияет на свет, был добавлен позже
простите, я не нашел в libgdx такой функции, только glRotatef(float,float,float,float); , использую GL10
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 06.02.2012, 04:48   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Всегда пожалуйста =).
glRotated отличается от glRotatef только тем, что в 1-ом случае используются переменные double, а во 2-ом переменные float (ну это в общем то видно из названия функции, где на конце стоят "d" и "f").
Код:
gl.glEnable(GL10.GL_COLOR_MATERIAL);
Если этого не написать, то функцию цвета - glColor3f() -, использовать бесполезно при включённом свете - glEnable(GL_LIGTHING). И тогда, чтобы задать цвет вашему объекту придётся использовать рассеянный цвет (GL_AMBIENT), диффузный цвет (GL_DIFFUSE), зеркальный цвет (GL_SPECULAR), излучаемый цвет (GL_EMISSION), степень зеркального отражения (GL_ SHININESS). Для каждого задавать массив из 4 параметров :R, G, B и интенсивность\ насыщенность цвета. Эти тонкости нужны для профессионалов, а чтобы сдать лабораторную(курсовую) можно обойтись и GL_COLOR_MATERIAL.
А теперь от теории к практике:
Код:
float[]direct = new float[]{directVector.x,directVector.y,directVector.z};//1f};
float[]pos = new float[]{posVector.x,posVector.y,posVector.z,1f};

gl.glEnable(GL10.GL_LIGHTING);
		
		
gl.glEnable(GL10.GL_LIGHT0);
gl.glEnable(GL10.GL_COLOR_MATERIAL);

				
// рисуем источник		
gl.glPushMatrix();
gl.glTranslatef(posVector.x,posVector.y,posVector.z);
WallObj.render(GL10.GL_TRIANGLES);
gl.glPopMatrix();


// рисуем цель	
gl.glPushMatrix();

// поворачиваем сцену
gl.glRotatef(new float[]{angle_rotate},0,1,0);

//задаем позицию света pos - float-массив из 4х чисел
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, FloatBuffer.wrap(pos));//, 0);

					
//задаем угол освещения
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_SPOT_CUTOFF,FloatBuffer.wrap(new float[]{angle}));

//задаем направление света, direct - float-массив из 3х чисел		
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_SPOT_DIRECTION,FloatBuffer.wrap(direct));//,0);

gl.glTranslatef(directVector.x,directVector.y,directVector.z);
WallObj.render(GL10.GL_TRIANGLES);
gl.glPopMatrix();
Кажется так.
Цитата:
простите, я не нашел в libgdx такой функции, только glRotatef(float,float,float,float); , использую GL10
Приятно общаться с вежливым и культурным человеком.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 06.02.2012 в 08:37. Причина: добавление кода в коде)) ну и ещё кое-что.
Rin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение со скоростью света и быстрее скорости света - Сверхсветовое движение Alar Свободное общение 354 13.11.2011 21:32
Направленный источник света Rin Мультимедиа в Delphi 2 31.05.2010 21:39
Найти источник света в 3d =Student= Мультимедиа в Delphi 0 17.05.2010 08:25
Фиксация источника света в OpenGL Rin Мультимедиа в Delphi 5 29.03.2010 22:44
Конец Света! Linker88 Свободное общение 82 15.06.2009 18:34