Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

GLScene: Тени от объектов и мышь.   Найти похожие ветки 

 
kas-t   (2004-06-08 00:09) [0]

Пишу игрушку на GLScene и столкнулся с такой проблемой: Если кликать мышкой в падающею тень от объекта то берется информация об объекте, от которого падает тень. И проблема по большей части заключается в том, что тени зачастую перекрывают необходимые объекты для выбора мышкой.

К сожалению, игрушка логическая, и от использования мыши никак не отказаться. Проще отказаться от теней, но может, есть решение этой проблемы?

Думал, может можно создать какие то невидимые объекты, но такие что если, наведя на него мышь и кликнуть по такому объекту, получается его «хендел» а не того объекта, который под ним. Думаю достаточно понятно выразился :). Может, есть, какие мысли по этому поводу?


 
КиТаЯц ©   (2004-06-08 08:21) [1]

2 kas-t   (08.06.04 00:09)
Выразился понятно. :) Не разу не сталкивался. Аж интересно стало. Исходник нельзя глянуть (кусочек хотя-бы)?


 
kerby ©   (2004-06-08 11:31) [2]

смотря как ты делаешь тени


 
kas-t   (2004-06-08 13:04) [3]

to kerby: Пробовал делать через ShadowVolume, дык, там вообще ничего не получилось, потому что при клике на проекцию тени попадается черти что, а как раз когда строятся тени, вся сцена получается в этих проекциях. Остается только вариант с PlaneShadow. Но там вот тень является ссылкой на объект, от которого она падает. Чем бы можно перекрыть тени, так что бы по ним нельзя было кликнуть? Да и вообще есть такая мысль перекрыть все необходимые для выбора части сцены, какими ни будь невидимыми объектами, что бы при клике на них выбирались они. А с ними уже ассоциировать действия. Но вот как создать такие объекты (можно ли вообще?) мне в голову не приходит :(.

to КиТаЯц: какой тебе именно кусочек кода хочется глянуть? Выбор объекта делаю так:


var
 NowPick: TGLCustomSceneObject;
.....
NowPick:=(GLScene.Buffer.GetPickedObject(x, y) as TGLCustomSceneObject);


 
kerby ©   (2004-06-08 13:44) [4]

как насчет Zshadows???


 
КиТаЯц ©   (2004-06-08 14:05) [5]

2 kas-t   (08.06.04 13:04) [3]
Попробовал... чета непонял...

> проблема по большей части заключается в том, что тени зачастую
> перекрывают необходимые объекты для выбора мышкой

У меня в сцене:
1. свет
2. актер (тринити)
3. GLShadowPlane типа пол (на нем тень от актера)
4. GLSphere которая должна быть в области тени.
GLShadowPlane.ShadowingObject:= актер
т.е на сфере тень НЕ отображается. Клик по сфере =
procedure TMainForm.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
NowPick:=(GLSceneViewer.Buffer.GetPickedObject(x, y) as TGLCustomSceneObject);
caption:= NowPick.Name; // имя компонента
end;

Клик по сфере возвращает "GLSphere"; // caption
Клик по тени актера возвращает "GLShadowPlane";
а как

> берется информация об объекте, от которого падает тень

????


 
kas-t   (2004-06-09 03:31) [6]

to kerby: Больно тормозные эти Zshadows.

to КиТаЯц: Странно, только что поробывал у себя в игре с тенями сделать тоже, че попало получается. Все равно берется не то, что надо. Попробую еще по разбираться, может я где-чего не так сделал.

Попутно еще наткнулся на такую проблему, если сделать 81 TGLShadowPlane и привязать к ним группы объектов, то fps падает до 17-18…  обидно. Понимаю надо делать один объект TGLShadowPlane и привязывать к нему группу объектов, которые должны бросать на него тень, но вот нужно поле из клеточек при клике на клетку желательно получать координаты клетки, в случае с пачкой объектов было не сложно это осуществить, а если делать один TGLShadowPlane то как бы его разбить на 81 клеточку. :) Все же есть некоторая потребность в невидимых объектах.


 
КиТаЯц ©   (2004-06-09 08:35) [7]

2 kas-t   (09.06.04 03:31) [6]

> Понимаю надо делать один объект TGLShadowPlane и привязывать
> к нему группу объектов, которые должны бросать на него тень,

Я вот попробовал привязать... См. здесь:
http://www.dunin.hotmail.ru/images/shadow.jpg
Почему-то тени разные стали %( Поможет кто разобраться?
Короче так: сфера (с "правильно" тенью) создана "заранее", а актер добавлен в рантайме, и тень у него почему-то синяя... Help!


 
kerby ©   (2004-06-09 09:54) [8]

Никаких проблем с цветом разных теней
набросал кусок кода для добавления объектов рантайме все путем без тормозов
glshadowplane всего один


 
DeadMeat ©   (2004-06-09 13:24) [9]

Вообщем наклепал я сценку, такую как в [7] и действительно тени разного цвета... Но когда я передвинул GLShadowPlane по иерархии в самый низ, то всё стало нормально, и "выборка" объектов идёт нормально..., т.е. по тени щёлкаешь - выбирается GLShadowPlane...
Правда я это всё в DesignTime делал, но думаю разницы большой быть не должно...

---
...Death Is Only The Begining...


 
kerby ©   (2004-06-09 16:56) [10]

ради прикола  кинул glshadowplane в начало иерархии
тени нормальные есть designtime and runtime


 
kas-t   (2004-06-09 19:04) [11]

В общем, определил я в чем проблема неправильного выбора теней.

Посмотрите на скрин: http://kas-t.sayan.ru/portfolio/temp_001.jpg (~20 кб)

Обратите внимание на 3 точки. Постараюсь объяснить, в чем проблема. Каждая клетка на картинке это отдельный GLShadowPlane, при клике в точку 1 я получаю объект, находящийся под шариком который висит над точкой 1. Кликая мышкой в точку 2, я получаю левый объект, но тот который находится в сцене, такое ощущение, что объекты даются по рандому. Если кликаю по точки 3, то получаю GLShadowPlane находящийся под точкой 3. Все нормально.

Вообще я хорошо понимаю, что использовать столько GLShadowPlane просто изврат, и получаются жуткие тормоза при построении теней. Хотелось бы узнать, реально ли подобное поле с клетками создать посредством одного GlShadowPlane, да так что бы при клике мышкой в нем можно было определить в какой части GlShadowPlane был клик?


 
DeadMeat ©   (2004-06-09 20:21) [12]

А почему нельзя вять один GLShadowVolume и один GLTilePlane... Правда с последним я не разбирался, но зато есть пример на его тему...???

---
...Death Is Only The Begining...


 
kas-t   (2004-06-09 22:54) [13]

to DeadMeat: Потому что там рисуются проекции теней, и при клике мышкой на них (а они перекрывают абсолютно все) выходит бяка, аналогичная той, что я описал выше. Да и еще, при использовании GLShadowVolume тени проецируются только в том случае если двигается источник света, а если двигаются объекты, а источник света висит на месте, то и тени остаются там, где они получились при первом рендеренге сцены. Или я чего-то не так понял?!

ЗЫ: Пробовал буквально чуть-чуть, насовсем не заметное расстояние смещать через определенное время источник света и возвращать его обратно, дабы получить перерисовку теней при движении объекта, появились тормоза. Определенно, я что то не так понял :).


 
КиТаЯц ©   (2004-06-10 08:04) [14]

Балин... Ну "кривые" тени и все тут :( и как у тебя это получилось?

> kerby ©   (09.06.04 16:56) [10]
> ради прикола  кинул glshadowplane в начало иерархии
> тени нормальные есть designtime and runtime

у меня (см. (09.06.04 08:35) [7]) актер и сфера в одном DummyCube лежат, а GLShadowPlane.ShadowingObject:= DummyCube;
и никак тени одинаковые не получаются... Help!


 
kerby ©   (2004-06-10 08:07) [15]

Да базара нет.
Не надо указывать ShadowingObject
http://kerbysoft.narod.ru/faq/urok4.zip


 
КиТаЯц ©   (2004-06-10 09:35) [16]

2 kerby ©   (10.06.04 08:07) [15]
За пример спасибо. Скачал, запустил - все ОК. Тени черные. Открываю свой - тени синие. Тьфу! И так и эдак; ну синие и все! Прям ж*** какая-то. Я уже рычать начал!..
Щас разобрался вроде...
Короче так: как я понял GLShadowPlane.ShadowingObject:= ни на что не влияет (или влияет?), равно как не на что не влияет и иерархия этого самого GLShadowPlane. Весь прикол состоял в том (неповерите!), что тень становится синей у объекта у которого ShowAxes:=True; %)


 
DeadMeat ©   (2004-06-10 17:40) [17]

>[16] КиТаЯц ©   (10.06.04 09:35)
Ну с выборкой там действительно какието глюки есть... Однако с тенями там всё нормально... Открой демку GLShadowVolume (или сам наваяй) и попробуй подвигать любой объект, тень от него отбрасывается правильно...
А насчёт ShowAxes... мож это специально так сделано... Но всё же у меня они были выключены, и тени стали нормальными только когда я передвинул GLShadowPlane... Хотя и с ShowAxes тени тоже синии... Только вот при них (ShowAxes) тени синии у всех объектов а у меня были только у одного...

---
...Death Is Only The Begining...



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

Форум: "Игры";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.034 c
1-1095781449
SergeyRu
2004-09-21 19:44
2004.10.10
Подключение справки от компоненты к Делфи 6


4-1094015053
HeKTO
2004-09-01 09:04
2004.10.10
Проводник (explorer)


1-1096278101
DelphiLexx
2004-09-27 13:41
2004.10.10
SendMessage


1-1095765434
demidoff
2004-09-21 15:17
2004.10.10
Простой вопрос новичка про указатели


14-1095630775
Knight
2004-09-20 01:52
2004.10.10
Бортовой "компьютер" БК-06...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский