[英]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
,則對ViewAngle
, Automatic
通常最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.