forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Камера от MMORPG (http://forum.boolean.name/showthread.php?t=13755)

goodwin74 21.11.2010 12:12

Камера от MMORPG
 
Вложений: 1
Помогите, пожалуйста разобраться с камерой на объект. В общем опишу ситуацию.
Есть проект я его приаттачил на пост
Существует камера и объект. Камера привязана к объекту т.е. Вид от 3 лица. Поворот камеры осуществляется при помощи мыши:


Но проблема не в этом когда начинаешь движение то объект перемещается сам по себе независимо от расположение камеры т.е. если мы повернем камеру смотря спереди на объект то для движения вперед нужно будет нажать назад:


Кто знает как рассчитать угол поворота камеры относительно объекта, так, чтобы объект поворачивался на столько, на сколько был повернут бы Пивот, стоящий внутри объекта который прикреплен к объекту, а к пивоту прикреплена камера, вот так:

is.SarCasm 21.11.2010 12:34

Ответ: Камера от MMORPG
 
Очень много пэрэнтов. Я бы всё заново переписал лучше.

SBJoker 21.11.2010 13:19

Ответ: Камера от MMORPG
 
Имхо в ММОГ играх камера подтягивается за движущимся игроков а не наоборот.

is.SarCasm 21.11.2010 13:42

Ответ: Камера от MMORPG
 
Кстати ,да. Вы что то путаете goodwin74

Reks888 21.11.2010 15:00

Ответ: Камера от MMORPG
 
Алсо, классные гифки!

ARA 21.11.2010 17:46

Ответ: Камера от MMORPG
 
Ща чтонить ляпну:
Можно выщщетать на какой угол повёрнута камера в данный момент(например на 30 градусов) и повернуть игрока на 30 градусов, а камеру на -30(в противоположную сторону) :-)

is.SarCasm 21.11.2010 17:49

Ответ: Камера от MMORPG
 
Ты не можешь узнать на какой угол повернуто что либо связанное с камерой.

ARA 21.11.2010 17:50

Ответ: Камера от MMORPG
 
Хм. а что, блиц уже углы не возврашаетъ?

is.SarCasm 21.11.2010 18:13

Ответ: Камера от MMORPG
 
Припэрнченный объект не возвращает координаты и угол насколько я знаю.

Mr_F_ 21.11.2010 18:19

Ответ: Камера от MMORPG
 
не тестил, но вроде так должно работать.

;переводим кнопки->направление и заранее начинаем двигать перса (что не совсем правильно, но... наверное прокатит)
if keydown(200) movex#=0:movey#=0:movez#=1:moveentity char,0,0,1
if keydown(208) movex#=0:movey#=0:movez#=-1:moveentity char,0,0,1
if keydown(203) movex#=-1:movey#=0:movez#=0:moveentity char,0,0,1
if keydown(205) movex#=1:movey#=0:movez#=0:moveentity char,0,0,1

positionEntity characterShouldFollowIt, entityx#(char),entityy#(char),entityz#(char),1 ; здесь char это перс, а characterShouldFollowIt это пивот, который мы в каждом кадре ставим в его позицию

TFormNormal movex,movey,movez, Camera, characterShouldFollowIt ;переводим направление движения от камеры к пивоту

AlignToVector TFormedX#(),TFormedY#(),TFormedZ#(),3 ;ставим пивот так, чтобы он смотрел в направлении движения относительно камеры

; берём угол вращения по Y этого пивота
roty# = EntityYaw#(characterShouldFollowIt)
; интерполируем текущий поворот чела на пивотовский супер-функцией от Моки
roty# = MergeAngles#(EntityYaw#(char),roty#,.1)
; применяем
RotateEntity(char,EntityPitch(char),roty#,EntityRo ll#(char))


Function MergeAngles#(Angle1#,Angle2#,Morph#=.5)
If Abs(Angle1-Angle2)>180
If Angle1<Angle2
Return Angle1-((360-Angle2)+Angle1)*(.5-(Morph-.5))
Else
Return Angle2-((360-Angle1)+Angle2)*(.5+(Morph-.5))
EndIf
Else
Return Angle1*(Morph)+Angle2*(1.0-Morph)
EndIf
End Function

ABTOMAT 21.11.2010 18:29

Ответ: Камера от MMORPG
 
Цитата:

Сообщение от is.SarCasm (Сообщение 169503)
Припэрнченный объект не возвращает координаты и угол насколько я знаю.

Флаг Global спасёт отца русской демократии.

goodwin74 21.11.2010 23:49

Ответ: Камера от MMORPG
 
Цитата:

Очень много пэрэнтов. Я бы всё заново переписал лучше.
Я не давно изучаю Blitz3D и просто узнаю азы. Там много мусора например пробовал естественный свет ставить ну и т.п. Мне главное понять как делается поворот в связи с тем как повернута камера.

Цитата:

Имхо в ММОГ играх камера подтягивается за движущимся игроков а не наоборот.
Абсолютно не согласен. Пример многих ММОРПГ: Во время указания пути мышкой, не затрагивая клавиши отвечающие за ходьбу, пользователь может повернуть камеру вокруг персонажа с любой стороны и он не сменит свое направление. Но если пользователь идет при помощи клавиш то уже поворот камеры определяет вектор направления ходьбы персонажа и тем самым поворачивая камеру персонаж поворачивает туда же, а клавиши влево и вправо ведут действие отклонение(WoW,LineAge II, Aion)

Цитата:

Кстати ,да. Вы что то путаете goodwin74
Я сам в них играл :)

Цитата:

не тестил, но вроде так должно работать.
Будем разбираться может что то новое для себя узнаю

goodwin74 22.11.2010 00:24

Ответ: Камера от MMORPG
 
Цитата:

AlignToVector TFormedX#(),TFormedY#(),TFormedZ#(),3
Что-то здесь выдает что не хватает параметров.

Ну все верно entity handle не указан :)

Mr_F_, набрал код в общем получается что при движение мыши по Y камера вертится вокруг объекта, а во время движения по Х объект начинается поворачиваться сам, а камера остается на месте.

RegIon 27.12.2010 14:25

Ответ: Камера от MMORPG
 
вы чё гоните Blitz возвращает иглы притаченых объектов-EntityRoll(меш,1) и так далее,глобальный угол.

RegIon 27.12.2010 14:28

Ответ: Камера от MMORPG
 
Вопрос в лёт: как камеру от 3лица, заставить не проваливаться в стены,а убегать от них,оставляя направление просмотра без EntityPoint().А?(тупак ставишь-назад не вворачиваться)

BlackOut 28.12.2010 01:23

Ответ: Камера от MMORPG
 
@Костян
Посмотри пример:
http://www.blitz-school.info/less_ex.phtml

Amatsu 28.12.2010 10:45

Ответ: Камера от MMORPG
 
Хм... чтож вы меня не спросили, я как раз такую систему сделал в своей игре %) Если кому-то еще надо, набросал простенький пример
Код:

Graphics3D 1024,768,32,1
SeedRnd(MilliSecs())

;объявление необходимых переменных
Global mxs#,mys#,dest_xang#,dest_yang#,xang#,yang#,differ_yaw#,target_rot#
Global camera_target=CreatePivot()
Global dist_target=CreatePivot(camera_target)
Global move_navigator=CreatePivot(camera_target)
Global move_directional=CreatePivot()

;создание камеры
Global camera=CreateCamera()
CameraZoom camera,1.4

;создание сцены
Global light=CreateLight()
RotateEntity light,30,30,0

plane=CreatePlane()
EntityColor plane,100,150,255
EntityPickMode plane,2

For c=1 To 10
  cube=CreateCube()
  EntityColor cube,150,255,150
  ScaleEntity cube,2,20,2
  PositionEntity cube,Rand(-50,50),20,Rand(-50,50)
  EntityPickMode cube,2
Next

;создание модели игрока
player=CreateCube()
EntityAlpha player,0.5
PositionEntity player,0,1,0
EntityColor player,255,0,0



While Not KeyHit(1)

  MouseLook(player)

  UpdateWorld()
  RenderWorld()
 
  Flip

Wend

End

;<<сама функция>>
;height - параметр указывает высоту над центром модели, куда "привязать" камеру. например если надо чтобы прицел был над головой игрока
;speed - скорость передвижения игрока
;rotate - скорость поворота модели игрока в сторону движения. желательно оставить 10

Function MouseLook(target,height=5,speed#=0.5,rotate#=10)

;ВНИМАНИЕ!!! нижеследующие 3 параметра можно менять, если хотите подредактировать "колизию" камеры с уровнем. но я не рекомендую их трогать - долго подбирал значения =)

;collision_radius - радиус луча, по которому проверяется наличие препятсвий между моделью игрока и камерой (команда LinePick)

;collision_distance - параметр смещает камеру (чем меньше значение, тем ближе будет приближаться камера) ближе к модели игрока в случае, если LinePick=true.
; помогает от "проваливания" камеры в стены

;camera_distance - расстояние от модели игрока до камеры в случае если LinePick=false

  collision_radius#=0.5
  collision_distance#=5
  camera_distance=30

  If target<>0 Then
    PositionEntity move_navigator,0,0,0

    If KeyDown(17) Then PositionEntity move_navigator,EntityX(move_navigator),0,0.1
    If KeyDown(31) Then PositionEntity move_navigator,EntityX(move_navigator),0,-0.1
    If KeyDown(30) Then PositionEntity move_navigator,-0.1,0,EntityZ(move_navigator)
    If KeyDown(32) Then PositionEntity move_navigator,0.1,0,EntityZ(move_navigator)


    PositionEntity move_directional,EntityX(target),EntityY(target)+height,EntityZ(target)
    If EntityX(move_navigator)<>0 Or EntityZ(move_navigator)<>0 Then
          PointEntity move_directional,move_navigator
      If Abs(differ_yaw)<90 Then MoveEntity target,0,0,speed ;число 90 определяет угол между направлением движения и направлением модели, при котором модель начинает движение
    EndIf

    mxs=MouseX()-GraphicsWidth()/2
    mys=MouseY()-GraphicsHeight()/2
    MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
    mxs=mxs/5.5
    mys=mys/5.5
    If mxs>30 Then mxs=30
    If mxs<-30 Then mxs=-30
    If mys>30 Then mys=30
    If mys<-30 Then mys=-30
    dest_xang=dest_xang-mxs
    dest_yang=dest_yang+mys

    If dest_yang<-85 Then dest_yang=-85
    If dest_yang>85 Then dest_yang=85
    yang=(yang+(dest_yang-yang)/4)
    xang=(xang+(dest_xang-xang)/4)


    PositionEntity camera_target,EntityX(target),EntityY(target)+height,EntityZ(target)
    RotateEntity camera_target,0,xang,0
    PositionEntity dist_target,0,Sin(yang)*camera_distance,-Cos(yang)*camera_distance

    vis_line_x#=EntityX(camera_target,1)
    vis_line_y#=EntityY(camera_target,1)
    vis_line_z#=EntityZ(camera_target,1)
    vis_line_dx#=EntityX(dist_target,1)-EntityX(camera_target,1)
    vis_line_dy#=EntityY(dist_target,1)-EntityY(camera_target,1)
    vis_line_dz#=EntityZ(dist_target,1)-EntityZ(camera_target,1)
    If LinePick(vis_line_x,vis_line_y,vis_line_z,vis_line_dx,vis_line_dy,vis_line_dz,collision_radius) Then
      PositionEntity camera,PickedX#()-(PickedX#()-EntityX#(camera_target,1))/collision_distance,PickedY#()-(PickedY#()-EntityY#(camera_target,1))/collision_distance,PickedZ#()-(PickedZ#()-EntityZ#(camera_target,1))/collision_distance
    Else
;      PositionEntity camera,EntityX#(dist_target,1)-(EntityX#(dist_target,1)-EntityX#(camera_target,1))/collision_distance,EntityY#(dist_target,1)-(EntityY#(dist_target,1)-EntityY#(camera_target,1))/collision_distance,EntityZ#(dist_target,1)-(EntityZ#(dist_target,1)-EntityZ#(camera_target,1))/collision_distance
      PositionEntity camera,EntityX#(dist_target,1),EntityY#(dist_target,1),EntityZ#(dist_target,1)
    EndIf
    PointEntity camera,camera_target

    differ_yaw=EntityYaw(target)-EntityYaw(move_directional)
    If differ_yaw>179.9999 Then differ_yaw=differ_yaw-359.9999
    If differ_yaw<-179.9999 Then differ_yaw=359.9999+differ_yaw

    If EntityX(move_navigator)<>0 Or EntityZ(move_navigator)<>0 Then
      If differ_yaw>rotate Then
        target_rot=target_rot-rotate
      ElseIf differ_yaw<-rotate Then
        target_rot=target_rot+rotate
      ElseIf differ_yaw<rotate*3 And differ_yaw>-rotate*3 Then
        target_rot=EntityYaw(move_directional,1)
      EndIf
    EndIf
    RotateEntity target,0,target_rot,0
  EndIf
End Function


RegIon 29.12.2010 06:31

Ответ: Камера от MMORPG
 
Неха маленький код на камеру:4to:

Amatsu 29.12.2010 09:45

Ответ: Камера от MMORPG
 
Цитата:

Сообщение от Костян (Сообщение 173569)
Неха маленький код на камеру:4to:

Можешь оптимизировать ;)

moka 29.12.2010 23:25

Ответ: Камера от MMORPG
 
Цитата:

Сообщение от Костян (Сообщение 173569)
Неха маленький код на камеру:4to:

Ты не видел исходников, по например реализации работы string'ов. Или ещё чего "попроще", так строк сотни бывают, а выглядит, как простая "чтучка".

RegIon 30.12.2010 05:44

Ответ: Камера от MMORPG
 
Цитата:

Ты не видел исходников, по например реализации работы string'ов. Или ещё чего "попроще", так строк сотни бывают, а выглядит, как простая "чтучка".
А в чём их прикол.(string'ов. )

moka 31.12.2010 03:01

Ответ: Камера от MMORPG
 
Цитата:

Сообщение от Костян (Сообщение 173709)
А в чём их прикол.(string'ов. )

Ну я и говорю, "Ты не видел исходников".
Сперва, что такое string (технически), и как он реализован на уровне памяти и переменных. А затем функции, по работе с ними, всякие там поиски в string'е, обрезания, сравнивания, конвертация одного типа данных, в string, и многое другое. Там немалый лес, и много работы с битами.

Эм, зачем это я рассказываю..

RegIon 31.12.2010 05:32

Ответ: Камера от MMORPG
 
Цитата:

Ну я и говорю, "Ты не видел исходников".
Сперва, что такое string (технически), и как он реализован на уровне памяти и переменных. А затем функции, по работе с ними, всякие там поиски в string'е, обрезания, сравнивания, конвертация одного типа данных, в string, и многое другое. Там немалый лес, и много работы с битами.
Так эта же машинный код.Оно всё автоматом делаеться.

Randomize 31.12.2010 05:40

Ответ: Камера от MMORPG
 
Цитата:

Сообщение от Костян (Сообщение 173878)
Так эта же машинный код.Оно всё автоматом делаеться.

O_o не не не. Не автоматом! Это в Blitz3D это уже за тебя реализовано.

RegIon 31.12.2010 06:18

Ответ: Камера от MMORPG
 
Код:

O_o не не не. Не автоматом! Это в Blitz3D это уже за тебя реализовано.
Когда успел написать. Тыж Offline

moka 31.12.2010 21:14

Ответ: Камера от MMORPG
 
Цитата:

Сообщение от Костян (Сообщение 173878)
Так эта же машинный код.Оно всё автоматом делаеться.

Дети тоже "автоматом" рождаются.
И вообще компьютер никто не делал, всё автоматом сделалось, и думает автоматом.
Запомни. Всё что ты видишь в мониторе, ничего не сделано "автоматом", а то что работает на уровне железа, сделано умненькими инженерами, которые тоже не "пишут пару строк".

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

Костян, сразу на заметку, чтобы быть начитанным и немного образованным в чём-то. Используй фантазию, но только не для утверждений, а для поиска информации. Вообрази, что-то, но понимай что это что-то лишь тобою вооброжаемо. И пока ты найдёшь конкретного подтверждения своим "догадкам", не бросайся ими, как "утверждениями". Они останутся твоими "догадками", не более. Здесь "удача" не работает.
Вот тебе, на вооружение:
google.com - самый важный инструмент, я лично его открываю как каждый 5 сайт. А на работе, это вообще для меня каждая вторая закладка - это гуугл.
Для образования и теоретической части, достаточно удобна ru.wikipedia.org, там есть куча всего. Можешь почитать что значит большинство терминов, на любую тему, которые ты встречаешь.
Если есть стремление к знаниям, то используй инструменты, для получения этих знаний.
Короче говоря, увидел слово string, не поленись, вбей в гугле: "string wikipedia", далее, выбери строку: String (computer science), sequence of symbols or digits in computer programming
И затем слева, переключись на русский, затем если будешь внимательным, дойдёшь до "Реализация в языках программирования", и будет что-то более ясным.

Учись пока молод! Дерзай!
Но бл..ть! НЕ ТУПИ. Детский сад...


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

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