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

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

18.12.2023, 10:49. Показов 5110. Ответов 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
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,123
Записей в блоге: 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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6316 / 3040 / 1054
Регистрация: 01.06.2021
Сообщений: 11,588
19.12.2023, 15:02
WEewt345, вот, видишь, что функция нормализации с тригонометрическими функциями оказалась полезной. Кроме самой нормализации, ещё и угол вычисляет)

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

Не по теме:

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

0
19.12.2023, 15:28

Не по теме:

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

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

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

Не по теме:

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

0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,123
Записей в блоге: 2
19.12.2023, 16:37
Цитата Сообщение от zayats80888 Посмотреть сообщение
А как интерполировать-то?
Такой задачи нет для reference, она решается сама. Она движется - ну и целимся в нее камерой, типа "куда дуля - туда дым". За этим ее собсно и заводят
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
19.12.2023, 16:57
Цитата Сообщение от Igor3D Посмотреть сообщение
За этим ее собсно и заводят
Ну т.е. в контексте задачи ТС она не нужна
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,123
Записей в блоге: 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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6316 / 3040 / 1054
Регистрация: 01.06.2021
Сообщений: 11,588
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6316 / 3040 / 1054
Регистрация: 01.06.2021
Сообщений: 11,588
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6316 / 3040 / 1054
Регистрация: 01.06.2021
Сообщений: 11,588
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6316 / 3040 / 1054
Регистрация: 01.06.2021
Сообщений: 11,588
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6316 / 3040 / 1054
Регистрация: 01.06.2021
Сообщений: 11,588
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
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru