#c# #gdi
#c# #gdi
Вопрос:
Я пишу графическое приложение, которое может выполнять глобальные преобразования (поворачивать и переводить) с помощью управления мышью. Есть ли у кого-нибудь пример, показывающий, как реализовать это с помощью следующих методов:
MouseDown(object sender, MouseEventArgs e) - set the translate/rotate offset
MouseMove(object sender, MouseEventArgs e) - increment translate/rotate variables
OnPaint(Graphics graphics, float time) - use Matrix object to do global transform
Проблема: после поворота графики, когда я затем перевожу их, они перемещаются в соответствии с преобразованием поворота. Нужно ли мне компенсировать это вращение в MouseDown и MouseMove, где я устанавливаю переменную translate?
Комментарии:
1. Очень неясно. Умножение матриц не является коммутативным. Имеет большое значение, переводите ли вы сначала, затем поворачиваете, или сначала поворачиваете, а затем переводите.
2. Правильно, Ханс. Итак, мой вопрос: «как мне этого добиться?». Представьте, что вы создаете компьютерную игру, в которой пользователь может блуждать по 2D-лабиринту. Когда вы нажимаете клавишу для поворота, персонаж пользователя остается неподвижным, пока лабиринт поворачивается. Когда вы нажимаете клавишу для перемещения вперед, снова символ остается неподвижным (скажем, в центре экрана), но 2d-карта перемещается вниз. Я уже делал это, применяя тригонометрию ко всем объектам мира по отдельности. Но использование графической матрицы кажется гораздо лучшим подходом.
3. Вы сделали вращения правильным образом? То есть переведите объект в исходное положение, затем поверните, а затем переведите его в исходное положение. Потому что есть такая вещь, как ОСЬ ВРАЩЕНИЯ, которая имеет ОГРОМНОЕ значение
Ответ №1:
Помните, наведение курсора мыши выполняется только один раз. Я думаю, что в событии MouseDown, помимо установки смещения, вам нужно его преобразовать. А также, возможно, вам нужна переменная
bool isMouseDown = true;
чтобы помочь MouseMove, укажите, что он находится в состоянии «после наведения курсора мыши».
И в событии MouseMove, по сути, вы выполняете тот же процесс, что и в событии MouseDown, разница — это только координата мыши.