Ваша проблема в преобразовании из 4х4 в 3х3. Короткий ответ заключается в том, что вы хотите удалить 3-й столбец и нижнюю строку, чтобы сделать 3x3, а затем предварительно умножить на матрицу вашей камеры. Для более подробного объяснения см. 13106130#13106130">здесь
Пояснение Поза, которую вы получаете от ARTK, представляет собой преобразование из одного места в другое. Когда я говорю «исходное изображение появляется без вращения», я имею в виду, что ваше преобразование переходит из начального состояния, в котором нет вращения вокруг оси x или y, в текущее состояние. Это прекрасное предположение для большинства приложений дополненной реальности, я упомянул его просто для тщательности.
Что касается того, почему вы можете опустить 3-й столбец. Поскольку вы преобразуете плоскость, ваша координата z может быть полностью выражена вашими координатами x и y с учетом уравнения вашей плоскости. Если мы предположим, что изначально нет вращения, то ваша начальная координата z является постоянным значением. Если есть вращение, то z не является постоянным, но детерминировано изменяется по x и y в соответствии с его уравнением плоскости, которое все еще может быть выражено в одной матрице (хотя вам это не нужно). Поскольку в вашем случае ваше преобразование 4x4, вероятно, выражает преобразование из маркера, лежащего плоско на z = 0, в его текущее положение, 3-й столбец вашей матрицы 4x4 ничего не делает (все это умножается на 0), поэтому его можно отбросить, не затрагивая результат.
Вкратце: забудьте о вращении, это сложнее, чем вам нужно, просто поймите, что преобразование происходит от начальных координат к конечным координатам, а ваши начальные координаты всегда
[x,y,0,1]
что делает ваш третий столбец неактуальным.
Обновить Простите! Я только что перечитал ваш вопрос и понял, что вы просто хотите деформировать маркер, чтобы он выглядел как прямой, я увлекся описанием общего преобразования с 4x4 на 3x3. Преобразование 4x4, которое вы получаете от ARTK, — это не преобразование, которое деформирует варкер, это преобразование, которое перемещает маркер из исходного положения в его конечное положение. Чтобы деформировать маркер, как вы просили, процесс аналогичен, но будет немного отличаться. Я не делал этого раньше, но вот мое предположение.
Во-первых, вам нужно получить преобразование 4x4 между тем, где находится маркер в мировом пространстве, и тем, где вы хотели бы, чтобы он отображался после деформации. Прямо сейчас преобразование идет от источника к положению маркера. Чтобы изменить преобразование, чтобы перейти от некоторой точки дальше по оси z (скажем, 100) к положению маркера, определите преобразование.
initial_marker_pose = [1,0,0,0
0,1,0,0
0,0,1,100
0,0,0,1];
Теперь у вас есть преобразование из исходной точки в то, что вы хотите, в качестве «начальной» позиции и преобразование из исходной точки в вашу «конечную» позицию. Чтобы получить преобразование от начального к конечному, просто
initial_to_final = origin_to_marker*initial_marker_pose.inv();
Теперь вы должны следовать процессу, описанному в ссылке, которую я вам дал, в этом случае ваш начальный zpos больше не 0, а 100. Затем, когда вы закончите, вам нужно будет инвертировать матрицу 3x3. Это потому, что этот процесс переносит вас с прямого вида на тот, который определяется позой из ARTK, а вы хотите противоположного этому. Вам нужно будет поэкспериментировать с начальной позицией z. Чем он меньше, тем крупнее будет ваш маркер после устранения деформации.
Надеюсь, это сработает, извините за путаницу в вашем вопросе.
person
Hammer
schedule
07.12.2012