Как преобразовать двухмерное движение (от мыши) в смещение вдоль трехмерной оси?

8

Я делаю небольшой редактор 3D-сцен (который позволяет изменять только положение объектов).

Каждый объект рисуется с осью 3D X / Y / Z:

введите описание изображения здесь

Как это работает: пользователь выбирает ось (X, Y или Z), щелкая левой кнопкой мыши по нему, затем, удерживая нажатой левую кнопку, перемещает мышь (для перемещения объекта в направлении оси). комплектация уже в порядке, но я хотел бы знать, how muchчто объект должен быть переведен для выбранной оси, в зависимости от движения 2D мыши.

Например, на этом рисунке выбор оси X и перемещение мыши влево-вправо должно дать большее смещение, чем перемещение его вверх-вниз (для этого почти ноль)

Это должно быть действительно просто, но я не могу понять это.

Входными данными должны быть: смещение мыши с момента первого щелчка левой кнопкой мыши (2D-вектор), вектор выбранной оси (3D-вектор), матрица вида / матрицы проекции.

Выход: сумма (число с плавающей запятой или двойная)

tigrou
источник
Вы можете сравнить направление, в котором пользователь перемещает мышь относительно объекта, сравнивая ориентацию объекта с ориентацией камеры.
MichaelHouse

Ответы:

5

Как вы хотите, чтобы это ведет себя? Есть разные способы сделать это.

Простой вариант - просто переместить объект на некоторое фиксированное число мировых космических единиц для каждой единицы пространства экрана (скажем, пикселя), которую перемещает мышь.

Другой вариант - взять вектор движения мыши и спроецировать его на ось движения через обычные матрицы проекции / камеры. Спроецируйте вектор движения мыши с помощью матриц обратного вида, проекции и камеры (задайте начальный Z расстояния до плоскости ближнего обзора, в результате вы должны получить смещение в ближней плоскости). Это дает вам вектор движения мыши в мировом пространстве. Спроецируйте этот вектор на нужную ось. Это дает вам движение в мировом пространстве. Объект переместится туда, куда указал пользователь, независимо от ориентации объекта. Если ось в основном вертикальная, для ее перемещения требуется вертикальное движение.

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

Другим вариантом является использование силы движения мыши, чтобы более быстрые движения вызывали большие смещения.

Используя вариант первой опции, вы также можете захватить указатель, чтобы пользователь мог непрерывно двигать мышью (поднимая и опуская его). Это особенно популярно для управления вращением и масштабированием.

Шон Миддледич
источник
Интересная техника. Во всяком случае, было бы неплохо узнать, является ли техника RobCurr также допустимой (мне кажется, что нет ни отрицательных, ни отрицательных голосов ...)
tigrou
Когда я читаю, он говорит то же самое, что и один из перечисленных мной вариантов. Вычислите спроецированные конечные точки и сформируйте вектор в мировом пространстве, проецируя его на нужную ось. Он просто перечислил некоторую запутанную математику для векторной проекции.
Шон Миддлдич
0

Я бы, вероятно, проецировал конечные точки выбранной оси в 2d пространстве, вычитал их для получения 2d вектора. Затем возьмите скалярное произведение нормализованного вектора движения мыши 2d с нормализованным первым вектором, чтобы определить часть движения, которая должна быть применена.

В общем, вычислим 2 вектора:

Va = нормализованная разница конечных точек проецируемой оси

Vb = нормализованный вектор, созданный из дельты движения мыши x и y

Va.Vb = | Va || Vb | cos @

Va.Vb / (| Va | Vb |) = cos @ - это компонент движения мыши, который должен применяться вдоль оси.

Просто еще один вариант.

RobCurr
источник