使用SharpGL三维建模技术生成3D井眼轨迹图
前面的文章里写过使用sharpGL三维建模生产3D井眼轨迹,这篇文章主要是说一下在WPF中如何进行3d图绘制。
(一)、先介绍一下3D绘图基本概念
三维坐标系
由于我们要将三维模型显示在二维显示器上,所以我们创建场景时,实际上是要创建三维对象的二维表现形式。前面的文章已经讲过,WPF中二维图形坐标系原点在屏幕左上角,x轴正方向朝右,y轴正方向朝下。但是在三维坐标系中原点位于呈现中心的中间,x轴正方向朝右,y轴正方向朝上,z轴正方向朝外。这点和OpenGL类似,三维坐标系统使用的也是右手坐标系。
二维坐标系统与三维坐标系统
在WPF中使用右手坐标系统
WPF三维坐标系统
相机和投影
当我们创建三维场景时,实际上是要创建三维对象的在显示屏幕上二维表示形式。由于三维场景的外观会因观察者的观察位置不同而异,因此我们必须设置观察位置。可以使用相机来为三维场景指定观察位置。了解三维场景如何在二维图面上表示的另一种方法就是将场景描述为到观察表面上的投影。“投影”这个词听起来比较抽象,生活中的物品都是三维的,但人的眼睛只能看到正面,不能看到被遮挡的背面。我们眼睛看到三维几何体就像看到被相机拍摄的二维相片。三维空间体转化为二维图的过程就叫投影,例如在现实世界中摄像机拍摄物体,是由物体表面反射的光线经过凸透镜聚到感光元件CCD单元上产生的。投影就是把三维空间投影到二维空间的过程。而不同的投影方式投影尺寸的算法不同。针对于不同的三维场景通常使用不同的投影方式,比如工业设计通常使用正投影(平行投影),而各种游戏场景则通常采用透视投影。
正投影和透视投影在三维图中的效果:
透视投影相机代码示例
// Defines the camera used to view the 3D object. In order to view the 3D object,
// the camera must be positioned and pointed such that the object is within view
// of the camera.
PerspectiveCamera myPCamera = new PerspectiveCamera();
// Specify where in the 3D scene the camera is.
myPCamera.Position = new Point3D(0, 0, 2);
// Specify the direction that the camera is pointing.
myPCamera.LookDirection = new Vector3D(0, 0, -1);
// Define camera's horizontal field of view in degrees.
myPCamera.FieldOfView = 60;
// Asign the camera to the viewport
myViewport3D.Camera = myPCamera;
ProjectionCamera,可以指定不同的投影及其属性以更改观察者查看三维模型的方式。PerspectiveCamera 指定用来对场景进行透视收缩的投影。换言之,PerspectiveCamera 提供消失点透视。您可以指定照相