簡體   English   中英

如何在Graphics3D中精確定位相機?

[英]How to precisely orient a Camera in Graphics3D?

對於我正在設計的基於激光的傳感器的仿真,我想驗證相機上投影的四個點如何出現。 因此,我已承諾實現Graphics3D可視化。

可視化效果將4台激光器以金字塔狀放置,並帶有20厘米的攝像頭,從兩側觀察攝像機的投影。 我的筆記本代碼產生兩個視圖:一個視圖在傳感器將要在房間外面運行,另一個視圖代表用激光旋轉的攝像機。 可以使用滑塊控制相機-激光系的歐拉角和x,y,z坐標。

我的問題是,在仿真過程中,相機會自動定向。 因此,由於Mathematica正在調整視點,因此無法重現來自真實物理相機的視圖。 如果攝像機和激光器一起旋轉,而不是Psi中的旋轉,將導致攝像機與激光器同步旋轉,並且視野應保持不變。 同樣,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}]

據我所知,您需要以某種方式指定相機的位置,方向和視角。 以典型的Mathematica方式,可以通過指定一百萬個相互關聯的選項的不同子集來實現。 以下是我的處理方式:

首先,攝像機的位置。 可以在圖形坐標( ViewVector )中或相對於邊界框( ViewPoint )進行指定。 這些都應該起作用。 在指定相機位置時,請記住,當您遠離ViewCenter時,透視效果會減弱。

攝像機的方向由ViewCenter (指定攝像機方向的2度)和ViewVertical (最終在2D投影中ViewVertical垂直的方向)定義。 ViewCenter如果指定一個是通常默認罰款PlotRange

最后,如果您有一個定義良好的PlotRange ,則對ViewAngleAutomatic通常最ViewAngle ,但是如果您正在移動主題,則可能需要將SphericalRegion設置為true。

這里列出所有視圖幾何選項,但是我想ViewRange是我上面沒有提到的唯一一個:)。 據我所知,您只需要指定ViewVertical

我認為您需要做的就是代替使用ViewVector選項,設置

ViewPoint -> {x, y, z}

某些抖動是由於激光/平面相交點移離房間太遠而引起的。 最好以某種方式截斷這些。

除了:您的代碼計算rx . ry . rz rx . ry . rz rx . ry . rz五次,最好計算一次並存儲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM