Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.203.172] |
|
Сообщ.
#1
,
|
|
|
Как с помощью мыши вращать трехмерный объект.
( Имеется ввиду так же как это сделано в CAD системах ) |
Сообщ.
#2
,
|
|
|
Цитата F0X @ Есть координаты мыши момент нажатия клавиши x1,y1 и отпускание x2,y2 Как зная эту информацию правильно задавать Нужно вычислять две матрицы: одна - от перемещения мыши по X зависит вращение камеры вокруг Z, а вторая - от перемещения мыши по Y зависит вращение камеры вокруг X. Далее перемножаем матрицы и получаем матрицу для камеры, важно соблюсти правильный порядок перемножения матриц, не скажу какой именно - просто я работаю с Direct3D, там немного по-другому, для OpenGL может не подойти. Но там всего два варианта, проверь. |
Сообщ.
#3
,
|
|
|
Это исправляется порядком умножения матриц. М1 - матрица, на которую уже повёрнут объект. М2 - матрица, на которую нужно довернуть объект. Можно умножать двумя способами: М1=М1*М2 М1=М2*М1 В одном случае будет доворот вокруг мировых осей X и Y, во другом вокруг локальных осей объекта. |
Сообщ.
#4
,
|
|
|
Цитата просто я работаю с Direct3D Mikle можете маленький участок кода на VB и Direct3D привести как от матриц перейти к командам аналогичным типа glRotatef() я переведу на Си и OpenGL. |
Сообщ.
#5
,
|
|
|
Цитата F0X @ можете маленький участок кода на VB и Direct3D привести Сделаю чуть позже. |
Сообщ.
#6
,
|
|
|
Сообщ.
#7
,
|
|
|
Спасибо
|
Сообщ.
#8
,
|
|
|
Вся логика очень короткая, она тут:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = 1 Then MX0 = x MY0 = y End If End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) Dim v As D3DVECTOR If Button = 1 Then AngleX = (y - MY0) * -0.01 AngleY = (x - MX0) * -0.01 v = Vec3(AngleX, AngleY, 0) MatrixRotationAxis mRot, v, Vec3Length(v) MatrixMultiply mRot, mWorld, mRot Dev.SetTransform D3DTS_WORLD, mRot End If End Sub Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = 1 Then mWorld = mRot End If End Sub |
Сообщ.
#9
,
|
|
|
Все работает )
|