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

Перевод экранных координат в wolrd space по имеющимся данным.

Страницы: 1 2 3 Следующая »
#0
19:15, 26 окт. 2016

Просьба не пинать, а просто подсказать по мере возможности.
Есть viewMatrix, projectionMatrix, координаты клика мышкой на экране, ширина и высота экрана.
Инверсных матриц нет, но я могу из каждой из этих получить это:

Returns the inverse of this matrix4x4 if it exists, else the identity matrix.

Глубины по Depth буферу неоткуда взять.

Нужно получить точку на плоскости X-Z, ну это которая горизонтальная как бы. 
HELP! :-)


P.S.: я всё разбираюсь в этом практический недокументированном Qt3D, в нём есть ObjectPicker, который может выдать вектор worldIntersection , но чёрт подери, чуть камеру повернёшь и значения другие! А по идее, он же должен выдавать мировую точку пересечения луча от камеры и объекта, то есть должно быть одно и то же... Судя по всему там баг, буду делать вручную...


#1
20:48, 26 окт. 2016

THE_MASTER
> вектор worldIntersection

Наверное потому , что начало этого вектора - положение камеры. То есть это не положение объекта а направление на него.

#2
21:04, 26 окт. 2016

vNear = glm::unProject(glm::vec3(mouse_x, mouse_y, 0.0), mView, mProjection, glm::vec4(viewport[0], viewport[1], viewport[2], viewport[3]));
vFar = glm::unProject(glm::vec3(mouse_x, mouse_y, 1.0), mView, mProjection, glm::vec4(viewport[0], viewport[1], viewport[2], viewport[3]));
glm::intersectRayPlane(vNear, vDir, planeOrig, planeNormal, fDistance)
?
mouse_y - уже перевернут

#3
21:26, 26 окт. 2016

Dronas
> :unProject
фишка в том, что этого у меня нет.
Вообще, это реально сделать, не имея информации о глубине пикселя во вью порте, по которому я мышкой щёлкаю?

#4
21:38, 26 окт. 2016

Ну так ты камеру поварачиваешь и у тебя меняется луч из нее, соответственно меняется и пересечение, так в чем же баг?

#5
21:51, 26 окт. 2016

Polyflow3d
> Ну так ты камеру поварачиваешь и у тебя меняется луч из нее, соответственно
> меняется и пересечение, так в чем же баг?
Не уверен я, что это тот самый луч, т.к. вмести с ним там ещё идёт и дистанция до объекта (то есть она уже вычислена, луч то зачем?) и какой то такой же локальный луч, в котором координаты, такие же как и в worldIntersection.
Ок, есть какая - то простая формула на памяти, что бы проверить пересечение луча и плоскости/ прямоугольника?

#6
22:24, 26 окт. 2016

Polyflow3d
> Ну так ты камеру поварачиваешь и у тебя меняется луч из нее,
Да, судя по логу, это луч из камеры в сторону объекта, только вот теперь хз как найти точку пересечения, мне вообще там и дистанция прилетает, только она какая - то не понятная, допустим вектор направления - QVector3D(19.9247, 34.5221, -0.0134523) , а дистанция при этом всего навсего 0.04085053876042366
Хз чё это за дистанция, может до NearPlane )))  Была б нормальная дистанция, я бы по вектору направления пробежал бы на эту дистанцию и нашёл бы нужную себе точку...

#7
23:16, 26 окт. 2016

THE_MASTER
> а дистанция при этом всего навсего 0.04085053876042366
Покопав ещё сорцы Qt, я понял, что эта дистанция, это проценты от near plane до far plane, у меня объект стоит близко, на расстоянии примерно 40, а far plane = 1000.0, по этому дистанция маленькая....копаю дальше

#8
23:29, 26 окт. 2016

THE_MASTER
>фишка в том, что этого у меня нет.

чего у тебя нет? че, реально без glm?

Мужчины, чем плох glm? Для реальных проектов не торт? 0_о

#9
0:20, 27 окт. 2016

THE_MASTER

Ок, есть какая - то простая формула на памяти, что бы проверить пересечение луча и плоскости/ прямоугольника?

есть , для ZX вот так:

Vector3 RaycastToXZ(Vector3 origin, Vector3 direction){
  if(direction.y<0){
    return origin - direction * origin.y/direction.y;
  } else {
    return Vector3.zero;
  }
}

если луч направлен выше плоскости то результат ноль.
Вообще не понятно с твоим qt  - кто и что там возращет, какой то не нормированный вектор, какая то дистанция.
Юнити чем хорош, что там есть редактор в котором можно смотреть на сцену через эдиторную камеру и рисовать в дебаге все что угодно , матрицы, точки и тп,  а не только выводить циферки в консоль.

#10
0:21, 27 окт. 2016

Чёрт подери, я чего то не догоняю, у меня есть позиция камеры:
QVector3D(20, 34.641, 0)
у меня есть вектор worldIntersection, который судя по всему является лучом в направление точки pick-а на объекте, наверное он должен исходить из камеры, хотя хз, непонятно...:
QVector3D(19.6303, 34.2378, -0.136719)
но почему - то его координаты почти такие же, как и позиция камеры..

Есть дистанция до точки пика:  (это процент от near до far plane, сейчас они у меня 0.1 и 100.0)
0.4582589864730835

Есть viewMatrix, есть projectionMatrix, есть координаты точки пика на экране, есть ширины экрана, есть высота экрана...
Ну и как теперь получить саму точку пика в WORLD SPACE-е то???

P.S.: тут главный вопрос, что же всё таки за вектор worldIntersection и почему его координаты почти совпадают с координатами камеры. На экране, на расстояние примерное в 40 от объекта я щёлкаю по его грани, шириной и высотой в 24.0.

#11
0:31, 27 окт. 2016

worldIntersection
это точка пересечения. Вопрос: пересечения  с чем?
Что у тебя еще есть в сцене?

#12
0:45, 27 окт. 2016

Polyflow3d
> Что у тебя еще есть в сцене?
Да там лежит простой прямоугольник (из двух треугольников) на плоскости XZ, то есть Y = 0; Камера наклонена под определёнными углами.
Вот я щёлкаю в разные углы (примерно) и получаю: (клик показан звёздочкой - 1,2,3,4): [камера летает по орбите вокруг 0,0,0 радиусом 40.0)
[описание]
позиция камеры
непонятный worldIntersection
дистанция до пика (походу в координатах z bufera)
дистанция, умноженная на (far plane - near plane)

click 1:
QVector3D(20, 34.641, 0)
QVector3D(19.897, 34.2237, 0.137773)
0.34211111068725586
34.17689995714707

click 2:
QVector3D(20, 34.641, 0)
QVector3D(19.6346, 34.2365, 0.133263)
0.4559152126312256
45.54592974118007

click 3:
QVector3D(20, 34.641, 0)
QVector3D(19.6321, 34.2371, -0.134349)
0.45721420645713806
45.67569922438679

click 4:
QVector3D(20, 34.641, 0)
QVector3D(19.9011, 34.2249, -0.141298)
0.34050655364990234
34.01660470911785

Изображение
#13
0:55, 27 окт. 2016

THE_MASTER
ну значит забей на него если он криво рабтает. Я тебе дал код как посчитать рейкаст до xz, попадание в квадрат ты сам (надеюсь) прикрутишь.

#14
1:03, 27 окт. 2016

Polyflow3d
> ну значит забей на него если он криво рабтает
погоди, ещё вот чё заметил, там помимо worldIntersection, есть ещё localIntersection. Так вот, если этот прямоугольник трансформацией сдвигать, допустим влево, по оси Z, тогда при кликах примерно в одно и то же место прямоугольника, worldIntersection не меняется, всё время одно и то же, а вот localIntersection меняется... Не появилось новых идей? :-)))

Polyflow3d
> Я тебе дал код как посчитать рейкаст до xz
Да если это вектор левый, значит и вычислять пока рано...

В принципе, у меня есть всё необходимое для вычисления точки пика, я просто не знаю, что и в какой последовательности умножать, повторюсь ещё раз, у меня есть:

Есть дистанция до точки пика:  (это процент от near до far plane, сейчас они у меня 0.1 и 100.0)  Это скорее всего глубина DepthBuffer-а
0.4582589864730835

Есть viewMatrix, есть projectionMatrix, есть координаты точки пика на экране, есть ширины экрана, есть высота экрана...
Ну и как теперь получить саму точку пика в WORLD SPACE-е то???

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

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