|
3D-программирование Вопросы, касающиеся программирования 3D мира |
05.10.2007, 02:34
|
#1
|
AnyKey`щик
Регистрация: 18.09.2007
Сообщений: 9
Написано 0 полезных сообщений (для 0 пользователей)
|
Плавное перемещение камеры
Здрасьте, вот такой у меня гемор-
Вообщем сделал я карту своего города...увидел как-то карту Кировска от Chuma и захотел такую-же сотворить, но лучше...
Все нормально вроде сделал...и модельки и свет и фог...даже меню набросал...камера плавно летает...вообщем красотища!..Ах да - трабл такой : Как можно сделать так чтобы при нажатии кнопки (например моего меню) камера (которая привязанна к спрятонной коробочке) мягко передвигалась в указанные мною координаты...
Вообщем типа так:
жму кнопку...камера плавно разворачивается в сторону координат...камера плавненько летит к координатам икс,игрег,зэд...
пробовал вот так:
If Press_Button(movA) PositionEntity loh,110,0,110 PointEntity loh,NG
NG- это бокс который я подвесил над нужной координатой...-но летит эта камера очень быстро и не красиво
P/S кнопка уже есть...
|
(Offline)
|
|
05.10.2007, 08:50
|
#2
|
|
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. мой метод жостко кривой, но рабочий
|
|
|
05.10.2007, 11:47
|
#3
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
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
Ну это почти тоже самое.
|
(Offline)
|
|
05.10.2007, 12:13
|
#4
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Re: Плавное перемещение камеры
вторая более универсальная !!
|
(Offline)
|
|
05.10.2007, 16:41
|
#5
|
|
Re: Плавное перемещение камеры
H@NON
в твоей функции будет "дребезжание" числа
у тебя просто при lim newvalue -> oldvalue
получится что (oldvalue#-newvalue#)/increments бесконечно малое
и в теории получается что newvalue никогда не достигнет oldvalue
а на практике из-за погрешностей в етой зоне возможно будет что
new_value будет то больше, то меньше old_value
да и она переносит с разной скоростью
|
|
|
05.10.2007, 17:20
|
#6
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Re: Плавное перемещение камеры
Да я понимаю это. Я знал что число newvalue не достигнет oldvalue, но так можно добится замедление движения в конце. Это получается сначало почти мгновенный перенос, а потом замедление. У меня не наблюдалось погрешности числа newvalue, да я и не использовал голую функцию, ставил условия, проверку на расстояние как ты описал выше. Вообще лучший вариант это работа с целыми числами .
|
(Offline)
|
|
05.10.2007, 19:07
|
#7
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Re: Плавное перемещение камеры
newvalue не достигнет oldvalue по этому происходит "дребезжание" числа !!
что бы его избежать нужно еще 1 условие поставить при котором newvalue не будет приблежатся к oldvalue !!
|
(Offline)
|
|
05.10.2007, 20:05
|
#8
|
AnyKey`щик
Регистрация: 18.09.2007
Сообщений: 9
Написано 0 полезных сообщений (для 0 пользователей)
|
Попрбовал оба варианта...оба хороши, спасибо ...но остановился на первом...вообщем вот ,что получилось:
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 прилипает к координатам и режим,как бы свободного полета, пропадает...,что бы ешё дописать ,чтобы он отлипал от координат?,после того как туда прилетел..
|
(Offline)
|
|
05.10.2007, 20:07
|
#9
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Re: Плавное перемещение камеры
то есть один раз переместился и всё ??
или в чем трабла ??
|
(Offline)
|
|
05.10.2007, 20:27
|
#10
|
AnyKey`щик
Регистрация: 18.09.2007
Сообщений: 9
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Плавное перемещение камеры
Сообщение от IGR
то есть один раз переместился и всё ??
или в чем трабла ??
|
Ну как...эээ...двигаю я по городу привязанную камеру к коробке...воот..(как бы в *свободном режиме*)...жму на кнопку(типа переместиться в 150,0,100) она плавно летит туда (ок,так и нужно)...жму на другую кнопку, летит туда (так же плавно,ок)...она так и будет летать туда ,куда я её посылаю...но трабл в том,что она как бы прилипает к последней координате и *свободный режим* пропадает..т.е. сдвинуть её уже больше не могу...вот..
|
(Offline)
|
|
05.10.2007, 23:40
|
#11
|
|
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. сверяем квадраты чисел, ибо быстрее
|
|
|
06.10.2007, 12:17
|
#12
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Re: Плавное перемещение камеры
Ага, просто постявь условие работы перехода камеры если она дальше от цели на некоторое значение.
|
(Offline)
|
|
06.10.2007, 21:34
|
#13
|
AnyKey`щик
Регистрация: 18.09.2007
Сообщений: 9
Написано 0 полезных сообщений (для 0 пользователей)
|
Ок! Все летает..сдвигается...разобрался...вчера пол ночи вчитывался в код...вроде все, примерно понял как работает...а отлипает она от координаты простым щелчком мыши...сам чес.говоря не понял до конца ,почему...наверно тут дело уже в ГУИ...
Всем Спасибо!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:13.
|