Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7

Поворот камеры вокруг target

25.12.2024, 02:23. Показов 7268. Ответов 61
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Потребовался создать управление камерой с помощью мыши для поворота её вокруг точки (0,0,0)
OpelGl я плохо знаю, только второй день погружаюсь. Но знаю математику.
И получился у меня вот такой код, который по результату работы устраивает, но не устраивает по громоздкости и сложности вычислений.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
procedure TForm1.FormCreate(Sender: TObject);
begin
...
  zf:=200;xf:=200;yf:=0;
end;         
...
//--Вычисление угла по X и Y на плоскости.
function Angle(x,y:double):double;
begin
if (Abs(x)<0.00000001) and (y>0) then begin Result:=90;exit;end;
if (Abs(x)<0.00000001) and (y<0) then begin Result:=-90;exit;end;
if (Abs(y)<0.00000001) and (x>0) then begin Result:=0;exit;end;
if (Abs(y)<0.00000001) and (x<0) then begin Result:=180;exit;end;
if (x>0) and (y>0) then begin Result:=arctan(y/x)*180/PI;exit;end;
if (x>0) and (y<0) then begin Result:=arctan(y/x)*180/PI;exit;end;
if (x<0) and (y>0) then begin Result:=180+arctan(y/x)*180/PI;exit;end;
if (x<0) and (y<0) then begin Result:=-180+arctan(y/x)*180/PI;exit;end;
end;     
...
//--Движение мыши подъём и поворот
procedure TForm1.GLBoxMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var teta,dt,x1,y1,r:Extended;
begin
//---Поворот вокруг оси y=ax (подъём, фи,тэта)
if (down=1) and not(ssCtrl in Shift) then
   begin
   dt:=YS-Y;
   fiz:=Angle(xf,yf);
   r:=Sqrt(xf*xf+yf*yf+zf*zf);
   teta:=arccos(zf/r)*180/PI;
   teta:=teta+dt/2;
   if (teta<0) or (teta>90) then exit;
   xf:=r*cos(fiz*PI/180)*sin(teta*PI/180);
   yf:=r*sin(fiz*PI/180)*sin(teta*PI/180);
   zf:=r*cos(teta*PI/180);
   YS:=Y;Draw;exit;
   end;
//---Поворот вокруг оси Z (фи)
if (down=1) and (ssCtrl in Shift) then
   begin
   dt:=XS-X;dt:=dt/5;
   fiz:=dt*PI/180;
   x1:=xf*cos(fiz)-yf*sin(fiz);
   y1:=xf*sin(fiz)+yf*cos(fiz);
   xf:=x1;
   yf:=y1;
   Draw;XS:=X;exit;
   end;
end;      
...            
//---Зум
procedure TForm1.GLBoxMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var r,r2,rp,rp2,xa,ya,za:double;
begin
r:=Sqrt(xf*xf+yf*yf+zf*zf);
if WheelDelta<0 then rp:=r+5 else rp:=r-5;
r2:=r*r;
rp2:=rp*rp;
xa:=Sqrt(xf*xf*rp2/r2);
ya:=Sqrt(yf*yf*rp2/r2);
za:=Sqrt(zf*zf*rp2/r2);
xf:=xa*sign(xf);
yf:=ya*sign(yf);
zf:=za*sign(zf);
Draw;
end;      
...
//--Рисование
procedure TForm1.Draw;
begin
...
gluLookAt(xf,yf,zf,0,0,0,0,0,1); //---Изменение положения камеры
...
end;
Видео:
https://cloud.mail.ru/public/kqpB/3A7QH2JTU

Вопрос: Я знаю, что в OpenGl есть механизмы, позволяющие существенно упростить этот код (glRotatef, glTranslatef). Но как их применить в данном случае, не знаю.

Добавлено через 6 минут
Если можно, без общих рассуждений.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.12.2024, 02:23
Ответы с готовыми решениями:

Поворот камеры
Юзаю box2d ... нужно повернуть камеру на определённое кол-во градусов. Я хз как сделать.. в итоге камера(ну сам прямоугольник) превращается...

Поворот объекта вокруг оси
Здравствуйте. Знаю что подобная тема уже поднималась на форуме, но интересующий меня ответ я не нашёл:(. Пробовал искать (Гуглить:)), но...

Поворот колеса вокруг центра
Привет Решил побаловаться с OpenGL и написать простенький просмотрщик .obj моделей. Использую c# и opentk Машина отображается...

61
9987 / 2959 / 497
Регистрация: 05.10.2013
Сообщений: 8,102
Записей в блоге: 243
20.04.2025, 21:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Igor3D Посмотреть сообщение
Сидеть со старьем совершенно бесперспективно. Посмотрите частоту постов в этом разделе форума. Этот бобик давно сдох. И учтите - данный переход на новые технологии это еще по-божески, гуманно.
Если вы создаёте ПО и люди скачивают EXE, то им всё равно написано ли это ПО - на OpenGL v1 с glBegin/glEnd или чём-то другом. Тем более, если это хобби. Мне количество постов ни о чём не говорит в плане того использовать OpenGL, Vulkan или DirectX 12. Если бы на форуме публиковалось по 5 сообщений в день по Vulkan и столько же по DirectX 12, то был бы другой разговор. Либо по одной теме в день по Vulkan, или хотя бы одна тема в неделю. Мягко говоря на форуме, по OpenGL публикуется больше сообщений, чем по Vulkan и больше чем по DirectX вместе взятые. Более того, я попробовал поискать через поиск форума, когда была крайняя тема по Vulkan, но не нашёл ни одной. Вывод такой, что надо использовать то, что нравится, что в данный момент удобно, а не то, что советуют.

Не по теме:

Для интереса проверил, сколько публиковали тем 10-11 лет назад. Я пролистал раздел OpenGL до 2014 года, до 65-й страницы. Тогда стабильно создавалось хотя бы 2-3 темы каждый день, а иногда по 5-7. Почти 100% тем было по OpenGL v1 от студентов. Например, на странице 65: https://www.cyberforum.ru/opengl-page65.html 26 мая 2014 года было создано целых 7 тем за один день. Мог повлиять демографический провал 2000-х. Я нагуглил, что пик превышения смертности над рождаемостью был в 2003 году. А так же могло повлиять обучение школьников Unity, но в разделе Unity тоже значительно снизилось количество тем в день.



Igor3D, по поводу OpenGL, Vulkan и движков лучше продолжить в этой теме: Что учат дети?
0
400 / 36 / 7
Регистрация: 09.01.2019
Сообщений: 147
21.04.2025, 09:46
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Модель и текстуры нашёл в интернете по ссылке
О, спасиб за ссыль, это мне нужно. Я знал про https://www.spriters-resource.com, вырезанные спрайты туда выгружал, а вот версию сайта с низкополигональными моделями как-то умудрился пропустить
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.04.2025, 09:46

Поворот вокруг произвольной оси в пространстве
Готовлюсь к экзамену, говорят препод ловит на всяких двусмысленностях и неправильных формулировках, поэтому обращаюсь к Вам с вопросом:как...

Загадочный поворот вокруг оси x в OpenGL
Доброго времени суток всем. Мучаюсь над одной проблемой, а именно: поворот вокруг оси x с помощью glRotatef(xRotate, 1.0, 0.0, 0.0) На...

Поворот вокруг своей оси (blender)
Глупый вопрос, но всёравно задаю его. Как повернуть объект вокруг своей оси? (либо я чтото не понимаю..либо координаты blender не как...

Поворот камеры. Не могу разобраться
Сделал, как советовали на хабре, но не работает( gluLookAt(CamX, 1, CamZ, CamX+AngleX, 1, CamZ + 2+AngleZ, 0, 1, 0); ...... ...

Перемещение камеры вокруг объекта
Как используя лишь gluLookAt добиться вращения наблюдателя вокруг объекта по заданной оси (по часовой стрелке)? Добавлено через 1 час...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
62
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru