Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenGL: работа с камерой 
:(
    Опции темы
Ripper
Дата 7.1.2005, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



ой... чет все кнопки местами поменялись=) незнаю не могу почуствовать как в любой игре движение .. у меня все как то криво.. вот я написал (cos(alpha*pi/180), sin(alpha*pi/180), 0);
и на кнопку повесил увиленичение/уменьшение alpha.. ну по окружности я могу менять взгяд
но во первых поменялись кнопки т.е. раньше если кнопка d - движениие вправо то сейчас вверх =)
И я же не могу "голову" ака камеру повернуть вверх допустим??
Все таки если представить что камера это допустим косм. корабль а сфера - планета.. я не могу свободно перемещатся в космосе smile хотя в играх участвует мышка для поворота но можно хоть 15 клавиш зайдесвовать... (я не хотю игру писать я просто пример привожу...)
вообще хочу сделать небольшой уровень чтоб ходить по нему можно было =)


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
p0s0l
Дата 8.1.2005, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Блин, я тебя вообще неправильно понял smile
Ты про одно, я про другое smile
То что я тебе сказал - забудь smile

Делай так, как в примере с цилиндрами.
Без sin/cos тут не обойтись...

Блин, если бы не сессия, я бы накидал примерчик "беганья по уровню", с комментариями и объяснениями...
А так пока не могу...



--------------------
С уважением, г-н Посол.
PM   Вверх
Ripper
Дата 8.1.2005, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



да ладно ничего =)
Помойму я догнал немного... можно ведь менять это.. координаты куда я смотрю для поворота объекта.. ну допустим иду я вперед (это уже есть) прохожу куб.. но взглянуть я на него не смогу т.е. повернутся на право. на какую нить кнопку вешаю например чтобы координата куда я смотрю по Х менялась..значит будет поворот либо вправо либо влево
Во как


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
p0s0l
Дата 8.1.2005, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Цитата(Ripper @ 8.1.2005, 12:12)
можно ведь менять это.. координаты куда я смотрю для поворота объекта.. ну допустим иду я вперед (это уже есть) прохожу куб.. но взглянуть я на него не смогу т.е. повернутся на право. на какую нить кнопку вешаю например чтобы координата куда я смотрю по Х менялась.
Да... Но это как-то криво будет.
Правильнее так:

alpha - угол поворота вокруг оси Y

тогда перемещение камеры вперед будет так:
Код
cam_x := cam_x + cos(alpha)*cam_speed; // cam_speed - скорость перемещения
cam_z := cam_z + sin(alpha)*cam_speed;

Теперь, координаты цели высчитываются от координаты камеры и угла поворота так:
Код
look_x := cam_x + cos(alpha);
look_z := cam_z + sin(alpha);

А координаты y пока пусть совпадают...

Вот и все дела...
На действия мыши (OnMouseMove) повесь изменения угла alpha при движении мышью влево-вправо.
Движение назад, влево и вправо, думаю, легко догадаться как сделать. Например, движение влево будет аналогично движению вперед, только угол поворота уменьшаем на 90 градусов (т.е. pi/2):
Код

cam_x := cam_x + cos(alpha-pi/2)*cam_speed;
cam_z := cam_z + sin(alpha-pi/2)*cam_speed;

(хотя можно и немного легче, но не буду запутывать...)

Это сообщение отредактировал(а) p0s0l - 8.1.2005, 14:11


--------------------
С уважением, г-н Посол.
PM   Вверх
Ripper
Дата 8.1.2005, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Ой.. долго пробывал.. незнаю... че то не совсем я эту вещь догоняю =)
Ну получлось но не совсем то опять... вот я двигатся могу все нормально. могу поворачивать голову.. но после поворота.. как бы сказать.. вот я иду допустим по дороге вперед. повернул голову. смотрю вправо а идти продолжаю вперед =) а мне надо раз я голову повернул то идти туда куда повернул... т.е. поворот есть а движение в сторону поворота нету. И как на мышку повесить изменение угла?))
вот что у меня получилось (с цилиндров взял):
Код

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
key:=UpCase(key);
case Key of
   'W':
    begin
     cam_x := cam_x + sin((alpha+90)*d2r)*cam_speed;
     cam_z := cam_z + cos((alpha+90)*d2r)*cam_speed;
    end;
   'S':
    begin
     cam_x := cam_x + sin((alpha-90)*d2r)*cam_speed;
     cam_z := cam_z + cos((alpha-90)*d2r)*cam_speed;
    end;
  'A':
    begin
     cam_x := cam_x - sin(alpha*d2r)*cam_speed;
     cam_z := cam_z - cos(alpha*d2r)*cam_speed;
    end;
  'D':
    begin
     cam_x := cam_x + sin(alpha*d2r)*cam_speed;
     cam_z := cam_z + cos(alpha*d2r)*cam_speed;
    end;
  'E' :
  begin
   alpha := alpha + 1;
 end;
  'Q' :
   begin
    alpha := alpha - 1;
   end;
 end;
 InvalidateRect (Handle, nil, False)
end;

Только где ты говорил про движение влево у меня почему то он идет прямо ?
кстати
alpha:=0;
cam_speed:=0.1;
и в прорисовке:

gluLooKAt(cam_x,cam_y,cam_z,
cam_x + cos(alpha*d2r)*cam_speed,
cam_y,
cam_z + sin(alpha*d2r)*cam_speed,
0,1,0);


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
p0s0l
Дата 8.1.2005, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Ошибка в том, что если у тебя используется синус и косинус при движении для x и z, а в gluLookAt - наоборот, для z и x соответственно... А нужно, чтобы было одинаково... Поэтому и получается, что идешь прямо, но смотришь влево (или вправо...)...
Т.е. сделай так:
Код
gluLooKAt(cam_x,cam_y,cam_z,
cam_x + sin(alpha*d2r)*cam_speed,
cam_y,
cam_z + cos(alpha*d2r)*cam_speed,
0,1,0);


Цитата(Ripper @ 8.1.2005, 18:05)
И как на мышку повесить изменение угла?))
Можно как-нибудь так:

Код
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
 cx, cy, dx, dy : integer;

begin
// если нет фокуса, то нафиг, на мышь не реагируем
 if not Focused then Exit;

// это чтобы не было видно курсора, можно в инспекторе объектов убрать
 Cursor := crNone;

// центр формы
 cx := ClientWidth div 2;
 cy := ClientHeight div 2;

// насколько пикселов сместилась мышь
 dx := cx - x;
 dy := cy - y;

 if (dx = 0) and (dy = 0) then Exit;

// поворот по горизонтали
 alpha := alpha + dx;

// dy - оставлен на будущее :)

// мышь - в центр формы...
 Mouse.CursorPos := ClientToScreen(Point(cx, cy));
end;




--------------------
С уважением, г-н Посол.
PM   Вверх
Ripper
Дата 8.1.2005, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



ТЫксь.. все работает... классна smile
Теперь надо думать насчет поворота вверх и полета =) ехх..



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1484 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.