为了模拟我正在设计的基于激光的传感器,我想验证一个表面上投射的四个点是如何从相机中出现的。所以我承诺实现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}]
答案 0 :(得分:3)
我猜你完全清楚,你需要以某种方式指定相机的位置,方向和视角。在典型的Mathematica方式中,您可以通过指定相关选项的百万个不同子集来实现此目的。以下是我将如何做到这一点:
首先,相机位置。这可以在图形坐标(ViewVector
)中指定,也可以相对于边界框({{1}})指定。这些都应该有效。在指定相机位置时,请记住,当您远离ViewPoint
时,透视效果会减弱。
相机方向由ViewCenter
(指定相机方向的2度)和ViewCenter
(在2D投影中最终垂直的方向)定义。如果您指定了ViewVertical
,则ViewCenter
通常会很好。
最后,PlotRange
通常适用于Automatic
,如果您的定义明确ViewAngle
,但如果您要移动,则可能需要将PlotRange
设置为true你的主题。
所有视图几何体选项都列在here中,但我猜SphericalRegion
是我唯一没有提及的那个:)。据我所知,你只需要指定ViewRange
?
答案 1 :(得分:0)
我认为您需要做的就是不使用ViewVector
选项,而是设置
ViewPoint -> {x, y, z}
一些摇晃是由于激光/平面交叉点移出房间太远。最好以某种方式截断这些。
除此之外:您的代码计算rx . ry . rz
五次,最好一次计算并保存。