Управление видовым кубом и направлением камеры в модели.

Автор Тема: Управление видовым кубом и направлением камеры в модели.  (Прочитано 3044 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Доброго времени суток, уважаемые форумчане! Пытаюсь разобраться в задаче, прошу вашей помощи.

Если в двух словах, то мне необходимо написать код, который будет проверять, правильно ли направлен "вид спереди" видового куба, и если нет, то исправлять. Битый час читаю хелп, никак не могу сообразить. Как проверить текущее направление, я вроде бы понимаю, но вот как изменить?

Есть метод View.SetCurrentAsFront(), выходит, что поверни камеру в нужный ракурс, и дело сделано. Но как повернуть? Ну то есть, не пользуясь свойством Camera.ViewOrientationType, а произвольно повернуть. У меня есть вектор правильного направления камеры, ну или плоскость, на которую камера должна быть направлена, каким образом мне их использовать, чтобы эту камеру повернуть?

Как понимаю, надо колдовать изменяя Camera.UpVector и точку взгляда пользователя.  Тут же возникает вопрос: "А чем отличаются Camera.Eye и Camera.Target, и что из них за что отвечает?" В общем, я крайне запутался, буду рад любой идее, совету, догадке!
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
В хэлпе написано
Camera.Eye - это центр вида, это наверное связано с тем вокруг какой точки вращаться в пространстве.
Camera.Target взгляд со стороны оси Z, наверное для работы с 2Д эскизами, точно не скажу.

А пример из хэлпа не рулит?
Код - Visual Basic [Выбрать]
  1. Public Sub RotateCamera()
  2.     ' Get the active camera.
  3.    Dim cam As Camera
  4.     Set cam = ThisApplication.ActiveView.Camera
  5.    
  6.     Dim tg As TransientGeometry
  7.     Set tg = ThisApplication.TransientGeometry
  8.    
  9.     ' Define the number of steps in the animation.
  10.    Dim steps As Integer
  11.     steps = 360
  12.    
  13.     ' Define the distance between the eye and target.
  14.    Dim eyeDistance As Double
  15.     eyeDistance = 15
  16.    
  17.     ' Calculate pi.
  18.    Dim pi As Double
  19.     pi = Atn(1) * 4
  20.    
  21.     ' Iterate the specified number of steps.
  22.    Dim i As Integer
  23.     For i = 1 To steps
  24.         ' Calculate the x and y coordinates of the eye.
  25.        Dim x As Double
  26.         Dim y As Double
  27.         x = eyeDistance * Cos(i / steps * (2 * pi))
  28.         y = eyeDistance * Sin(i / steps * (2 * pi))
  29.        
  30.         ' Set the eye with a hard coded z value.
  31.        cam.Eye = tg.CreatePoint(x, y, 3)
  32.        
  33.         ' Define the up vector as positive z.
  34.        cam.UpVector = tg.CreateUnitVector(0, 0, 1)
  35.        
  36.         ' Apply the current camera definition to the view.
  37.        cam.ApplyWithoutTransition
  38.     Next
  39. End Sub

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
А пример из хэлпа не рулит?
Спасибо, Михаил. Насчет примера из хелпа, я не придумал, каким образом его использовать. Они, как я понял, создают анимацию вращения на 360 градусов, преобразуя текущее положение камеры. Мне же нужно научиться устанавливать вид камеры на какую-то плоскость, по сути реализовать команду "вид на объект" из пользовательского интерфейса.
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 23-03-2021, 22:15:34

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Походу это так вот решается:
Сначала выделяем нужную плоскость и потом
Код - C# [Выбрать]
  1. ControlDefinition oControlDef = oApp.CommandManager.ControlDefinitions["AppLookAtCmd"];
  2. oControlDef.Execute();

Сложность тока в том, что камера поворачивается с текущей позиции по кратчайшей траектории. И может получиться, что в отличие от пользовательской команды, где направление вида камеры всегда противоположно направлению нормали плоскости, тут направление камеры будет совпадать с нормалью.
В программировании я новичок...но ненадолго! ;)