DrawEarthClass.cs
上传用户:lslight
上传日期:2022-01-10
资源大小:14248k
文件大小:4k
源码类别:

DirextX编程

开发平台:

C#

  1. ///////////////////////////////////////////////////////////////////////
  2. //      ■■■■     ■■■■■       ■■■■       ■       ■      //
  3. //    ■                 ■         ■               ■       ■      //
  4. //    ■                 ■         ■    ■■■     ■       ■      //
  5. //    ■                 ■         ■       ■      ■       ■      //
  6. //      ■■■■         ■           ■■■■         ■■■■       //
  7. // Copyright (c) 三峡大学水利与环境学院 肖泽云. All rights reserved.  //
  8. ////////////////////////////////////////////////////////////////////////
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Text;
  12. using System.Drawing;
  13. using Microsoft.DirectX;
  14. using Microsoft.DirectX.Direct3D;
  15. namespace 绘制基本几何体
  16. {
  17.     class DrawEarthClass
  18.     {
  19.         public Device device;
  20.         public Vector3 shpereCenterVectors;
  21.         public float radius;
  22.         public int mNumber;
  23.         public int nNumber;
  24.         private CustomVertex.PositionTextured[] vertices;
  25.         private Texture texture;//定义贴图变量
  26.         private Material material;//定义材质变量
  27.         private int[] indexData;
  28.         public DrawEarthClass(Device _device, Vector3 _shpereCenterVectors, float _radius, int _mNumber, int _nNumber)
  29.         {
  30.             device = _device;
  31.             shpereCenterVectors = _shpereCenterVectors;
  32.             radius = _radius;
  33.             mNumber = _mNumber;
  34.             nNumber = _nNumber;
  35.             VertexDeclaration();
  36.             IndicesDeclaration();
  37.             LoadTexturesAndMaterials();
  38.         }
  39.         private void VertexDeclaration()//定义顶点
  40.         {
  41.             vertices=new CustomVertex.PositionTextured[(mNumber+1)*(nNumber+1)];
  42.             float theta = (float)Math.PI / nNumber;
  43.             float alpha = 2 * (float)Math.PI / mNumber;
  44.             for (int i = 0; i < nNumber+1; i++)
  45.             {
  46.                 for (int j = 0; j < mNumber+1; j++)
  47.                 {
  48.                     vertices[j + i * (mNumber + 1)].X = shpereCenterVectors.X + radius * (float)Math.Sin(i*theta) * (float)Math.Cos(j*alpha);
  49.                     vertices[j + i * (mNumber + 1)].Y = shpereCenterVectors.Y + radius * (float)Math.Cos(i * theta);
  50.                     vertices[j + i * (mNumber + 1)].Z = shpereCenterVectors.Z + radius * (float)Math.Sin(i * theta) * (float)Math.Sin(j*alpha);
  51.                     vertices[j + i * (mNumber + 1)].Tu = (float)j / (mNumber + 1);
  52.                     vertices[j + i * (mNumber + 1)].Tv = (float)i / (nNumber + 1);
  53.                 }
  54.             }
  55.         }
  56.         private void IndicesDeclaration()//定义索引
  57.         {
  58.             indexData=new int[6*mNumber*nNumber];
  59.             for (int i = 0; i < nNumber; i++)
  60.             {
  61.                 for (int j = 0; j < mNumber; j++)
  62.                 {
  63.                     indexData[6 * (j + i * mNumber)] = j + i * (mNumber + 1);
  64.                     indexData[6 * (j + i * mNumber) + 1] = j + i * (mNumber + 1)+1;
  65.                     indexData[6 * (j + i * mNumber) + 2] = j + (i + 1) * (mNumber + 1);
  66.                     indexData[6 * (j + i * mNumber) + 3] = j + i * (mNumber + 1) + 1;
  67.                     indexData[6 * (j + i * mNumber) + 4] = j + (i + 1) * (mNumber + 1);
  68.                     indexData[6 * (j + i * mNumber) + 5] = j + (i + 1) * (mNumber + 1)+1;
  69.                 }
  70.             }
  71.         }
  72.         private void LoadTexturesAndMaterials()//导入贴图和材质
  73.         {
  74.             material = new Material();
  75.             material.Diffuse = Color.White;
  76.             material.Specular = Color.LightGray;
  77.             material.SpecularSharpness = 15.0F;
  78.             device.Material = material;
  79.             texture = TextureLoader.FromFile(device, @"E:DirectXDirectX_C#Mediaworld.jpg");
  80.         }
  81.         public void DrawSphere()
  82.         {
  83.             device.SetTexture(0, texture);//设置贴图
  84.             device.VertexFormat = CustomVertex.PositionTextured.Format;
  85.             device.DrawIndexedUserPrimitives(PrimitiveType.TriangleList, 0, (mNumber+1) * (nNumber+1), 2 * mNumber * nNumber, indexData, false, vertices);
  86.         }
  87.     }
  88. }