Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.23;
Скачать: CL | DM;

Вниз

Начало тумана   Найти похожие ветки 

 
Кефир87 ©   (2005-09-11 23:58) [0]

Никакие матричные преобразования не влияют на начало тумана, оно почему-то всегда в начале координат. А камера двигается и уплзает в туман. Ничего не видно. Как двигать туман? Ведь не буду же я все переделывать чтоб двигать сцены вокруг нуля 8)
Вот мои потуги:

procedure TCamera.Look;
begin

 if stay_over then
 begin
   pos := targ^;
   pos.y := 60;
   pos.z := pos.z - 0.01;
 end;
 glDisable(GL_FOG);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity;
 gluPerspective(fov, 4/3, 0.1, 10000.0);
 gluLookAt(pos.x, pos.y, pos.z, targ^.x, targ^.y, targ^.z, 0.0, 1.0, 0.0);
 glMatrixMode(GL_MODELVIEW);
 glTranslatef(pos.x, pos.y, pos.z);
 glEnable(GL_FOG);
end;


 
DR0N ©   (2005-09-12 00:13) [1]

Может я чего не допонял, но если задвать туман вот так:
procedure SetFog(Color : Integer; Fog_Start, Fog_End : single); stdcall;
var fogColor : Array [0..3] of GLFloat;
begin
fogColor[0]:=1.0*GetRValue(Color);
fogColor[1]:=1.0*GetGValue(Color);
fogColor[2]:=1.0*GetBValue(Color);
fogColor[3]:=1.0;
glEnable(GL_FOG);
glFogi  (GL_FOG_MODE, GL_LINEAR);
glHint  (GL_FOG_HINT, GL_NICEST);
glFogf  (GL_FOG_START, Fog_Start);
glFogf  (GL_FOG_END, Fog_End);
glFogfv (GL_FOG_COLOR, @fogColor);
end;

То как камеру не ставь он всегда будет как надо =)


 
Кефир87 ©   (2005-09-12 00:15) [2]

А я при создании все параметры задаю. Ну попробую что-то в этом духе сделать...


 
Кефир87 ©   (2005-09-12 00:20) [3]

Не, я наверно всетаки что-то не осознаю в создании эффекта тумана в ОГЛ...
procedure SetFog;
var
 fogColor : Array [0..3] of GLFloat;
begin
 glDisable(GL_FOG);
 fogColor[0]:=0.0;
 fogColor[1]:=0.0;
 fogColor[2]:=0.0;
 fogColor[3]:=0.0;
 glEnable(GL_FOG);
 glFogi  (GL_FOG_MODE, GL_LINEAR);
 glHint  (GL_FOG_HINT, GL_NICEST);
 glFogf  (GL_FOG_START, 1);
 glFogf  (GL_FOG_END, 100);
 glFogfv (GL_FOG_COLOR, @fogColor);
end;

procedure TCamera.Look;
begin

 if stay_over then
 begin
   pos := targ^;
   pos.y := 60;
   pos.z := pos.z - 0.01;
 end;

 glMatrixMode(GL_PROJECTION);
 glLoadIdentity;
 gluPerspective(fov, 4/3, 0.1, 10000.0);
 gluLookAt(pos.x, pos.y, pos.z, targ^.x, targ^.y, targ^.z, 0.0, 1.0, 0.0);
 SetFog;
end;


Тоже что и было...


 
ViK ©   (2005-09-12 00:41) [4]

Попробуй так

glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(fov, 4/3, 0.1, 10000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;

gluLookAt(pos.x, pos.y, pos.z, targ^.x, targ^.y, targ^.z, 0.0, 1.0, 0.0);
SetFog;

Может поможет.
А вообще на сколько я понимаю проекционную матрицу надо менять только при запуске программы (или при изменении размеров окна).


 
DR0N ©   (2005-09-12 07:46) [5]

2ViK Вообще, ты похоже прав =)


 
Кефир87 ©   (2005-09-12 22:01) [6]

> glMatrixMode(GL_MODELVIEW);
> glLoadIdentity;
> gluLookAt(pos.x, pos.y, pos.z, targ^.x, targ^.y, targ^.z, 0.0, 1.0, 0.0);

gluLookAt меняет видовую матрицу (GL_PROJECTION)!
А менять ее надо, например чтоб текст вывести... Хотя конечно можно использовать glPushMatrix, glPopMatrix или списки...
Ничего у меня не выходит 8(


 
XProger ©   (2005-09-12 22:16) [7]

Тебе походу нужно смотреть в сторону Volumetric Fog.

P.S.
Никаких водосодержащих частиц в OGL туман не содержит, это всего-навсего эффект применяющийся при растеризации примитива...


 
Кефир87 ©   (2005-09-13 12:37) [8]

> Volumetric Fog.
Погуглил эту тему. Да это конечно приемлимо... Но я всетаки думаю что обычный туман можно как-то крутить по идеи...
Вот как в твоем XEngine например туман сделан?


 
A22 ©   (2005-09-13 12:54) [9]

Ты все же что-то задаешь не атк - тумна должен арссчитыватьс яоп расстоянию от камеры. поищи примеры что ли в и-нете..
а на крайний случай - шейдер вершинный тебя спасет :)


 
XProger ©   (2005-09-13 13:54) [10]

Кефир87, обычно :) http://xproger.mirg.ru/files/src/XEngine.rar


 
Кефир87 ©   (2005-09-13 21:49) [11]

Ну ничего нового в тумане я там не увидил... И сцена не крутится вокруг нуля... Так что-же у меня не получается-то?!


 
Кефир87 ©   (2005-11-17 21:19) [12]

Все еще не получается... Неужели у меня такие руки кривые?! 8) А от освещения туман не зависит?


 
XProger ©   (2005-11-18 01:34) [13]

Кефир87, Краснов!


 
Darthman ©   (2005-11-18 10:31) [14]

//glTranslatef(pos.x, pos.y, pos.z);
//glEnable(GL_FOG);

а нафига ты включаешь фог после переноса координат, можно полюбопытствовать?


 
Кефир87 ©   (2005-11-18 18:25) [15]

Дарт, это от отцаяния! Да и вообще у меня что-то все сглючило. Теперь еще и gluOrtho2D, glOrtho эффекта не дают, не пойму в чем дело... Ахренеть... На геймдеве тоже помочь с туманом не могут... ы


 
XProger ©   (2005-11-18 19:42) [16]

Кефир87, Краснов!


 
Кефир87 ©   (2005-11-18 21:15) [17]

Да читал я этого Краснова 8) У него очень мало про туман написано, да и ничего нового я от туда не узнал. Все же элементарно. Все сначала устанавливается, а потом... все само делается. Так вот у меня не делается 8(. А с орто оказалось я просто ступил 8) Включин CullFace а нормали не указал 8)


 
XProger ©   (2005-11-18 22:49) [18]

Кефир87, Red Book!


 
Кефир87 ©   (2005-11-19 01:07) [19]

Ну сколько мне перечитывать одно и то же 8)
Ткни мне пальцем в том месте где хоть что-то сказано про то, что делать если камера двигается по сцене, про матрици, про их влияние на свойства тумана... ну и т.д..


Туман
Туман является самым простым в использовании спецэффектом, предназначенным для передачи глубины пространства. Он позволяет имитировать атмосферные эффекты дымки и собственно тумана.
При его использовании объекты сцены перестают быть чересчур яркими и становятся более реалистичными, естественными для восприятия.
Посмотрим на готовом примере, как работать в OpenGL с этим эффектом.

Рис. 4.41. Пример на использование тумана

Рис. 4.41 демонстрирует работу проекта из подкаталога Ех67: пять чайников, располагающихся от наблюдателя на различном удалении, атмосфера наполнена дымом.
Цвет дыма в примере задается серым, что является обычным значением при использовании тумана:

fogColor : array[0..3] of GLfloat = (0.5, 0.5, 0.5, 1.0);

При инициализации задаем параметры дымки:

glEnable(GL_FOG); // включаем режим тумана
fogMode := GL_EXP; // переменная, хранящая режим тумана
glFogi(GL_FOG_MODE, fogMode); // задаем закон смешения тумана
glFogfv(GL_FOG_COLOR, fogColor); // цвет дымки
glFogf(GL_FOG_DENSITY, 0.35); // плотность тумана
glHint(GL_FOG_HINT, GL_DONT_CARE);// предпочтений к работе тумана нет

Здесь при инициализации закон "затухания" тумана задается наиболее подходящим для обычных задач значением - GL_EXP, помимо этой константы могут использоваться еще GL_LINEAR и GL_EXP2 (в файле справки приведены соответствующие формулы, по которым происходит потеря цвета).
Приложение имеет всплывающее меню, позволяющее по выбору пользователя задавать различные законы затухания тумана. Обратите внимание, что для линейного закона задаются расстояния до ближней и дальней плоскостей отсечения, в пределах которых туман затухает по линейному закону, более удаленные предметы растворяются в дыму:

procedure TfrmGL.SelectFog(mode: GLint); // выбор режимов тумана begin
case mode of 1 : begin
glFogf(GL_FOG_START, 1.0); // ближняя плоскость для линейного
// затухания
glFogf(GL_FOG_END, 5.0); // дальняя плоскость для линейного
// затухания
glFogi(GL_FOG_MODE, GL_LINEAR); // линейный закон
InvalidateRect(Handle, nil, False);
end;
2 : begin
glFogi(GL_FOG_MODE, GL_EXP2);
InvalidateRect(Handle, nil, False);
end;
3 : begin
glFogi(GL_FOG_MODE, GL_EXP); InvalidateRect(Handle, nil, False); end;
0 : close;
end;
end;

Приведу еще один несложный пример, проект из подкаталога Ех68, иллюстрирующий, как туман можно использовать для передачи глубины пространства (рис. 4.42).

Рис. 4.42. Обычно эффект дымки используется для передачи глубины пространства

Пример действительно простой: в легкой дымке рисуется правильный многогранник. В таких картинках наблюдатель обычно путается с определением того, какие ребра фигуры более удалены, при использовании же дымки никакой неопределенности не возникает. Обратите внимание, что в этом примере мы снова встречаемся с функцией glHint; пожелание к системе OpenGL состоит в том, чтобы туман эмулировался с наилучшим качеством:

Procedure myinit;
const
fogColor : Array [0..3] of GLFloat = (0.0, 0.0, 0.0, 1.0); // цвет тумана
begin
glEnable(GL_FOG); // включаем туман
glFogi(GL_FOG_MODE, GL_LINEAR); // линейный закон распространения
glHint (GL_FOG_HINT, GL_NICEST); // пожелания к передаче тумана
glFogf (GL_FOG_START, 3.0); // передняя плоскость тумана
glFogf (GL_FOG_END, 5.0); // задняя плоскость тумана
glFogfv (GL_FOG_COLOR, @fogColor); // задаем цвет тумана
glClearColor(0.0, 0.0, 0.0, 1.0);
glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
end;


 
XProger ©   (2005-11-19 05:31) [20]

Кефир87, а причём тут матрицы? Ещё раз прочитай, как работает туман в OpenGL...


 
Кефир87 ©   (2005-11-19 21:25) [21]

XProger, оказывается причем 8) Ошибка оказалась очень простой 8) Просто я дурак 8)
http://www.gamedev.ru/forum/?group=2&topic=1494



Страницы: 1 вся ветка

Текущий архив: 2006.07.23;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.037 c
15-1151396372
Dok
2006-06-27 12:19
2006.07.23
Кто как дебажит юникод?


15-1150952995
Ega23
2006-06-22 09:09
2006.07.23
С Днём рождения! 22 июня


2-1151815487
Sco
2006-07-02 08:44
2006.07.23
Меню на раб столе


2-1151827055
PSPF2003
2006-07-02 11:57
2006.07.23
Тормозим :)


2-1151158424
C@N
2006-06-24 18:13
2006.07.23
Русские программы на американском компе!!!