Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7

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

25.12.2024, 02:23. Показов 7405. Ответов 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
9988 / 2960 / 497
Регистрация: 05.10.2013
Сообщений: 8,128
Записей в блоге: 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
401 / 36 / 8
Регистрация: 09.01.2019
Сообщений: 148
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru