Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 56

Получить положение камеры

18.12.2023, 10:49. Показов 5285. Ответов 66
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите составить формулу. Нужно в игре развернуть камеру таким образом чтобы она смотрела на координаты точки, которые я задам. Есть 2 переменные, которые отвечают за поворот персонажа. Первая переменная float относительно X её значения от -1 до 1. И точно так же переменная Y. Вот допустим персонаж находится на координатах x: 0, y: 0. А повернуть камеру надо чтобы она смотрела на координаты x: 50 y: 50. Надо составить какую то формулу, которая будет определять в какую сторону нужно повернуться, чтобы смотреть на нужные координаты.

Вот для примера координаты персонажа, координаты на которые он смотрит и значение камеры.

Char Coords x:0 y:0
Object Coords x:10 y:0
Camera value x:1 y:0

Char Coords x:0 y:0
Object Coords x:0 y:10
Camera value x:0 y:1

Char Coords x:0 y:0
Object Coords x:-10 y:0
Camera value x:-1 y:0

Char Coords x:0 y:0
Object Coords x:0 y:-10
Camera value x:0 y:-1

Char Coords x:0 y:0
Object Coords x:10 y:10
Camera value x:0.70 y:0.70

Char Coords x:0 y:0
Object Coords x:-10 y:-10
Camera value x:-0.70 y:-0.70

Нужна функция которая будет принимать координаты персонажа и координаты объекта и возвращать правильные переменные для камеры.

C++
1
2
3
4
5
6
7
8
9
10
11
void GetCameraPosition(const float x1, const float y1, const float x2, const float y2, float* CameraBufferX, float* CameraBufferY) 
{
...
}
 
float CameraX;
float CameraY;
 
GetCameraPosition(0, 0, -10, -10, CameraX, CameraY); 
// CameraX = -0.70
// CameraY = -0.70
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.12.2023, 10:49
Ответы с готовыми решениями:

Получить положение курсора (Си)
я знаю что этот код задает положение курсора, но мне нужно ПОЛУЧИТЬ его #include <stdio.h> #include <windows.h> int...

Положение камеры
Добрый день. Это уже тема всплывала на геймдеве, но тем не менее. Пробую получить координаты камеры вот таким способом: Что-то все...

Положение камеры
Времени суток. Пишем движение камеры,и заступорились на одном моменте: задали начальное положение, описали движение...

66
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,215
Записей в блоге: 2
19.12.2023, 09:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Royal_X Посмотреть сообщение
и там у них у функции волны нужны тригонометрические функции. Согласен, для простого стекла или простой воды они не нужны.
Ну в этих ф-циях ничего плохого нет, и производительность они не садят. Как всегда, главное "не злоупотреблять".

Цитата Сообщение от Royal_X Посмотреть сообщение
ну я вот по таким рецептам учился https://godotshaders.com/shader/realistic-water/
Вот шейдер, смотрите что он делает! Смотрим - да, впечатляет. Берем этот шейдер и пытаемся сделать что-то ну "совсем простое", напр стакан воды. Пыхтим-пыхтим, ну.. что-то получаем, но ... гордиться совершенно нечем, такое лучше не показывать. Выходит, нас обманули с этим шейдером? Или как? Или для "простой воды" нужен другой шейдер?

Однако ж мы увлеклись
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 56
19.12.2023, 14:55  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
WEewt345, наверное, лучше сделать так, чтобы GetCameraPosition также записывала угол. Так будет легче для поворота. Все равно, интерполяцией x и y камеры поворот будет отстойным. Лучше по углу интерполировать.
Да, так и сделал. Там переменная угла может быть положительным и отрицательным числом.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6339 / 3072 / 1054
Регистрация: 01.06.2021
Сообщений: 11,791
19.12.2023, 15:02
WEewt345, вот, видишь, что функция нормализации с тригонометрическими функциями оказалась полезной. Кроме самой нормализации, ещё и угол вычисляет)

WEewt345, конечно, в будущем лучше делать с помощью кватернионов, но если игра простая, сейчас на один раз так сойдет
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
19.12.2023, 15:12
Цитата Сообщение от Royal_X Посмотреть сообщение
Кроме самой нормализации, ещё и угол вычисляет)
Только зачем? В итоге мы пришли к тому, что нормализация для задачи вообще не нужна, т.е. исходный вопрос был ниочем.
Если не используем кватернионы (да и вообще не слышали про математические библотеки для игр), то нам нужно только два угла - текущее направление и направление на объект, и дальше интерполяция для анимации. Ну а как ТС это реализует используя только два угла, я бы посмотрел .
0
19.12.2023, 15:17

Не по теме:

zayats80888, я не знаю, нужна ли ТС нормализация или нет? Я написал, что он просил. Общайся с ним, ему задавай вопросы, ему помогай, а не мне... ;) Если есть идеи, то не стесняйся, пиши. Советуй ему более правильные решения. Форум общий, я как бы не стал его опекуном из-за того, что пару раз ему ответил)

0
19.12.2023, 15:28

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
Общайся с ним, ему задавай вопросы, ему помогай, а не мне... ;)
Ну как-то Вы выглядите более привлекательным для общения :)

0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
19.12.2023, 15:49
Цитата Сообщение от Igor3D Посмотреть сообщение
У нормальных людей это называется reference (точка куда смотрит камера или источник света). Эту точку и нужно интерполировать (только перед нормализацией), не видно смысла вычислять где лево/право
А как интерполировать-то?

Добавлено через 44 секунды

Не по теме:

Цитата Сообщение от Igor3D Посмотреть сообщение
Ну как-то Вы выглядите более привлекательным для общения :)
От ТСа обратной связи нет... Не общительный он )

0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,215
Записей в блоге: 2
19.12.2023, 16:37
Цитата Сообщение от zayats80888 Посмотреть сообщение
А как интерполировать-то?
Такой задачи нет для reference, она решается сама. Она движется - ну и целимся в нее камерой, типа "куда дуля - туда дым". За этим ее собсно и заводят
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
19.12.2023, 16:57
Цитата Сообщение от Igor3D Посмотреть сообщение
За этим ее собсно и заводят
Ну т.е. в контексте задачи ТС она не нужна
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,215
Записей в блоге: 2
19.12.2023, 17:12
Цитата Сообщение от zayats80888 Посмотреть сообщение
Ну т.е. в контексте задачи ТС она не нужна
Нет, как и нормализация, хранят точку reference, иногда даже указатель на объект
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 56
19.12.2023, 17:18  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
WEewt345, вот, видишь, что функция нормализации с тригонометрическими функциями оказалась полезной. Кроме самой нормализации, ещё и угол вычисляет)
Нет, к сожалению не работает. Персонаж стоит на месте и объект тоже. И от того что угол отрицательный или положительный, никак не помогает определить в кукую сторону лучше повернуть чтобы смотреть на объект
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6339 / 3072 / 1054
Регистрация: 01.06.2021
Сообщений: 11,791
19.12.2023, 17:58
Цитата Сообщение от WEewt345 Посмотреть сообщение
Персонаж стоит на месте и объект тоже.
а при чём здесь та функция GetCameraPosition? Она что должна была кого-то двигать)

Цитата Сообщение от WEewt345 Посмотреть сообщение
И от того что угол отрицательный или положительный, никак не помогает определить в кукую сторону лучше повернуть чтобы смотреть на объект
тут нужно углы сравнивать, а не знаки)
но т.к. atan2 может возвращать отрицательный угол, то можно возвращаемый данной функций угол нормализировать:
C++
1
2
if (angle < 0)
        angle += 2.*std::acos(-1.);
Теперь после нормализации угол будет от 0 до 2*pi
Надеюсь вы можете два угла сравнить... и на основе сравнения решать, как вращать (по часовой или против)


но, мне кажется, что вот эта идея лучше:
Цитата Сообщение от Igor3D Посмотреть сообщение
У нормальных людей это называется reference (точка куда смотрит камера или источник света). Эту точку и нужно интерполировать (только перед нормализацией), не видно смысла вычислять где лево/право
надеюсь, Igor3D, детально объяснит вам, как интерполировать
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 56
19.12.2023, 21:00  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Теперь после нормализации угол будет от 0 до 2*pi
Надеюсь вы можете два угла сравнить... и на основе сравнения решать, как вращать (по часовой или против)
После нормализации у меня угол от 0 до 6,2.
Какие 2 угла надо сравнить?
Первый угол это координаты персонажа и объекта? А какой тогда второй?
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6339 / 3072 / 1054
Регистрация: 01.06.2021
Сообщений: 11,791
19.12.2023, 21:06
Цитата Сообщение от WEewt345 Посмотреть сообщение
После нормализации у меня угол от 0 до 6,2
потому что углы в радианах: 360° = 2*PI ≈ 6.28319
Цитата Сообщение от WEewt345 Посмотреть сообщение
Какие 2 угла надо сравнить?
угол, который был до поворота, и новый угол
Цитата Сообщение от WEewt345 Посмотреть сообщение
Первый угол это координаты персонажа и объекта? А какой тогда второй?
нет, как координаты могут быть углом???
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 56
19.12.2023, 21:15  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
нет, как координаты могут быть углом???
Я имею ввиду, координаты персонажа это первая точка, вторая точка это x:0 y:0, третья точка это координаты объекта. Получается угол.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6339 / 3072 / 1054
Регистрация: 01.06.2021
Сообщений: 11,791
19.12.2023, 21:31
WEewt345, допустим, персонаж находится на точке (0, 0), а твоя камера смотрела на точку (50, 50). Ты хочешь, чтобы она теперь смотрела на точку (50, 20). И вот, как я понял, ты хочешь понять, как поворачивать камеру (против или по часовой стрелке).
Когда камера смотрела на точку (50, 50) угол равен 0.785398 -> 45°
Когда камера смотрит на точку (50, 20) угол равен 0.380506 -> 21,8°
И теперь подумай, как поворачивать камеру?
Миниатюры
Получить положение камеры  
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 56
19.12.2023, 22:03  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
И теперь подумай, как поворачивать камеру?
У меня 2 переменные, которые могут принимать значения от -1 до 1. Я начинаю поворачивать камеру и когда значения совпадают с результатом из функции GetCameraPosition, я перестаю поворачивать камеру.

C++
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
if (x1 > -1 && x1 < 0 && y1 > 0 && y1 <  1)  char_position = 1;
if (x1 >  0 && x1 < 1 && y1 > 0 && y1 <  1)  char_position = 2;
if (x1 >  0 && x1 < 1 && y1 < 0 && y1 > -1)  char_position = 3;
if (x1 > -1 && x1 < 0 && y1 < 0 && y1 > -1)  char_position = 4;
 
if (x2 > -1 && x2 < 0 && y2 > 0 && y2 <  1)  Object_position = 1;
if (x2 >  0 && x2 < 1 && y2 > 0 && y2 <  1)  Object_position = 2;
if (x2 >  0 && x2 < 1 && y2 < 0 && y2 > -1)  Object_position = 3;
if (x2 > -1 && x2 < 0 && y2 < 0 && y2 > -1)  Object_position = 4;
 
if(char_position == 1 && Object_position == 1) {
 if(x1 > x2) TurnLeft()
 if(x1 < x2) TurnRight()
}
if(char_position == 1 && Object_position == 2) TurnRight();
if(char_position == 1 && Object_position == 3) ?
if(char_position == 1 && Object_position == 4) TurnLeft();
 
if(char_position == 2 && Object_position == 1) TurnLeft();
if(char_position == 2 && Object_position == 2) {
 if(x1 > x2) TurnLeft()
 if(x1 < x2) TurnRight()
}
if(char_position == 2 && Object_position == 3) TurnRight();
if(char_position == 2 && Object_position == 4) ?;
 
if(char_position == 3 && Object_position == 1) ?;
if(char_position == 3 && Object_position == 2) TurnLeft();
if(char_position == 3 && Object_position == 3) {
  if(x1 > x2) TurnRight()
  if(x1 < x2) TurnLeft()
}
if(char_position == 3 && Object_position == 4) TurnRight();
 
if(char_position == 4 && Object_position == 1) TurnRight();
if(char_position == 4 && Object_position == 2) ?;
if(char_position == 4 && Object_position == 3) TurnLeft();
if(char_position == 4 && Object_position == 4) {
  if(x1 > x2) TurnLeft()
  if(x1 < x2) TurnRight()
}
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6339 / 3072 / 1054
Регистрация: 01.06.2021
Сообщений: 11,791
19.12.2023, 22:50
WEewt345,
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 56
19.12.2023, 23:26  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
WEewt345,
Я разделил круг на 4 части и определил в какой из частей находится камера, а в какой находится объект и в соответствии с этим определил в какую сторону лучше всего вращать камеру. Ну уж до чего додумался, в свои 6 лет. Код работает, если есть желание объясни как сделать правильно.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6339 / 3072 / 1054
Регистрация: 01.06.2021
Сообщений: 11,791
19.12.2023, 23:30
Цитата Сообщение от WEewt345 Посмотреть сообщение
в свои 6 лет
а мама знает, чем ты занимаешься?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.12.2023, 23:30

Указать положение камеры в SlimDX 11
Здравствуйте, дорогие форумчане! До этого я работал c DirectX9 на С#, и там все было понятно с установкой положения камеры ...

Положение камеры чтобы влез объект
Всем привет! Как сделать так, чтобы камера перемещалась к объектам разного размера на нужное расстояние?

Рассчитать положение креста в изображении с веб-камеры
Господа прошу помощи. Есть ли есть возможность подсказать прошу. Суть в том что в окне есть изображение с камеры допустим + крест. Нужно...

Изменить положение камеры не меняя фокус - Helix Toolkit 3D
Меняю &lt;PerspectiveCamera x:Name=&quot;MyCamera&quot; Position=&quot;0,0,200&quot; LookDirection=&quot;0,0,-1&quot; /&gt; вместе с камерой меняется и центр вращения. Как...

Приложение крашится если после вызова камеры поменять положение на горизонталь
Добрый день, Вызывается камера для захвата картинки и дальнейшей передачи по сети. Когда снимаю вертикально все работает корректно, когда...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru