Как точно ориентировать камеру в Graphics3D? - PullRequest
0 голосов
/ 19 августа 2010

Для моделирования лазерного датчика, который я разрабатываю, я хочу проверить, как четыре точки, проецируемые на поверхность, выглядят из камеры. И поэтому я взял на себя обязательство реализовать визуализацию Graphics3D.

Визуализация позволяет расположить 4 лазера в форме пирамиды с камерой 20 сантиметров в два с одной стороны, смотрящих на проекции лазера. Код моего ноутбука создает два вида: один снаружи комнаты, в которой будет работать датчик, и второй вид, представляющий камеру, вращаемую с помощью лазеров. Уголами Эйлера и координатами x, y, z лазерного ансамбля камеры можно управлять с помощью ползунков.

Моя проблема в том, что при моделировании камера автоматически ориентируется. И поэтому изображение с реальной физической камеры не воспроизводится, потому что Mathematica регулирует точку обзора. Если камера и лазер вращаются вместе, то вращение в фунтах на квадратный дюйм приведет к тому, что камера будет вращаться вместе с лазером, и изображение должно быть неизменным. Точно так же сдвиги по x и y не должны заставлять камеру дрожать так.

Как я могу контролировать ориентацию камеры, чтобы получить более связное моделирование?

Код записной книжки:

 \[Delta] = N[(38*Degree)/2]; 
 PointPlaneIntersection[{{x1_, y1_, z1_}, 
      {x2_, y2_, z2_}, {x3_, y3_, z3_}}, 
     {{x4_, y4_, z4_}, {x5_, y5_, z5_}}] := 
    Module[{t = -Det[{{1, 1, 1, 1}, {x1, x2, x3, x4}, 
           {y1, y2, y3, y4}, {z1, z2, z3, z4}}]/
        Det[{{1, 1, 1, 0}, {x1, x2, x3, x5 - x4}, 
          {y1, y2, y3, y5 - y4}, {z1, z2, z3, 
           z5 - z4}}]}, Point[{x4 + t*(x5 - x4), 
       y4 + t*(y5 - y4), z4 + t*(z5 - z4)}]]; 
 UnitSpherePoint[azimuth_, polar_] := 
    {Cos[azimuth]*Sin[polar], Sin[azimuth]*Sin[polar], 
     Cos[polar]}; 
 Manipulate[rx := RotationMatrix[\[Theta], {1, 0, 0}]; 
    ry := RotationMatrix[\[Phi], {0, 1, 0}]; 
    rz := RotationMatrix[\[Psi], {0, 0, 1}]; 
    line1 = {{x, y, z}, rx . ry . rz . UnitSpherePoint[0, 
         Pi + \[Delta]] + {x, y, z}}; 
    line2 = {{x, y, z}, rx . ry . rz . UnitSpherePoint[
         Pi/2, Pi + \[Delta]] + {x, y, z}}; 
    line3 = {{x, y, z}, rx . ry . rz . UnitSpherePoint[
         Pi, Pi + \[Delta]] + {x, y, z}}; 
    line4 = {{x, y, z}, rx . ry . rz . UnitSpherePoint[
         3*(Pi/2), Pi + \[Delta]] + {x, y, z}}; 
    cline = {{x + 0.2, y, z}, 
      rx . ry . rz . UnitSpherePoint[0, Pi] + 
       {x + 0.2, y, z}}; roomplane := 
     {{0, 0, 0}, {30, 0, 0}, {0, 15, 0}}; 
    Scene := Graphics3D[{Red, Opacity[1], 
       PointPlaneIntersection[roomplane, line1], 
       PointPlaneIntersection[roomplane, line2], 
       PointPlaneIntersection[roomplane, line3], 
       PointPlaneIntersection[roomplane, line4], White, 
       Opacity[0.1], Cuboid[{0, 0, 0}, {30, 15, 6}]}, 
      Boxed -> False, Lighting -> "Neutral"]; 
    Grid[{{Show[Scene], Show[Scene, ViewVector -> cline, 
        ViewAngle -> 64*Degree, RotationAction -> 
         "Clip"]}}], {{x, 15}, 0, 30}, {{y, 7.5}, 0, 15}, 
   {{z, 3}, 0, 6}, {{\[Theta], Pi}, 0, 2*Pi}, 
   {{\[Phi], Pi}, 0, 2*Pi}, {{\[Psi], Pi}, 0, 2*Pi}]

Ответы [ 2 ]

3 голосов
/ 20 августа 2010

Как вы, наверное, в курсе, вам нужно как-то указать положение камеры, ориентацию и угол обзора.Типичным способом Mathematica вы можете сделать это, указав миллион различных поднаборов взаимосвязанных опций.Вот как я бы это сделал:

Во-первых, положение камеры.Это может быть указано в графических координатах (ViewVector) или относительно ограничительной рамки (ViewPoint).Любой из них должен работать.Указывая положение камеры, помните, что эффекты перспективы уменьшаются при удалении от ViewCenter.

Ориентация камеры определяется ViewCenter (указанием 2 градусов ориентации камеры) и ViewVertical (направление, которое в конечном итоге будет вертикальным в 2D проекции).ViewCenter обычно подходит по умолчанию, если вы указали PlotRange.

Наконец, Automatic чаще всего подходит для ViewAngle, если у вас есть четко определенный PlotRange, но вам может понадобитьсяустановить SphericalRegion в значение true, если вы двигаетесь вокруг объекта.

Все параметры геометрии вида перечислены здесь , но я думаю, ViewRange - единственный, который у меня есть.не упомянуто выше :).Насколько я могу судить, вам просто нужно указать ViewVertical?

0 голосов
/ 20 августа 2010

Я думаю, что все, что вам нужно сделать, это вместо использования опции ViewVector, установить

ViewPoint -> {x, y, z}

Некоторые колебания происходят из-за того, что точки пересечения лазер / плоскость перемещаются слишком далеко отномер.Лучше всего как-то их усечь.

В сторону: ваш код вычисляет rx . ry . rz пять раз, вероятно, лучше всего рассчитать его один раз и сохранить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...