forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Реализация эффекта линз (http://forum.boolean.name/showthread.php?t=3471)

X-Ranger 28.05.2007 12:11

Реализация эффекта линз
 
С Блитцом идет пример: Blitz 3D Samples\AGore\GrassDemo

Там реализован эффект от линз, когда появляются блики при "попадании источника света в видимость камеры"

Как реализовать подобный эффект с учетом того что истоник бликов может быть закрыт различными предметами (при закрытии источника света - блики исчезают).

единственно что я догадался пользовать это

Код:

EntityPickMode PF, 2
If EnityVisible(Camera, PivotLight) Then
  Показать_Спарайты
Else
  Спрятать_Спрайты
End If

Мне не очень нравится то, что эффект пропадает в случае заграждения слишком резко и не высокая производительность этого метода.

Есть ли другие способы определения видимости объекта или даже реализации самого эффекта более быстродействующие и/или более точные.

Chuma 28.05.2007 12:47

Re: Реализация эффекта линз
 
ух.. прикольно... хочу так же.. Присоединяюсь к запросу..

ABTOMAT 28.05.2007 23:27

Re: Реализация эффекта линз
 
Г-муха-ха!! А вот у меня в Матвее уже есть линзовые эффекты! Простов случае
[blitz]EntityPickMode PF, 2
If EnityVisible(Camera, PivotLight) Then
Показать_Спарайты
Else
Спрятать_Спрайты
End If[/blitz]

У меня есть функция
[blitz]
Function Спрятать_спрайты
Прозрачность каждого линза системы уменьшаем на 0,05
If прозрачность < 0 то Hide_entity все спрайты нах
end function

Function показать_спрайты
If прозрачность спрайтов < 0 то Show_entity все спрайты, опять же, нах.
Else увеличить прозрачность каждого спрайта на 0.05
end function
[/blitz]

Также вместо
[blitz]If EnityVisible(Camera, PivotLight) Then[/blitz]
можно сделать так:
[blitz]If EnityVisible(Camera, PivotLight) and EntityInView PivitLightThen[/blitz]
Так же я у себя уменьшаю/увеличиваю сияние солнца - так получается ещё красивее.

Но помните - это всё кушает ресурсы.

З.Ы. Ещё у меня есть вычисление косинуса угла между камерой и солнцем, что делает появление\исчезание линз полностью соответствующим реальности, но это всё убивает на корню производительность.
Присоединяюсь к вогпросу: "Есть ли более точные/производительные решения?" :-)

MiXaeL 28.05.2007 23:27

Re: Реализация эффекта линз
 
Я видел реализацию где-то здесь
http://www.boolean.name/forumdisplay.php?f=87
поищи.

moka 29.05.2007 01:56

Re: Реализация эффекта линз
 
Не видел примера, но как понял, там нету материального объекта, как реализовть спрятание:
Значит, создаём в кажлом месте где нужно этот эффект сделать, сферу, с прозрачностью 0, далее в цикле, каждый период времени, просто делает CameraPick в точку полученную функцией CameraProject(координаты сферки), да и прописать пикаблемоде сфере и всему окружающему, что может загараживать, не забудь, так вот если пикедентити=сфера, то видно, если другой любой объект, то загороженно.

Flash 27.01.2010 19:01

Ответ: Реализация эффекта линз
 
Вот функция для бликов, но она отжирает фпс при нахождении в кадре 2 и более бликов ровно в 2 раза, вот это действительно проблема
Код:

Global  flar.flare
 
 Type Flare
  Field lightsphere
  Field lightsp
  Field visible
  Field timefade
 
End Type
 
 Function CreateNewFlare.Flare(x#,y#,z#,sx#,sy# )
 
 
flar.Flare=New Flare
  flar\lightsphere = CreateSphere()
  EntityAlpha flar\lightsphere, 0
  PositionEntity flar\lightsphere,x,y,z
  EntityPickMode flar\lightsphere, 2
  flar\lightsp=LoadSprite( ".\Data\effects\misc_flare.png",8,flar\lightsphere )
  ;HandleSprite f\lightsp,0,-1
  ScaleSprite flar\lightsp,sx#*10,sy#*10
  PositionEntity flar\lightsp, 0,0,0
  SpriteViewMode flar\lightsp,3
  EntityColor flar\lightsp,100,100,100
  ;EntityShininess f\lightsp, 1
  EntityOrder flar\lightsp, -1
  HandleSprite flar\lightsp, 0, 0
  flar\visible = False
  Return flar
End Function

 Function UpdateFlares()
  For flar.Flare=Each Flare
    If EntityVisible(CameraBody, flar\lightsphere) And (Not flar\visible)
      flar\visible = True
      EntityColor flar\lightsp,150,150,150
      distan = EntityDistance(CameraBody,flar\lightsphere)
      scale = distan/2
      ScaleSprite flar\lightsp, scale, scale
      ShowEntity flar\lightsphere
      RotateSprite flar\lightsp, EntityYaw(camerabody)*2
    Else
      If flar\visible
flar\visible = False
      ; If Rnd(500)<100 Then  HideEntity flar\lightsphere
          flar\timefade = 100
      Else
          If flar\timefade >= 0
            flar\timefade = flar\timefade - 10
            EntityColor flar\lightsp,flar\timefade,flar\timefade,flar\timefade
           
          EndIf       
      EndIf
    EndIf
  Next
End Function


Hurrit 27.01.2010 19:38

Ответ: Реализация эффекта линз
 
Спустя два с половиной года блики нашлись, УРА ТОВАРИЩИ УРА!!1!

Flash 27.01.2010 19:54

Ответ: Реализация эффекта линз
 
Нашлись то нашлись, но жрут фпс, попробую сделать это на фасте, может чего добьюсь.

NitE 27.01.2010 21:18

Ответ: Реализация эффекта линз
 
попробуй ничего не делать.
если кому-то внезапно понадобится эффект - ищем тут (видел как минимум 3 очень качественных) http://www.blitzbasic.com/codearcs/codearcs.php?cat=11

Program23 24.02.2010 02:09

Ответ: Реализация эффекта линз
 
помоему EntityOrder линза,параметр.имха ща 3ночи сижу на сотике.смореть код -лень комп врубать.короч этой командой делаем линзу на задний план,её перекрывают другие объекты.или я туплю,башка не варит.я спать...


Часовой пояс GMT +4, время: 06:03.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot