powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / DirectX вращение камеры вокруг центра
7 сообщений из 32, страница 2 из 2
DirectX вращение камеры вокруг центра
    #38179291
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Kokon:
Зачем так сложно? Попробуйте проще:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
int last_screen_mouseX, last_screen_mouseY;
...
private void panel1_MouseDown(object sender, MouseEventArgs e) {
  if (e.Button == MouseButtons.Middle) {
    last_screen_mouseX = e.X;
    last_screen_mouseY = e.Y;
  }
}

private void panel1_MouseMove(object sender, MouseEventArgs e) {
  if (e.Button == MouseButtons.Middle) {
    // берём moveX/moveY из движений мыши
    camera.arcRotate(e.X - last_screen_mouseX, -(e.Y - last_screen_mouseY));
    last_screen_mouseX = e.X;
    last_screen_mouseY = e.Y;
  }
}

(код не компилировал)
...
Рейтинг: 0 / 0
DirectX вращение камеры вокруг центра
    #38179350
Kokon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов,как все просто оказалось))) Спасибо, работает как надо
...
Рейтинг: 0 / 0
DirectX вращение камеры вокруг центра
    #38180688
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Kokon:
Кстати, если вас смущает моя реализация функции rotate, то можете попробовать такую:
Код: c#
1.
2.
3.
4.
// поворачивает точку вокруг оси
static Vector3 rotate(Vector3 point_on_axis, Vector3 axis_dir, float angle, Vector3 point) {
  return point_on_axis + Vector3.TransformCoordinate(point - point_on_axis, Matrix.RotationAxis(axis_dir, rad_from_deg(-angle)));
}

(код не компилировал)
Вроде должно работать так же, только насчёт минуса перед углом не уверен.
...
Рейтинг: 0 / 0
DirectX вращение камеры вокруг центра
    #38181215
Kokon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов, да меня то формула не смущает. Просто я ее не понимаю. Если не лень объясните пожалуйста. А в ее сами вывели или где-то она расписана?
...
Рейтинг: 0 / 0
DirectX вращение камеры вокруг центра
    #38181749
Kokon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов, кстати не знаете, что можно почитать об архитектуре 3D приложений?
...
Рейтинг: 0 / 0
DirectX вращение камеры вокруг центра
    #38187044
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Kokon:

KokonПётр Седов, да меня то формула не смущает. Просто я ее не понимаю. Если не лень объясните пожалуйста. А в ее сами вывели или где-то она расписана?Сейчас уже не помню точно, но скорее всего поворот точки вокруг произвольной оси я взял из книги «Advanced Animation and Rendering Techniques» (авторы: Alan Watt, Mark Watt):
(в первом абзаце возможно имеется в виду «of an amount θ about an axis n »)
15 Overview and low-level motion specification
...
15.3 Motion control
...
15.3.8 Parametrization of orientation
...
Angular displacement

We define orientation as an angular displacement given by ( θ , n ) of an amount about an axis n . Just as we did for Euler angle notation, we shall derive the rotational matrix in terms of this new notation, so instead of R ( θ 1 , θ 2 , θ 3 ) we write R ( θ , n ). Consider the angular displacement acting on a vector r taking it to position Rr as shown in Figure 15.20.

The problem can be decomposed by resolving r into components parallel to n , r , which by definition remains unchanged after rotation, and perpendicular to n , r in the plane passing through r and Rr .

r = ( n · r ) n
r = r - ( n · r ) n

r is rotated into position Rr . We construct a vector perpendicular to r and lying in the plane. In order to evaluate this rotation, we write:

V = n × r = n × r

So

Rr = (cos θ ) r + (sin θ ) V

hence

Rr = Rr + Rr
= Rr + (cos θ ) r + (sin θ ) V
= ( n · r ) n + cos θ ( r - ( n · r ) n ) + (sin θ ) n × r
= (cos θ ) r + (1 - cos θ ) n ( n · r ) + (sin θ ) n × r
Мой код :
Пётр Седов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// поворачивает точку вокруг оси
Vec_3 rotate(const Vec_3& point_on_axis, const Vec_3& axis_dir, double angle, const Vec_3& point) {
  assert(fabs(len(axis_dir) - 1) < 1e-3); // axis_dir должен быть единичным вектором
  Vec_3 r = point - point_on_axis;
  double a = rad_from_deg(angle);
  return point_on_axis + cos(a) * r + ((1 - cos(a)) * dot(axis_dir, r)) * axis_dir + sin(a) * cross(axis_dir, r);
}


Не знаю, как у вас с английским, в общем там ключевой момент в том, что вектор r (который надо повернуть) разбивается на 2 части:
r = r + r
r параллелен оси вращения, r перпендикулярен. Нам надо получить Rr , и поскольку вращение -- линейный оператор, то:
R ( r + r ) = Rr + Rr
С параллельной частью всё просто: Rr = r . С перпендикулярной частью чуть посложнее, похоже на полярные координаты: Rr = cos θ r + sin θ V .

Они там не пишут явно, но имеют в виду:

* Ось вращения проходит через начало координат (точка {0, 0, 0}). Обобщить на случай, когда не проходит, легко: сначала переходим в систему координат, где ось вращения проходит через начало координат, делаем поворот, затем возвращаемся в исходную систему координат.
Пётр Седов
Код: plaintext
1.
2.
3.
Vec_3 r = point - point_on_axis;
...
return point_on_axis + ...;


* Вектор n (направление оси вращения; в моём коде -- axis_dir) -- единичный.
Пётр Седов
Код: plaintext
1.
assert(fabs(len(axis_dir) - 1) < 1e-3); // axis_dir должен быть единичным вектором


KokonПётр Седов, кстати не знаете, что можно почитать об архитектуре 3D приложений?Не знаю. Но подозреваю, что архитектура 3D-редакторов более/менее такая же, как у обычных редакторов, отличается только рисование объектов и hit test (обнаружение, на какой объект щёлкнул пользователь).
...
Рейтинг: 0 / 0
DirectX вращение камеры вокруг центра
    #38190594
Kokon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов, спасибо, поразбираюсь в формулах. Да и книгу надо будет эту скачать, может что-нибудь полезное для себя найду.
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / DirectX вращение камеры вокруг центра
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]