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

Raiter 10.01.2008 02:32

Ограничение преремещения объекта областью видимости камеры
 
Вложений: 3
В общем проблема выглядит следующим образом. В редкие свободные минуты пишу небольшую игру. Управляем вертолетом. Перемещатся можно только "по экрану". Тоесть камера не перемещается, перемещается только вертолет (дальше ентити). Нужно сделать так, что бы ентити не мог выходить за область видимости камеры. Проще говоря нужно что бы нельзя было вылетать за края экрана. Если вид сверху, то сделать это элементарно, но когда вид от 3 лица (рис. 1), то это уже становится проблемнее. Если просто задать крайние точки как при виде сверху, то играть не очень интересно, ибо когда ентити находится в нижнем правом углу экрана, то это действительно крайняя точка Х, но если ентити в верхнем краю экрана, то крайняя точка Х уже совсем другая (рис. 2, 3).

Думал сделать невидимые стены, но этот вариант не катит.
Имхо Нужна какая-то формула для вычисления крайней точки Х в зависимости от Z.

Может у кого-то уже есть наработки по этому поводу. Как можно реализовать "это" ? :SOS:

tormoz 10.01.2008 03:10

Ответ: Ограничение преремещения объекта областью видимости камеры
 
Код:

CameraProject cam,EntityX(entity),EntityY(entity),EntityZ(entity)
x=ProjectedX()
y=ProjectedY()

If x<10
  ...
EndIf
If x>GraphicsWidth()-10
...
EndIf
If y<10
  ...
EndIf
If y>GraphicsHeight()-10
...
EndIf


FrankH 10.01.2008 03:27

Re: Ограничение преремещения объекта областью видимости камеры
 
Х1L - координата ограничения нижняя-левая
Х1R - координата нижняя-правая
Х2L - координата верхняя-левая
Ymax - длина пути по вертикали (вперед)
Y - позиция обьекта по вертикали
X - позиция обьекта по горизонтали
DX=X1L-X2L - максимальное отклонение по иксу(с одной стороны)
Xo=DX /Ymax - отношение максимального отклонения к вертикальной координате
теперь в цикле:
XL=X1L-Y*Xo - отнимаем от левой координаты отношение соответственно У
XR=X1R+Y*Xo - прибавляем к правому ограничителю отношение к У
IF (KeyDown(LEFT)) And (X>XL) тогда двигаемся влево
IF (KeyDown(RIGHT)) And (X<XR) тогда двигаемся вправо
вот и все, должно работать при условии что камера смотрит четко вперед, т.е. углы ограничения зрения по сторонам одинаковы, хотя придумал на лету, потому мог где-то затупить..
tormoz опередил более простым вариантом :)


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

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