Войти
ПрограммированиеФорумФизика

конверт

Страницы: 1 2 Следующая »
#0
1:49, 20 фев. 2018

Уже неделю ищу решение как из мировых координат объекта получить экранные координаты. Да, в интернете есть много информации по матрицам преобразования, но доступа к коду игры нет, я делаю модификацию интерфейса, и в коде который мне доступен нет функции с помощью которой я смогу получить координаты объекта на мониторе.
Данные которые я могу получить: TargetLocation (x, y, z) - вектор мировых координат цели/объекта; CameraLocation (x', y', z') - вектор мировых координат камеры; CameraRotation (Pitch, Yaw, Roll). И вот как с этих данных получить координаты объекта (x, y) на мониторе к примеру 1920x1080? Я просто не знаю какие матрицы создать, что и куда подставлять, и как перемножать.. очень прошу знающих помочь.


#1
4:05, 20 фев. 2018

Есть же конвертация convert world location to screen location на вводе у игрока

#2
4:13, 20 фев. 2018

Так дело в том что я пишу всего лишь мод для игры и в распоряжении у меня мало функций из движка (UE2). Функции которая возвращала бы конвертированный вектор нету. Нужно самому все сделать. В интернете все очень запутано, я с этим еще не сталкивался..

#3
13:32, 20 фев. 2018

1) Через обратную матрицу проекции projectionCamera.inverse() .
2) Ну если не хочешь роботать с матрицами то можешь сделать что такое
Dir = camera.dir
Left = camera.left
Up  = camera.up
repos = TargetLocation - CameraLocation
LengthBufferZ = repos.dot(Dir)
X = (repos.dot(Left) / LengthBufferZ) * width
Y = (repos.dot(Up) / LengthBufferZ) * height

P.S: Видь позиция обекта , это просто луч который у которого начало это позиция камеры , а конец это позиция обекта , этот луч пересекает плоскость камеры , а точка (p) пресечения этого луча с плоскостю камеры это и есть то что тебе нужно если кординаты точки розложыть по векторам плоскости x = (p).dot(right) , y = (p).dot(up) . Но это эдиничные координаты , их надо ещё перевести на плоскость екрана , тобишь умножыть на widht height!

P.S : подозреваю что ты не чего не понял , просто покажешь код я подскажу что и как !

#4
21:27, 20 фев. 2018

У тебя не првалильно инцелизированы вектора  dir left up
Вектор Dir это то куда камера ссотрит, то бишь направления зрения , что то вроде этого dir = camera.eye - camera.center).normalized() .
А left и up это просто ортогонально сопряжоные вектора к вектору dir ! И все вектора должны быть в глобальном пространстве!

P.S: а что это за язык программирования?

#5
22:30, 20 фев. 2018
P.S: а что это за язык программирования?

Unreal Scripts (UE2)

В том то и дело что я пока не знаю как получить параметры камеры (dir, left, up)

#6
23:14, 20 фев. 2018

rottor
Если CamRot это правильный поворот камеры , в чём я не уверен . То тогда вектор Dir скорей всего можно получить так  Dir = quaternion(0,CamRot) * Z
Z = Vector3(0,0,1) ! Нарисую этот вектор , и , если он правильный то его не должно быть видно, потому что он предипикулярен плоскости камеры .


Главное найди 100% правильный  вектор Dir , а с него уже можно  получить всё что нужно!

P.S: почему у UE2 такой страный скриптовый язык ?
Лутше пишы на c++ , вроде как в UE2 можно на c++


P.S: если тебе надо выбирать просто какие-то обекты в 3D мире через координаты мышки  , то тебе не нужны 2D  координаты. Ты можеш просто воспользоваться лучом Ray / RayCast !

#7
0:54, 21 фев. 2018

CamRot выдает разные значения, но обычно они примерно такие (-3584, 6897, 0) - (Pitch, Yaw, Roll) соответственно, последний всегда 0, но по коду в движке именно этот ротатор используют для матриц преобразования.
Чтобы писать .uc на с++ в UE2 придется очень хорошо так повозится)

#8
16:44, 21 фев. 2018
Dir = quaternion(0,CamRot) * Z

что значить 0 в функции? У меня вот так:

struct Quat
{
  var() config float X, Y, Z, W;
};

native    static final function vector QuatRotateVector( Quat A, vector B );
либо дай пожалуйста исходники своей функции )
#9
21:00, 21 фев. 2018

rottor
> что значить 0 в функции? У меня вот так:
0 значит что реальная часть кватерниона ровна нулю,  тобишь W = 0 ! 
Если RotCam(Yaw,Pitch,Rool) то это углы ейлера , а значит их в кватернион надо вписать как углы ейлера , что вроде этого
Quaternion q;
Q.RotateEuler( CamRot ) .
Или так
Q.Yaw(CamRot.x)
Q.Pitch(CamRot.y)
Q.Rool(CamRot.z)
Точнее  сказать не могу , потому что мне надо видет  код кватерниона.!
  Не обезательно поварачивать кватернионом можеш через матрицу поворота !

P.S : короче говоря тебе надо вектор Z = Vector3(0,0,1) поварачивать точно так как поварачиваеться камера  и всё , то бишь  (Dir = Z * (повернуть также как повернута камера ) ) . normalized()

P.S : постарайся получить правильный вектор Dir , а дальше я тебе всё покажу ! Если не получиться дай мне глянуть на исходники vector3 , quaternion!

#10
20:18, 22 фев. 2018


werasaimon, можешь дать какие-то свои контактные данные? Скайп, телега и т.п..

#11
20:28, 22 фев. 2018

rottor
> Данные которые я могу получить: TargetLocation (x, y, z) - вектор мировых
> координат цели/объекта; CameraLocation (x', y', z') - вектор мировых координат
> камеры; CameraRotation (Pitch, Yaw, Roll). И вот как с этих данных получить
> координаты объекта (x, y) на мониторе к примеру 1920x1080?
Никак. Но можешь из пальца высосать недостающие значения

#12
0:48, 23 фев. 2018

Какие значения еще нужны? Я просто не знаю что еще нужно? Углы поворота (xAxis, yAxis, zAxis)? FOV? - эти я тоже могу достать. Мне нужно чтобы кто-то подсказал порядок перемножения матриц и как эти матрицы сформировать вообще.

#13
1:03, 23 фев. 2018

rottor
Да, тебе еще нужны фов и соотношение сторон вьюпорта. Далее вершину умножаешь на матрицу модели, матрицу вида и потом матрицу проекции. И вот тебе твои экранные координаты

#14
4:18, 23 фев. 2018

Да, для тебя все звучит просто ибо тебе это известно, в общем плане я тебя понимаю, но: как выглядит матрица модели (или как ее сформировать)? Матрица вида - тот же вопрос. Матрица проекции - аналогично.. Не упустил матрицу перспективы?

Страницы: 1 2 Следующая »
ПрограммированиеФорумФизика

Тема в архиве.

Тема закрыта.