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

kai 28.02.2007 02:29

Обзор камеры и хотьба
 
Т.К. Я на данном форуме новенький...то возможно этот вопрос задовался...прошу заранее не ругать...
А вот сам вопрос:
я вот несколько часов бьюсь об клаву головой изза того, что не получается сделать обзор камерой...например как в ГТА...
тоесть я хочу сказать оттом, что когда игрок стоит на месте, и вращаеш камеру, то она вращается вокруг игрока...а когда нажимаешь ити например вперёд, то игрок должен разворачивацца в сторону камеры...
ну и соответственно кода игрок идёт и вращаеш камеру, то он с камерой вращается...Поверьте фсё перепробовал...почти получилось...но буду признателен если ктонить продемонстрирует свой код...а то я уже в отчаиньи...заранее снк

moka 28.02.2007 03:27

Re: Обзор камеры и хотьба
 
Код не продемонстрирую =) (я не дома), а только расскажу примерно как сделал бы я (точнее делал).

Я создавал Мэшь (огрок), с коллизией. Далее в позиции головы, создавал пивот, далее создавал камеру и паррентил к этому пивоту. Сразу при загрузки, поворачивал камеру немного вниз и двигал назад.
Далее в цикле, я ставил пивот на позицию мэше и немного выше, что-бы было в месте головы. А дальше игрался с "фичей", плавного поворота. Которая есть на форуме в полезных функциях. Всё.
http://www.boolean.name/showthread.php?t=1314 - вот тут хорошо рассказано, про повороты.

HolyDel 04.03.2007 02:56

Re: Обзор камеры и хотьба
 
при нажатии кнопки вперед - плавно поворачивать игрока на угол камеры.

Platon 04.03.2007 05:35

Re: Обзор камеры и хотьба
 
Вложений: 2
Устанавливаешь пивот на уровне головы игрока
Камеру ставишь позади игрока и крепишь к пивоту

Сам алгоритм такой:
Вычисляешь углы поворота для пивота камеры:
Код:

;Накапливаем углы через скорость перемещения мыши
;Уменьшаем скорость мыши умножением на коэффициент меньше единицы
ПоворотПоY = ПоворотПоY + MouseXSpeed() * ЧувствительностьМыши
ПоворотПоX = ПоворотПоX + MouseYSpeed() * ЧувствительностьМыши

;Сдвигаем мышь в центр экрана для того чтобы указатель мыши не
;достиг края экрана, иначе мышь остановится и скорость измерятся
;не будет соотвественно :)
MoveMouse(ПоловинаШириныЭкрана, ПоловинаВысотыЭкрана)

;Ограничиваем "переполнение" переменных и заодно устанавливаем макс. обзор камеры.
If (ПоворотПоY > 360) Then ПоворотПоY = 0
If (ПоворотПоY < 0) Then ПоворотПоY = 360
If (ПоворотПоX > 55) Then ПоворотПоX = 55
If (ПоворотПоX < -35) Then ПоворотПоX = -35

;Поворачиваем пивот камеры по вычисленным углам
RotateEntity(ПивотКамеры, ПоворотПоX, ПоворотПоY, 0)

Макс. обзор (вверх\вниз) можно сделать другим, но этот по-моему наиболее соотвествует "ГТАшному" :)

Далее нужно сделать движение игрока
Код:

If MouseDown(2) Then
    ;Сдвигаем тело игрока вперед
    MoveEntity(ТелоИгрока, 0, 0, СкоростьПеремещения)

    ;Узнаем координаты тела игрока
    ТелоИгрокаX = EntityX(ТелоИгрока)
    ТелоИгрокаY = EntityY(ТелоИгрока)
    ТелоИгрокаZ = EntityZ(ТелоИгрока)

    ;Позиционируем пивот камеры на место тела игрока (точнее его головы)
    ;в данном случае высота игрока 2 метра :) поэтому сдвигаем пивот от
    ;центра тела игрока вверх на 2 единицы
    PositionEntity(ПивотКамеры, ТелоИгрокаX, ТелоИгрокаY + 2, ТелоИгрокаZ)

    ;Проверяем разницу углов поворота тела игрока и пивота камеры
    ;Таким образом определяем скорость направления тела игрока
    ;на направление камеры - если игрок только начинает движение и
    ;камера направлена в сторону, то игрок будет направляться медленно,
    ;иначе - быстро
    ;Оператор Int нужен чтобы отбросить дробную часть полученого
    ;значения для "сглаживания" погрешности
    If Int(EntityYaw(ТелоИгрока) - EntityYaw(ПивотКамеры)) = 0 Then
        СкоростьНаправления = 1
    EndIf

    ;Направляем тело игрока по вектору Игрок-Камера, т.е. по направлению
    ;камеры, с заданной скоростью
    ;Но т.к. камера находится сзади, то вектор вычисляем не от игрока к
    ;камере, а наоборот от камеры к игроку
    AlignToVector(ТелоИгрока, ТелоИгрокаX - EntityX(Камера, 1), 0, ТелоИгрокаZ - EntityZ(Камера, 1), 3, СкоростьНаправления)

Else
    ;Если игрок не перемещается - ставим небольшую скорость
    ;направления, чтобы в начале перемещения игрок направлялся плавно
    СкоростьНаправления = 0.1
EndIf

Вот собственно и все, надеюсь поймешь :)
Смотри аттач с исходником, но там комментариев нет.

ЗЫ
А чего у вас со смайликами?:)


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

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