Как повернуть вектор на заданный угол?

Автор Тема: Как повернуть вектор на заданный угол?  (Прочитано 5902 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Есть модель открытая в Apprentice. Есть камера, в свойствах которой есть координаты точки и единичный вектор. Нужно выполнить поворот модели на заданный угол вокруг оси, проходящей через модель и камеру.
Код - vb.net [Выбрать]
  1. Sub RotCam ()
  2. Dim ovDoc As ApprenticeServerDocument
  3. Dim oClientView As ClientView
  4. Dim ovApprentice As ApprenticeServerComponent
  5. Dim oCamera As Camera
  6. oClientView = oDoc.ClientViews.Add(PictureBox1.Handle)
  7. oCamera = oClientView.Camera
  8. 'oCamera.Eye ' тут координаты камеры
  9. 'oCamera.UpVector ' тут начальный единичный вектор
  10. Dim oTG As TransientGeometry
  11. oTG = oApprentice.TransientGeometr
  12. Dim oA As Double '  заданный угол
  13. Dim oX As Double ' Нужно вычислить
  14. Dim oY As Double ' Нужно вычислить
  15. Dim oZ As Double ' Нужно вычислить
  16. oCamera.UpVector = oTG.CreateUnitVector(oX, oY, oZ) ' процедура изменения вектора камеры
  17. oCamera.ApplyWithoutTransition()
  18. oCamera.Apply()
  19. oClientView.Update(False)
  20. End Sub

Отмечено как Решение filat 15-06-2016, 13:30:08

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Оказывается, всетаки, Матрица рулит!
Задача решается следующим куском кода:
Код - vb.net [Выбрать]
  1.         Dim oVec As Vector = oTG.CreateVector(oCamera.UpVector.X, oCamera.UpVector.Y, oCamera.UpVector.Z)
  2.         Dim oMat As Matrix = oTG.CreateMatrix()
  3.         Call oMat.SetToRotation(3.14159265358979 / 2, oVec, oCamera.Eye)
  4.         oVec = oMat.Translation()
  5.         Dim oX As Double = oCamera.UpVector.X
  6.         Dim oY As Double = oCamera.UpVector.Y
  7.         Dim oZ As Double = oCamera.UpVector.Z
  8.         oX = oVec.X
  9.         oY = oVec.Y
  10.         oZ = oVec.Z

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Call oMat.SetToRotation(3.14159265358979 / 2, oVec, oCamera.Eye)

Хотел посоветовать задавать число "Пи" в виде переменной, как показано ниже, тогда будет абсолютная точность:
Код - Visual Basic [Выбрать]
  1. PI = Atn(1)*4
В программировании я новичок...но ненадолго! ;)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Тогда уж лучше использовать Math.PI
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Тогда уж лучше использовать Math.PI
Ну да, красивее выглядит, но сути не меняет. :) Но если писать на  VBA, то там нет такой функции вроде бы.
В программировании я новичок...но ненадолго! ;)