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=4657)

evel 05.10.2007 02:34

Плавное перемещение камеры
 
Здрасьте, вот такой у меня гемор-
Вообщем сделал я карту своего города...увидел как-то карту Кировска от Chuma и захотел такую-же сотворить, но лучше...:-D
Все нормально вроде сделал...и модельки и свет и фог...даже меню набросал...камера плавно летает...вообщем красотища!..Ах да - трабл такой : Как можно сделать так чтобы при нажатии кнопки (например моего меню) камера (которая привязанна к спрятонной коробочке) мягко передвигалась в указанные мною координаты...
Вообщем типа так:
жму кнопку...камера плавно разворачивается в сторону координат...камера плавненько летит к координатам икс,игрег,зэд...

пробовал вот так:

If Press_Button(movA) PositionEntity loh,110,0,110 PointEntity loh,NG

NG- это бокс который я подвесил над нужной координатой...-но летит эта камера очень быстро и не красиво:''((

P/S кнопка уже есть...:)

jimon 05.10.2007 08:50

Re: Плавное перемещение камеры
 
1) пишем вот такую вот функцию
Код:

Function AnimateValue#(in#,ch#,speed#)
        If Abs(ch - in) <= speed Then Return ch
        Return in + Sgn(ch - in) * speed
End Function

2) делаем глобальные переменые где то
Global CameraAnimate%,CamAnimX#,CamAnimY#,CamAnimZ#

3) при нажатии на movA просто пишем
Код:

if Pres_Button(movA) then
CameraAnimate = 1
CamAnimX = 110
CamAnimY = 0
CamAnimZ = 110
end if

4) далее пишем такую вот фигню примерно :
Код:

if CameraAnimate = 1 then
local camx#,camy#,camz#
camx = AnimateValue(entityx(camera),CamAnimX,1.0)
camy = AnimateValue(entityy(camera),CamAnimY,1.0)
camz = AnimateValue(entityz(camera),CamAnimZ,1.0)
PositionEntity camera,camx,camy,camz

тут проверяем растояние от камеры до конечной точки
if distance < 10 then CameraAnimate = 0

end if

ps. ето только анимация движения по координатам
я думаю анимацию поворота и самому можно доделать аналогично
ps2. мой метод жостко кривой, но рабочий :)

H@NON 05.10.2007 11:47

Re: Плавное перемещение камеры
 
Да, а еще можно воспользоватся вот этой функцией:
Код:

Function CurveValue#(newvalue#,oldvalue#,increments# )
newvalue#=newvalue#+(oldvalue#-newvalue#)/increments
Return newvalue#
End Function

А далше делаем так:
Код:

cur_x = CurveValue#(new_x,old_x, increments)
cur_Y = CurveValue#(new_y,old_y, increments)
cur_z = CurveValue#(new_z,old_z, increments)

positionentity camera,cur_x, cur_y, cur_z

Ну это почти тоже самое.

IGR 05.10.2007 12:13

Re: Плавное перемещение камеры
 
вторая более универсальная !! :)

jimon 05.10.2007 16:41

Re: Плавное перемещение камеры
 
H@NON
в твоей функции будет "дребезжание" числа
у тебя просто при lim newvalue -> oldvalue
получится что (oldvalue#-newvalue#)/increments бесконечно малое
и в теории получается что newvalue никогда не достигнет oldvalue :)
а на практике из-за погрешностей в етой зоне возможно будет что
new_value будет то больше, то меньше old_value :)

да и она переносит с разной скоростью

H@NON 05.10.2007 17:20

Re: Плавное перемещение камеры
 
Да я понимаю это. Я знал что число newvalue не достигнет oldvalue, но так можно добится замедление движения в конце. Это получается сначало почти мгновенный перенос, а потом замедление. У меня не наблюдалось погрешности числа newvalue, да я и не использовал голую функцию, ставил условия, проверку на расстояние как ты описал выше. Вообще лучший вариант это работа с целыми числами;).

IGR 05.10.2007 19:07

Re: Плавное перемещение камеры
 
newvalue не достигнет oldvalue по этому происходит "дребезжание" числа !!
что бы его избежать нужно еще 1 условие поставить при котором newvalue не будет приблежатся к oldvalue !!

evel 05.10.2007 20:05

Попрбовал оба варианта...оба хороши, спасибо:super: ...но остановился на первом...вообщем вот ,что получилось:

Код:


Global CameraAnimate%,CamAnimX#,CamAnimY#,CamAnimZ#
 
While Not KeyDown (1)
 
  If Press_Button(movA) Then
      CameraAnimate = 1
        CamAnimX = 80
        CamAnimY = 0
        CamAnimZ = 110
  End If
  If CameraAnimate = 1
    Local camx#,camy#,camz#
    camx = AnimateValue(EntityX(loh),CamAnimX,0.3)
    camy = AnimateValue(EntityY(loh),CamAnimY,0.3)
    camz = AnimateValue(EntityZ(loh),CamAnimZ,0.3)
    PositionEntity loh,camx,camy,camz
  EndIf
 
  If Press_Button(movB)
    CameraAnimate = 1
        CamAnimX = 150
        CamAnimY = 0
        CamAnimZ = 110
  End If
  If CameraAnimate = 1
    Local camx1#,camy1#,camz1#
    camx = AnimateValue(EntityX(loh),CamAnimX,0.3)
    camy = AnimateValue(EntityY(loh),CamAnimY,0.3)
    camz = AnimateValue(EntityZ(loh),CamAnimZ,0.3)
    PositionEntity loh,camx,camy,camz
  EndIf
 
 UpdateWorld
 RenderWorld
 Flip
 Wend
 
Function AnimateValue#(in#,ch#,speed#)
 If Abs(ch - in) <= speed Then Return ch
 Return in + Sgn(ch - in) * speed
End Function

но..:( loh прилипает к координатам и режим,как бы свободного полета, пропадает...,что бы ешё дописать ,чтобы он отлипал от координат?,после того как туда прилетел..

IGR 05.10.2007 20:07

Re: Плавное перемещение камеры
 
то есть один раз переместился и всё ??
или в чем трабла ??

evel 05.10.2007 20:27

Re: Плавное перемещение камеры
 
Цитата:

Сообщение от IGR
то есть один раз переместился и всё ??
или в чем трабла ??

Ну как...эээ...двигаю я по городу привязанную камеру к коробке...воот..(как бы в *свободном режиме*)...жму на кнопку(типа переместиться в 150,0,100) она плавно летит туда (ок,так и нужно)...жму на другую кнопку, летит туда (так же плавно,ок)...она так и будет летать туда ,куда я её посылаю...но трабл в том,что она как бы прилипает к последней координате и *свободный режим* пропадает..т.е. сдвинуть её уже больше не могу...вот..

jimon 05.10.2007 23:40

Re: Плавное перемещение камеры
 
перечитай мой пост
там вот такой вот текст
Код:

тут проверяем растояние от камеры до конечной точки
if distance < 10 then CameraAnimate = 0

в принципе делается вот так
Код:

local dist_q# = EntityX(cam)*EntityX(cam)+EntityY(cam)*EntityY(cam)+EntityZ(cam)*EntityZ(cam)
if dist_q < (10*10) then CameraAnimate = 0

ps. сверяем квадраты чисел, ибо быстрее

H@NON 06.10.2007 12:17

Re: Плавное перемещение камеры
 
Ага, просто постявь условие работы перехода камеры если она дальше от цели на некоторое значение.

evel 06.10.2007 21:34

Ок! Все летает..сдвигается...разобрался...вчера пол ночи вчитывался в код...вроде все, примерно понял как работает...а отлипает она от координаты простым щелчком мыши...сам чес.говоря не понял до конца ,почему...наверно тут дело уже в ГУИ...

Всем Спасибо!


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

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