Wolfram mathematica 如何在Graphics3D中精确定位摄像头?

Wolfram mathematica 如何在Graphics3D中精确定位摄像头?,wolfram-mathematica,Wolfram Mathematica,为了模拟我正在设计的基于激光的传感器,我想验证投影在表面上的四个点是如何从相机中显示出来的。所以我承诺实现一个Graphics3D可视化 该可视化装置将4台激光器放置在一个金字塔状的排列中,其中一台20厘米长的摄像机在一侧观察激光器的投影。我的笔记本代码生成了两个视图:一个在传感器工作的房间外,另一个视图代表随激光旋转的摄像机。相机激光系综的欧拉角和x、y、z坐标可以使用滑块控制 我的问题是,在模拟中,摄影机会自动定向。因为Mathematica正在调整视点,所以真实物理相机的视图不会被复制。如

为了模拟我正在设计的基于激光的传感器,我想验证投影在表面上的四个点是如何从相机中显示出来的。所以我承诺实现一个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}]

我认为您所需要做的就是不使用
ViewVector
选项,而是设置

ViewPoint -> {x, y, z}
有些抖动是由于激光/平面交点离开房间太远造成的。也许最好以某种方式截断这些


旁白:您的代码计算
rx。玛丽。rz
五次,最好只计算一次并存储它。

我认为您所需要做的就是不用使用
ViewVector
选项,设置

ViewPoint -> {x, y, z}
有些抖动是由于激光/平面交点离开房间太远造成的。也许最好以某种方式截断这些


旁白:您的代码计算
rx。玛丽。rz
五次,最好计算一次并存储。

我想你完全知道,你需要以某种方式指定摄像机的位置、方向和视角。在典型的Mathematica方式中,您可以通过指定一百万个不同的相关选项子集来实现这一点。以下是我将如何做到这一点:

首先,摄像机的位置。这可以在图形坐标(
ViewVector
)中指定,也可以相对于边界框(
视点
)指定。这两种方法都应该有效。指定相机位置时,请记住,当您远离
ViewCenter时,透视效果会减弱

摄影机方向由
视图中心
(指定摄影机方向的2度)和
视图垂直
(最终在二维投影中垂直的方向)定义<如果指定了
PlotRange
,则默认情况下代码>ViewCenter
正常

最后,
Automatic
对于
ViewAngle
来说,如果您有一个定义良好的
PlotRange
,通常是很好的,但是如果您在拍摄对象周围移动,可能需要将
spherecalregion
设置为true


所有视图几何体选项都列出了,但我想
ViewRange
大概是我上面没有提到的唯一选项:)。据我所知,您只需要指定
ViewVertical

我想您完全知道,您需要以某种方式指定相机的位置、方向和视角。在典型的Mathematica方式中,您可以通过指定一百万个不同的相关选项子集来实现这一点。以下是我将如何做到这一点:

首先,摄像机的位置。这可以在图形坐标(
ViewVector
)中指定,也可以相对于边界框(
视点
)指定。这两种方法都应该有效。指定相机位置时,请记住,当您远离
ViewCenter时,透视效果会减弱

摄影机方向由
视图中心
(指定摄影机方向的2度)和
视图垂直
(最终在二维投影中垂直的方向)定义<如果指定了
PlotRange
,则默认情况下代码>ViewCenter
正常

最后,
Automatic
对于
ViewAngle
来说,如果您有一个定义良好的
PlotRange
,通常是很好的,但是如果您在拍摄对象周围移动,可能需要将
spherecalregion
设置为true


所有视图几何体选项都列出了,但我想
ViewRange
大概是我上面没有提到的唯一选项:)。据我所知,您只需指定
ViewVertical

您对rx冗余的看法是正确的。玛丽。rz计算(不确定Mathematica在优化这些重复方面有多聪明)。然而,对于视点,我没有发现使用视点有任何改进。视点->{x,y,z}将相机放置在房间外,而不是靠近激光器并随激光器旋转的精确位置。我的论点是,位置是由ViewVector正确设置的,但相机的方向(其Euler角度)是由Mathematica自动决定的。好的,我认为如果要更改相机的旋转,那么必须使用ViewMatrix。这里您指定了一个4x4矩阵,表示IO(3)转换…关于rx的冗余,您是对的。玛丽。rz计算(不确定Mathematica在优化这些重复方面有多聪明)。然而,对于视点,我没有发现使用视点有任何改进。视点->{x,y,z}将相机放置在房间外,而不是靠近激光器并随激光器旋转的精确位置。我的论点是,位置是由ViewVector正确设置的,但相机的方向(其欧拉角)是由Mathematica自动决定的。好的,我认为如果你想改变