Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2011, 07:40   #11
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Что за таймер? По хорошему нужно событие!
Код:
DeltaX:=MouseCoord.X-OldX;
DeltaY:=MouseCoord.Y-OldY;

OldX:=MouseCoord.X;
OldY:=MouseCoord.Y;
И в конце:
Код:
DeltaX:=0;
DeltaY:=0;
Код:
if(teta>pi/2) then teta := pi/2;    // Честно немного не понимаю, но думаю что это для того,
 if(teta<=pi/2) then teta := -pi/2;  // чтобы не дать камере крутится вокруг своей оси
А ты поэкспериментируй. Закомментарь, или нули вместо pi/2 и -pi/2 поставь.

Последний раз редактировалось Kostia; 15.12.2011 в 07:45.
Kostia вне форума Ответить с цитированием
Старый 15.12.2011, 17:02   #12
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Что за таймер? По хорошему нужно событие!
т.е. Координаты должны быть left,right, а не мировые?
Цитата:
А ты поэкспериментируй. Закомментарь, или нули вместо pi/2 и -pi/2 поставь.
С радостью, но у меня ничего не работало. Сейчас изменю код и посмотрю.
--
Уже лучше, но как-то непредсказуемо. Я не могу понять от чего.
Пробовал комментировать
Код:
if(teta>pi/2) then teta := pi/2;    // Честно немного не понимаю, но думаю что это для того,
 if(teta<=pi/2) then teta := -pi/2;  // чтобы не дать камере крутится вокруг своей оси
Не помогает.
Далее OldX,OldY, teta, fi - глобальные
Код:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
deltaY,DeltaX,speed:Real;
begin
  speed:=0.01;

 DeltaX:=x-OldX;
 DeltaY:=y-OldY;

 OldX:=X;
 OldY:=Y;

 fi:=fi + DeltaX*speed;
 teta:=teta + DeltaY*speed;

 if(teta>pi/2) then teta := pi/2;
 if(teta<=pi/2) then teta := -pi/2;

 Vector.x:=sin(fi)*cos(teta);
 Vector.y:=sin(fi)*sin(teta);
 Vector.z:=cos(fi);

DeltaX:=0;
DeltaY:=0;
Я во вложения результат положил. Можете посмотреть то, что получается(С исходниками )
Вложения
Тип файла: zip Zal.zip (3.32 Мб, 22 просмотров)

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 15.12.2011, 22:07   #13
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Управление WASD + машь
Вложения
Тип файла: rar Zal.rar (43.5 Кб, 57 просмотров)
Kostia вне форума Ответить с цитированием
Старый 16.12.2011, 07:30   #14
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо Вам огромное. Как я понял, вся проблема скрывалась в переводе сферических координат в декартовы. С SetCursorPos у меня тоже идея была, я ее воплощал, но получалось не то, что надо.
За этот код отдельное спасибо.
Код:
if GetAsyncKeyState(83)<>0 then
begin
  Position.x := Position.x - Vector.x*0.1;
  Position.y := Position.y - Vector.y*0.1;
  Position.z := Position.z - Vector.z*0.1;
end;
if GetAsyncKeyState(87)<>0 then
begin
  Position.x := Position.x + Vector.x*0.1;
  Position.y := Position.y + Vector.y*0.1;
  Position.z := Position.z + Vector.z*0.1;
end;

if GetAsyncKeyState(65)<>0 then
begin
  Position.x := Position.x + cos(fi)*0.1;
 // Position.y := Position.y + Vector.y*0.1;
  Position.z := Position.z - sin(fi)*0.1;
end;
if GetAsyncKeyState(68)<>0 then
begin
  Position.x := Position.x - cos(fi)*0.1;
  //Position.y := Position.y + Vector.y*0.1;
  Position.z := Position.z + sin(fi)*0.1;
end;
Я задумывался, о том, как мне считать координаты перемещения.
Цитата:
А ты поэкспериментируй. Закомментарь, или нули вместо pi/2 и -pi/2 поставь.
Ну то что я и предполагал, только сформулировать не смог.
Еще раз спасибо.
p.s. Ну никак репу улучшить не могу, ограничение

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 16.12.2012, 18:48   #15
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Вот вспомнил, что была такая тема, и захотелось мне ее поднять т.к. тематика одна и таже - камера. Не много слов. После переезда на Linux мне стало жить легче, но появились некоторые особенности возникающие при написании кроссплатформенного кода. Возможно такой косяк будет наблюдаться и на Windows, но для этого мне нужно будет устанавливать на нее рабочую среду, чем после написания поста и займусь. Теперь к проблеме. Захотел сделать одну программку 3D, для нее нужна камера. Проблем с вычислениями нет, но вот реализация... Т.к. я сторонник кроссплатформенности мне ничего не остается кроме glut. Ничего против этой библиотеки не имею, но именно с ней у меня возникла такая ситуация. Сразу приведу код обработки мыши.
Цитата:
void MouseMove(int x, int y)
{
if ((x!=width/2)||(y!=height/2))
{
glutWarpPointer (width/2, height/2);
int DeltaX=width/2-x;
int DeltaY=height/2-y;

alpha=alpha+DeltaY*0.01;
beta =beta+DeltaX*0.01;
Vector.z=sin(alpha)*cos(beta);
Vector.x=sin(alpha)*sin(beta);
Vector.y=cos(alpha);
}
}
Элементарный. Жаль реагирует только тогда, когда сильно дернешь мышь. Т.е. управлять такой камерой просто невозможно. Т.е. если я буду просто вести мышь - ничего не получится, а если сильно дерну, то камера переместится на большое расстояние. Если мое описание не понятно - во вложениях полный исходник и исполняемый файл(linux), можете посмотреть. Обладателям других осей нужно просто откомпилировать исходник(укажите свои хедеры). Потом добавлю exe для Windows
Буду очень благодарен.

---
Случайно возникла гениальная мысль. Немного манипуляций с кодом и все работает.
Цитата:
void MouseMove(int x, int y)
{
int DeltaX=width/2-x;
int DeltaY=height/2-y;
alpha=alpha+DeltaY*0.01;
beta =beta+DeltaX*0.01;
Vector.z=sin(alpha)*cos(beta);
Vector.x=sin(alpha)*sin(beta);
Vector.y=cos(alpha);
if ((x!=width/2)||(y!=height/2))
{
glutWarpPointer (width/2, height/2);
}
}
Вопрос: почему? Знаю, что немного отошел от темы, но создавать ради этого новую неохота. Кстати под форточки предыдущий код работал.
Вложения
Тип файла: zip spherical system.zip (6.5 Кб, 26 просмотров)

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 16.12.2012 в 20:07.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 16.12.2012, 20:56   #16
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Код:
void MouseMove(int x, int y)
{
   if ((x!=(width >> 1))||(y!=(height >> 1)))
    {
       double DeltaX=(width*0.5-x)*0.001; //тут вы зачем-то нацело делили
       double DeltaY=(height*0.5-y)*0.001; //да и вдобавок переменные целого типа были

       alpha=alpha+DeltaY;
       beta =beta+DeltaX;
       Vector.z=sin(alpha)*cos(beta);
       Vector.x=sin(alpha)*sin(beta);
       Vector.y=cos(alpha);
       glutWarpPointer (width >> 1, height >> 1);
    }
}
Kostia вне форума Ответить с цитированием
Старый 16.12.2012, 22:26   #17
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
тут вы зачем-то нацело делили
Там же переменная целого типа была. Т.к. Разрешения мониторов в основном стандартные с четным количеством точек это не принципиально(мне так кажется).
Цитата:
да и вдобавок переменные целого типа были
А ведь и умножения не было. Почему тогда второй вариант кода работает не смотря на то, что вычисления не изменились?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 18.12.2012, 01:54   #18
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
Почему тогда второй вариант кода работает не смотря на то, что вычисления не изменились?
Очевидно из-за того что вы переменной целого типа присваивали вещественное. Вот код, который во вложении:

Код:
void MouseMove(int x, int y)
{
   if ((x!=width/2)||(y!=height/2))
    {
       glutWarpPointer (width/2, height/2);
       int DeltaX=(width/2-x)*0.01; //тут ошибка умножение на 0.01
       int DeltaY=(height/2-y)*0.01; //но переменная целая

       alpha=alpha+DeltaY;
       beta =beta+DeltaX;
       Vector.z=sin(alpha)*cos(beta);
       Vector.x=sin(alpha)*sin(beta);
       Vector.y=cos(alpha);
    }
}
Те варианты кода что в сообщении #15, оба работают!
Kostia вне форума Ответить с цитированием
Старый 19.12.2012, 07:05   #19
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Те варианты кода что в сообщении #15, оба работают!
И все-таки я не согласен. Первый в Linux не работает в сравнении с первым. А на форточках работают оба.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 19.12.2012, 07:42   #20
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
И все-таки я не согласен. Первый в Linux не работает в сравнении с первым. А на форточках работают оба.
Кхм, я под линуксом и проверил, те что в посте 15 все работают, кроме того что во вложении.
Только вот во втором варианте у вас бессмысленное вычисление происходит на смещение в 0 пикселов на каждое движение курсора, а в первом варианте все ok.
Kostia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает gluLookat SAMOUCHKA Qt и кроссплатформенное программирование С/С++ 2 23.09.2011 18:52
Вращение камеры вокруг своей оси [OpenGL] russian-stalker Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 14.04.2011 21:03
Direct3D9, вращение камеры. _-Re@l-_ Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 06.04.2011 20:49
Вращение камеры (Direct3D) AidarBik Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 24.07.2009 08:45