首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Graphics3D中精确定位相机?

如何在Graphics3D中精确定位相机?
EN

Stack Overflow用户
提问于 2010-08-19 14:27:07
回答 2查看 1.2K关注 0票数 0

对于我正在设计的基于激光的传感器的模拟,我想验证在一个表面上投影的四个点是如何从相机中出现的。因此,我已经承诺实现一个Graphics3D可视化。

可视化将4个激光器放置在一个金字塔状的排列中,其中有一个20厘米长的摄像机,两侧观察激光的投影。我的笔记本代码产生了两个视图:一个在房间外,传感器将在里面工作,第二个视点表示与激光一起旋转的相机。可以使用滑块控制相机-激光合奏的欧拉角和x,y,z坐标。

我的问题是,在模拟中,相机是自动定向的。因此,来自真实物理相机的视图不会重现,因为Mathematica正在调整视点。如果相机和激光一起旋转,那么在Psi中的旋转会导致相机与激光同步旋转,并且视图应该保持不变。同样,x和y的变化也不会使相机如此抖动。

如何控制相机方向以生成更连贯的模拟?

notebook代码为:

代码语言:javascript
复制
 \[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}]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-20 11:50:43

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

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

相机方向由ViewCenter (指定相机方向的2度)和ViewVertical (最终在2D投影中垂直的方向)定义。如果您指定了一个PlotRange,那么在缺省情况下ViewCenter通常是可以接受的。

最后,如果您有一个定义良好的PlotRange,那么Automatic通常适用于ViewAngle,但是如果您正在移动您的主题,则可能需要将SphericalRegion设置为true。

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

票数 3
EN

Stack Overflow用户

发布于 2010-08-20 06:29:25

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

代码语言:javascript
复制
ViewPoint -> {x, y, z}

一些抖动是由于激光/平面交点移出房间太远造成的。最好是以某种方式截断这些内容。

另外:您的代码会计算五次rx . ry . rz,最好是计算一次并存储。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3519260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档