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

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

18.12.2023, 10:49. Показов 5055. Ответов 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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,574
18.12.2023, 21:10
Студворк — интернет-сервис помощи студентам
WEewt345, наверное, лучше сделать так, чтобы GetCameraPosition также записывала угол. Так будет легче для поворота. Все равно, интерполяцией x и y камеры поворот будет отстойным. Лучше по углу интерполировать.

Добавлено через 7 минут
zayats80888, а как же собираешься реализовать dot без тригонометрии (без косинуса)? Ты же считаешь, что нельзя их использовать, они медленные). На самом деле, я согласен, векторное произведение это один из самых распространенных методов определения стороны, в которую смотрит персонаж в играх. Вообще, без тригонометрии в играх никак...
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.12.2023, 21:13
Цитата Сообщение от Royal_X Посмотреть сообщение
dot
Так обычно скалярное произведение обзывают (т.к. точка).
Векторное называют cross (т.к. крестик).
Цитата Сообщение от Royal_X Посмотреть сообщение
без тригонометрии
Сурьёзно? Зачем она тут?

Вот так.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,574
18.12.2023, 21:15
zayats80888, для поиска направления нужен dot, а не cross. Хотя, может и cross работает. Но даже для cross нужна функция sin.
Миниатюры
Получить положение камеры  
0
18.12.2023, 21:18

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
для поиска направления нужен dot, а не cross
Неужели? Имеем два вектора на плоскости, требуется узнать направление кратчайшего поворота первого ко второму. Реализуй через скалярное произведение, пожалуйста. Я гляну.

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,574
18.12.2023, 21:20
zayats80888, я не знаю, что ты называешь cross. Мне казалось, что этим словом называют это:
Миниатюры
Получить положение камеры  
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,574
18.12.2023, 21:21
zayats80888, ладно, делай, как хочешь. Главное, чтобы ТС был доволен.
Смотри на картинку , как реализовать через dot
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.12.2023, 21:23

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
Мне казалось, что этим словом называют это
Да, но это всего лишь определение.
Линейная алгебра поможет тебе посчитать его без тригонометрии, используя только координаты.



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
Смотри на картинку , как реализовать через dot
Не вижу я там, как определить направление. Ты мне в коде покажи или формулой, как тебе проще.

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,574
18.12.2023, 21:24
zayats80888, да, но у ТС функция через atan2 уже дает нам угол. Почему его не использовать? Ладно, забей. Делай по-своему. Может ТС понравится так больше.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.12.2023, 21:26

Не по теме:

А я напомню, что скалярное произведение коммутативно, а вот векторное антикоммутативно.



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
Делай по-своему.
Мне то зачем оно?
Если тебе не интересно, я умолкаю. Что касается ТС, то оно бесполезно, имхо.

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,574
18.12.2023, 21:35
zayats80888, мне интересно, но я потом посмотрю. Я очень занят. Но через неделю я вернусь в эту тему и попытаюсь вспомнить линейную алгебру)

Добавлено через 5 минут
zayats80888, я просто столько использовал готовых функций, что забыл мат часть. Будет хорошо, если ты покажешь. Я обязательно потом зайду в эту тему.

А потом, может я напишу для ТС, как это сделать, используя угол из функции, которую я написал, с atan2. У меня есть идея использовать этот угол.
0
18.12.2023, 21:43

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
Будет хорошо, если ты покажешь.
А что там показывать? Я вроде объяснил. Осталось дело техники. Кстати, в постах по ссылке, что я дал, есть этот момент с векторным поизведением и направлением поворота, где я разяснял подробно, можешь почитать.
А что на самом деле ТС хочет, а именно как связаны его два вопроса, я так и не понял.

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,574
18.12.2023, 21:52

Не по теме:

zayats80888, как оно работает в теории, я это понимаю. Имею в виду, что я могу погуглить и о векторном произведении и о скалярном. Тут больше меня интересовало, как это будет выглядеть в конечном коде ТС. Ты мне сказал, что брось тригонометрию, нормализируй без нее. Сейчас для направления советуешь векторное произведение. Это уже сколько операций? Чет уже сомнения касательно оптимизации. А вот, если нормализировать так, как сделал я через atan2, cos, sin, то у нас уже есть угол. По сути, нужно сравнивать 2 угла и на основе сравнения решать, в какую сторону поворачивать. Но может я не так понимаю всю картину? Поэтому хотел посмотреть на конечный код, с твоей нормализацией и со всем прочим. Ну ок, пусть ТС читает и разбирается.


WEewt345, лучше создай новый вопрос, т.к. по правилам форума нельзя так постепенно закидывать новыми вопросами. На твой изначальный вопрос я уже ответил. А это уже другой вопрос.
0
18.12.2023, 21:57

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
Потому хотел посмотреть на конечный код, с твоей нормализацией и со всем прочим.
Так ты мне конкретную задачу поставь, дано, найти и т.д.
Я же говорю, что там ТС пытается, я так и не понял.

Добавлено через 2 минуты
Если ТС пытается реализовать автоповорот к цели с возможностью интерполяции, то в нормальном геймдеве это сделают через кватернионы.

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,574
18.12.2023, 22:17
zayats80888, я задачу так понял:
Есть персонаж, который имеет координаты x1,y1. На расстоянии 1 от персонажа есть камера с координатами CameraBufferX, CameraBufferY. Есть точка x2,y2. Суть в том, что камера поворачивается по кругу вокруг персонажа так, что она смотрит на эту точку (x2,y2). На входе известны x1,x2,x2,y2. Координаты камеры я уже показал как найти. Т.е. ТС теперь знает, как получить координаты камеры. Но он, наверное, хочет интерполировать вращение.
Поэтому он написал
Ну допустим положение камеры

Текущее x: 0,109 y:-0,994
Нужно повернуть x: 0,998 y:-0,06

Соответственно нужно определить в какую сторону вращать камеру, по часовой стрелке или против часовой. При вращении в какую сторону он быстрее доберется до правильного положения.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,117
Записей в блоге: 2
18.12.2023, 22:17
Цитата Сообщение от Royal_X Посмотреть сообщение
Смотри на картинку , как реализовать через dot
Ну через dot можно только узнать <> 90 (косинус - четная ф-ция). А вообще да, есть народная примета: если решение использует вызовы тригонометрических ф-ций (напр sin, cos и др) то оно может и верное, но слабенькое. Хороший тон - использовать операции с векторами.

Цитата Сообщение от Royal_X Посмотреть сообщение
WEewt345, наверное, лучше сделать так, чтобы GetCameraPosition также записывала угол. Так будет легче для поворота. Все равно, интерполяцией x и y камеры поворот будет отстойным. Лучше по углу интерполировать.
У нормальных людей это называется reference (точка куда смотрит камера или источник света). Эту точку и нужно интерполировать (только перед нормализацией), не видно смысла вычислять где лево/право
0
18.12.2023, 22:24

Не по теме:

Igor3D, в моих играх всегда очень много тригонометрии, но с оптимизацией всё норм. Я использую тригонометрические и гиперболические функции даже для света и звука. Но я сам редко пользуюсь этими функциями именно для вращения, т.к. использую готовые функции движка на основе кватернионов. Не писать же ТС игровой движок? Ради одной банальной игры/задачи можно использовать углы Эйлера.

0
18.12.2023, 22:30

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
Я использую тригонометрические и гиперболические функции даже для света
Но зачем ???

0
18.12.2023, 22:34

Не по теме:

Igor3D, например, в шейдерах стекла или воды, чтобы придать реалистичности. Я строго соблюдаю законы оптики в моих рецептах)

0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,117
Записей в блоге: 2
18.12.2023, 23:36
Цитата Сообщение от Royal_X Посмотреть сообщение
например, в шейдерах стекла или воды, чтобы придать реалистичности. Я строго соблюдаю законы оптики в моих рецептах)
Может быть рассчитываете преломленный луч? Это делается по Хекберту без тригонометрии. Но важно не это, а что Вы с ним дальше делаете - ведь raytrace, как я понимаю, у Вас нет, какая уж тут реалистичность
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,574
19.12.2023, 08:51
Igor3D, ну я вот по таким рецептам учился https://godotshaders.com/shader/realistic-water/ , и там для функции волны нужны тригонометрические функции. Согласен, для простого стекла или простой воды они не нужны.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.12.2023, 08:51

Указать положение камеры в 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; вместе с камерой меняется и центр вращения. Как...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru