На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Вращение 3D объекта с помощью мыши , OpenGL
    Как с помощью мыши вращать трехмерный объект.
    ( Имеется ввиду так же как это сделано в CAD системах )
    Сообщение отредактировано: F0X -
      Цитата F0X @
      Есть координаты мыши момент нажатия клавиши x1,y1 и отпускание x2,y2
      Как зная эту информацию правильно задавать

      Нужно вычислять две матрицы:
      одна - от перемещения мыши по X зависит вращение камеры вокруг Z,
      а вторая - от перемещения мыши по Y зависит вращение камеры вокруг X.
      Далее перемножаем матрицы и получаем матрицу для камеры, важно соблюсти правильный порядок перемножения матриц, не скажу какой именно - просто я работаю с Direct3D, там немного по-другому, для OpenGL может не подойти. Но там всего два варианта, проверь.
        Цитата F0X @
        в положении (1) оси x-y-z уже не перпендикулярны и не параллельны окну пользователя

        Это исправляется порядком умножения матриц.
        М1 - матрица, на которую уже повёрнут объект.
        М2 - матрица, на которую нужно довернуть объект.
        Можно умножать двумя способами:
        ExpandedWrap disabled
          М1=М1*М2
          М1=М2*М1

        В одном случае будет доворот вокруг мировых осей X и Y, во другом вокруг локальных осей объекта.
          Цитата
          просто я работаю с Direct3D

          Mikle можете маленький участок кода на VB и Direct3D привести как от матриц перейти к командам аналогичным типа glRotatef() я переведу на Си и OpenGL.
          Сообщение отредактировано: F0X -
            Цитата F0X @
            можете маленький участок кода на VB и Direct3D привести

            Сделаю чуть позже.
              Вот наиболее простой вариант.

              Прикреплённый файлПрикреплённый файлTeapot.zip (39,31 Кбайт, скачиваний: 70)
                Спасибо
                Сообщение отредактировано: F0X -
                  Вся логика очень короткая, она тут:
                  ExpandedWrap disabled
                    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
                    Все работает )
                    Сообщение отредактировано: F0X -
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0445 ]   [ 17 queries used ]   [ Generated: 20.04.24, 01:33 GMT ]