Сообщество программистов Autodesk в СНГ

ADN Club => Inventor API => Тема начата: filat от 15-06-2016, 12:21:39

Название: Как повернуть вектор на заданный угол?
Отправлено: filat от 15-06-2016, 12:21:39
Есть модель открытая в 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
Название: Re: Как повернуть вектор на заданный угол?
Отправлено: filat от 15-06-2016, 13:30:04
Оказывается, всетаки, Матрица рулит!
Задача решается следующим куском кода:
Код - 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
Название: Re: Как повернуть вектор на заданный угол?
Отправлено: R.I.Chernov от 15-06-2016, 23:00:54
Call oMat.SetToRotation(3.14159265358979 / 2, oVec, oCamera.Eye)

Хотел посоветовать задавать число "Пи" в виде переменной, как показано ниже, тогда будет абсолютная точность:
Код - Visual Basic [Выбрать]
  1. PI = Atn(1)*4
Название: Re: Как повернуть вектор на заданный угол?
Отправлено: Александр Ривилис от 16-06-2016, 00:21:27
Тогда уж лучше использовать Math.PI
Название: Re: Как повернуть вектор на заданный угол?
Отправлено: R.I.Chernov от 16-06-2016, 14:49:08
Тогда уж лучше использовать Math.PI
Ну да, красивее выглядит, но сути не меняет. :) Но если писать на  VBA, то там нет такой функции вроде бы.