三维图形的坐标系

Mathematica 画三维图形时, 总要在外边加一个立方盒. 在默认设置 Boxed->True 下, Mathematica 会画出盒子的边缘. 但一般情况下, Mathematica 会自动擦去该立方盒之外的任何部分.

选项 PlotRange 指定 Mathematica 应该包括在盒内 , 坐标的范围. 与二维时相同, 默认设置是 PlotRange->Automatic, 它令 Mathematica 用内部算法尽量包含图形中"令人感兴趣"的部分, 而擦掉外围部分. 使用 PlotRange->All, 令 Mathematica 包含所有部分.

调入一个包含各种多面体的程序包.
In[1]:=
Click for copyable input
这里产生一个星状的20面体.
In[2]:=
Click for copyable input
这里显示该星状的20面体, 将其画在立方盒中.
In[3]:=
Click for copyable input
Out[3]=
通过设置 PlotRange, 这个星状20面体的许多部分由于位于立方盒之外而被擦去.
In[4]:=
Click for copyable input
Out[4]=

与二维情况类似, 可以使用 "原始" 或 "尺度" 坐标在三维对象中确定元素的位置. 由 Scaled[{sx, sy, sz}] 确定的尺度坐标, 在每一个方向上的取值范围是从0到1.坐标系在盒子上为右手系.

{x,y,z}原始坐标
Scaled[{sx,sy,sz}]尺度坐标,各维变化范围为0到1

三维对象的坐标系.

在立方盒的一个顶点上放一个立方体.
In[5]:=
Click for copyable input
Out[5]=

在指出各种图形基元应放在盒子内的什么位置后, 必须告诉 Mathematica 如何画出盒子. 第一步是确定盒子的形状. 这一步与确定二维图形的纵横比类似. 在三维情形中, 可以使用 BoxRatios 指定盒子边长的比例. 对于 Graphics3D 对象, 默认设置是 BoxRatios->Automatic, 它使得盒子的形状根据盒子内元素的具体坐标范围来确定.

BoxRatios->{xr,yr,zr}指定盒子的边长比
BoxRatios->Automatic从实际坐标范围确定边长比 (Graphics3D 的默认值)

指定三维对象边界盒的形状.

在一个长盒子中显示星状20面体.
In[6]:=
Click for copyable input
Out[6]=

产生三维图像时, 必须告诉 Mathematica 是从哪一个方位来观察对象, 这需要可以使用 ViewPoint 选项.

"三维曲面绘图" 一节中已经给出了这个选项的常用设置. 然而通常可以让 Mathematica 取任意视点.

视点用 ViewPoint->{sx, sy, sz} 指定. si 的值用一个特殊的坐标系给出, 该坐标系的原点在盒子的中心 , 而将盒子最长的一个边作为一个单位来度量, 盒子的其它边长由选项 BoxRatios 的设置确定. 对一个正立方盒子而言, 每个边的坐标都是从 变化. 要注意视点总在盒子之外.

用默认视点 产生一个图形.
In[7]:=
Click for copyable input
Out[7]=
这是视点接近盒子的一个顶点时得到的图形.
In[8]:=
Click for copyable input
Out[8]=
当离盒子较远时,透视效果变小.
In[9]:=
Click for copyable input
Out[9]=
选项名称
默认值
ViewPoint{1.3,-2.4,2}尺度坐标系中的观察点
ViewCenterAutomatic尺度坐标系中出现在最终图形中心的点
ViewVertical{0,0,1}尺度坐标系中出现在最终图形中的竖直方向
ViewAngleAutomatic模拟相机用于观察图形的开放半角
ViewVectorAutomatic模拟相机在图形常规坐标系中的位置和方向

三维对象的位置和定向设置.

建立三维图形不仅需要指定观察位置, 还需要指定如何给最终图形加边框. 这用选项 ViewCenterViewVerticalViewAngle 来实现.

ViewCenter 允许用户告诉 Mathematica 对象的哪一点应该在最终图形的中心. 这一点由尺度坐标给出,各方向盒子的边从0到1变化. 用 ViewCenter->{1/2, 1/2, 1/2}, 盒子的中心将出现在最终图形的中心. 由于不同视点的选择, 盒子不一定对称, 盒子的中心不一定在最终图形的中心. 可以用 ViewCenter->Automatic 使盒子中心在最终图形区域的中心.

ViewVertical 指定对象的哪一个方位应该在最终图形中指向上方. ViewVertical 用尺度坐标指出那一个方向应该在最终图形上竖直向上. 默认设置 ViewVertical->{0, 0, 1},使得原始坐标的 方向在最终图形中总是竖直向上.

Mathematica 利用模拟相机的性能来对最终图像制造视觉影象. 对象的位置, 观察的取向, 以及相机的朝向由选项 ViewCenterViewVerticalViewPoint 来确定. 选项 ViewAngle 指定相机镜头的开放宽度. 选项ViewAngle 用弧度指定相机观测到的从 ViewPointViewCenter 的线的最大角度. 有效视角是 ViewAngle 值的两倍. 这表明 ViewAngle 可以有效地对图像某一部分进行放大. ViewAngle 的默认值是35°, 这是人眼的通常视角.

ViewVertical 的这种设置使盒子的 轴方向在图形上竖直向上.
In[10]:=
Click for copyable input
Out[10]=
这里使用 ViewAngle 有效地对图像中心进行放大.
In[11]:=
Click for copyable input
Out[11]=

设置选项 ViewPointViewCenterViewVertical, 也就是确定怎样观察一个物理对象. ViewPoint 确定头相对于对象的位置. ViewCenter 确定观察位置. ViewVertical 确定头向上的方式.

用坐标系的术语来说,设置 ViewPointViewCenterViewVertical 就是确定如何把盒子上的三维坐标转换为最终显示区域中图形的坐标.

ViewVector->Automatic使用 ViewPointViewCenter 选项的值确定模拟相机的位置和朝向
ViewVector->{x,y,z}对象所用相机在坐标系中的位置; 相机的朝向由 ViewCenter 选项决定
ViewVector->{{x,y,z},{tx,ty,tz}}对象所用相机在坐标系中的位置及相机的焦点

选项 ViewVector 的可能值.

相机的位置和朝向可完全由选项 ViewPointViewCenter 确定, 但选项 ViewVector 提供了一个有用的推广. 不是用尺度坐标给出相机的位置和朝向, ViewVector 使用与定位图形内部对象相同的坐标系对相机进行定位.

这里指定相机被放置在 轴的负方向, 朝向图形中心.
In[12]:=
Click for copyable input
Out[12]=
相机位置相同但指向不同方向. 与 ViewAngle 配合使用, 这里对图形某一部分进行放大.
In[13]:=
Click for copyable input
Out[13]=

当获得了三维对象的二维映像后, 还存在如何生成图像的问题, 这与二维图形中的问题相同. 例如, 可以通过改变纵横比AspectRatio 来修改图形的最终形状, 通过设置选项 PlotRegion 来指定图形的整个显示区域.

drag围绕中心旋转图形
Ctrl+drag放大或缩小图形
Shift+drag在显示屏的平面上平移图形

与三维图形交互的鼠标操作方式.

交互性的修改图形时, Mathematica 对这些观察选项做出改变. 如果用户用 ViewPoint指定了相机的位置, 旋转图形会使 Mathematica 改变选项 ViewPoint 的值. 如果相机的位置由 ViewVector 指定, 旋转图形则会改变这个选项的值. 两种情况下, 图形的旋转都会影响选项 ViewVertical 的值. 交互性的对图形放大和收缩则会直接影响到选项 ViewAngle. 交互性的平移图形改变的是选项 ViewCenter 的值.

这样改变最终图像的纵横比.
In[14]:=
Click for copyable input
Out[14]=

Mathematica 通常缩放三维对象的图形, 使其在给定的显示区域中尽可能大. 尽管在大部分情况下这正是用户所需要的, 但会产生一个所画出的三维对象的尺寸会随着定位不同而变化的结果. 可以通过设置选项SphericalRegion->True 来避免出现这种变化. 在这种设置下, Mathematica 在三维边界盒子外侧放一个球面, 并调整最后的图形使得整个球面在所指定的显示区域之内. 这个球面的中心与边界盒子的中心重合, 并且恰好把边界盒子放在球面内.

这里画出了一个拉长的图形.
In[15]:=
Click for copyable input
Out[15]=
使用 SphericalRegion->True, 调整最后的图像使得边界盒外的球面整个落在显示区域内.
In[16]:=
Click for copyable input
Out[16]=

通过设置 SphericalRegion->True 可以使一个对象的调整和这个对象的所有定位相一致, 这对产生同一对象不同定位的动态序列是很有用的.

SphericalRegion->False调整三维图像使其尽可能大
SphericalRegion->True调整图像,使边界盒外面的球面能全部位于最终显示区域内

三维图像的放大倍率.

New to Mathematica? Find your learning path »
Have a question? Ask support »