[3D]绘制XYZ小坐标轴

源码:

 1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using SlimDX;  6 using RGeos.SlimScene.Core;  7 using SlimDX.Direct3D9;  8 using System.Drawing;  9 
 10 namespace RGeos.SlimScene.Renderable  11 {  12     public class Axis : IRenderable  13  {  14         public bool IsOn = true;  15         public bool IsInitialize = false;  16         public Mesh mMeshArrow = null;  17         public Mesh mMeshStick = null;  18         private Material material;//定义材质变量 
 19         private Material materialStick;//定义材质变量 
 20         public void Initialize(DrawArgs drawArgs)  21  {  22             if (IsOn && !IsInitialize)  23  {  24                 mMeshArrow = Mesh.CreateCylinder(drawArgs.Device, 1.5f, 0.0f, 5.0f, 12, 5);  25                 mMeshStick = Mesh.CreateCylinder(drawArgs.Device, 0.5f, 0.5f, 10.0f, 6, 6);  26  LoadTexturesAndMaterials(drawArgs);  27  }  28             IsInitialize = true;  29  }  30         private void LoadTexturesAndMaterials(DrawArgs drawArgs)//导入贴图和材质 
 31  {  32             material = new Material();  33             material.Diffuse = Color.Red;  34             material.Ambient = Color.White;  35             material.Specular = Color.Yellow;  36             material.Power = 15.0F;  37 
 38             materialStick = new Material();  39             materialStick.Diffuse = Color.Yellow;  40             materialStick.Ambient = Color.White;  41             materialStick.Specular = Color.Yellow;  42             materialStick.Power = 15.0F;  43  }  44         public void Update(DrawArgs drawArgs)  45  {  46             if (IsOn && !IsInitialize)  47  {  48  Initialize(drawArgs);  49  }  50  }  51 
 52         public void Render(DrawArgs drawArgs)  53  {  54             Matrix world = drawArgs.Device.GetTransform(TransformState.World);  55             int currentColorOp = drawArgs.Device.GetTextureStageState(0, TextureStage.ColorOperation);  56             int lightCur = drawArgs.Device.GetRenderState(RenderState.Lighting);  57             try
 58  {  59                 drawArgs.Device.SetRenderState(RenderState.Lighting, true);  60                 drawArgs.Device.EnableLight(0, true);  61  AxisX(drawArgs);  62  AxisY(drawArgs);  63  AxisZ(drawArgs);  64 
 65  }  66             catch (Exception)  67  {  68  }  69             finally
 70  {  71                 drawArgs.Device.EnableLight(0, false);  72                 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, currentColorOp);  73  drawArgs.Device.SetTransform(TransformState.World, world);  74  drawArgs.Device.SetRenderState(RenderState.Lighting, lightCur);  75  }  76 
 77  }  78 
 79         public void AxisX(DrawArgs drawArgs)  80  {  81             Light light = new Light();  82             light.Type = LightType.Spot;  83             light.Diffuse = Color.White;  84             light.Direction = new Vector3(mPosition.X, mPosition.Y + 2, mPosition.Z + 4);  85             drawArgs.Device.SetLight(0, light);  86 
 87             //drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.SelectArg1);
 88  drawArgs.Device.SetRenderState(RenderState.Ambient, Color.FromArgb(Color.Red.ToArgb()).ToArgb());  89 
 90             drawArgs.Device.Material = material;  91 
 92             Matrix MoveModel = Matrix.Translation(new Vector3(12.5f, 0f, 0f));  93             MoveModel = Matrix.RotationY((float)Math.PI / 2) * MoveModel;//右乘
 94             Matrix tmp = Matrix.RotationZ((float)mAngle);  95             tmp = tmp * Matrix.Translation(mPosition.X, mPosition.Y, mPosition.Z);  96             tmp = MoveModel * tmp;  97  drawArgs.Device.SetTransform(TransformState.World, tmp);  98             //设置顶点格式
 99             mMeshArrow.DrawSubset(0); 100 
101             Light light2 = new Light(); 102             light2.Type = LightType.Directional; 103             light2.Diffuse = Color.White; 104             light.Direction = new Vector3(mPosition.X, mPosition.Y + 2, mPosition.Z + 4); 105             drawArgs.Device.SetLight(0, light2); 106 
107  drawArgs.Device.SetRenderState(RenderState.Ambient, Color.FromArgb(Color.Red.ToArgb()).ToArgb()); 108 
109             drawArgs.Device.Material = materialStick; 110 
111             Matrix MoveModel2 = Matrix.Translation(new Vector3(5, 0, 0)); 112             MoveModel2 = Matrix.RotationY((float)Math.PI / 2) * MoveModel2; 113             Matrix tmp2 = Matrix.RotationZ((float)mAngle); 114             tmp2 = tmp2 * Matrix.Translation(mPosition.X, mPosition.Y, mPosition.Z); 115             tmp2 = MoveModel2 * tmp2; 116  drawArgs.Device.SetTransform(TransformState.World, tmp2); 117             mMeshStick.DrawSubset(0); 118  } 119 
120         public void AxisY(DrawArgs drawArgs) 121  { 122             
123             Light light = new Light(); 124             light.Type = LightType.Spot; 125             light.Diffuse = Color.White; 126             light.Direction = new Vector3(mPosition.X, mPosition.Y + 2, mPosition.Z + 4); 127             drawArgs.Device.SetLight(0, light); 128 
129             //drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.SelectArg1);
130  drawArgs.Device.SetRenderState(RenderState.Ambient, Color.FromArgb(Color.Green.ToArgb()).ToArgb()); 131 
132             drawArgs.Device.Material = material; 133 
134             Matrix MoveModel = Matrix.Translation(new Vector3(0f, 12.5f, 0f)); 135             MoveModel = Matrix.RotationX((float)-Math.PI / 2) * MoveModel;//右乘
136             Matrix tmp = Matrix.RotationZ((float)mAngle); 137             tmp = tmp * Matrix.Translation(mPosition.X, mPosition.Y, mPosition.Z); 138             tmp = MoveModel * tmp; 139  drawArgs.Device.SetTransform(TransformState.World, tmp); 140             //设置顶点格式
141             mMeshArrow.DrawSubset(0); 142 
143             Light light2 = new Light(); 144             light2.Type = LightType.Directional; 145             light2.Diffuse = Color.White; 146             light.Direction = new Vector3(mPosition.X, mPosition.Y + 2, mPosition.Z + 4); 147             drawArgs.Device.SetLight(0, light2); 148 
149  drawArgs.Device.SetRenderState(RenderState.Ambient, Color.FromArgb(Color.Green.ToArgb()).ToArgb()); 150 
151             drawArgs.Device.Material = materialStick; 152 
153             Matrix MoveModel2 = Matrix.Translation(new Vector3(0, 5, 0)); 154             MoveModel2 = Matrix.RotationX((float)-Math.PI / 2) * MoveModel2; 155             Matrix tmp2 = Matrix.RotationZ((float)mAngle); 156             tmp2 = tmp2 * Matrix.Translation(mPosition.X, mPosition.Y, mPosition.Z); 157             tmp2 = MoveModel2 * tmp2; 158  drawArgs.Device.SetTransform(TransformState.World, tmp2); 159             mMeshStick.DrawSubset(0); 160  } 161 
162         public void AxisZ(DrawArgs drawArgs) 163  { 164             
165             Light light = new Light(); 166             light.Type = LightType.Spot; 167             light.Diffuse = Color.White; 168             light.Direction = new Vector3(mPosition.X, mPosition.Y + 2, mPosition.Z + 4); 169             drawArgs.Device.SetLight(0, light); 170 
171             //drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.SelectArg1);
172  drawArgs.Device.SetRenderState(RenderState.Ambient, Color.FromArgb(Color.Blue.ToArgb()).ToArgb()); 173 
174             drawArgs.Device.Material = material; 175 
176             Matrix MoveModel = Matrix.Translation(new Vector3(0f, 0f, 12.5f)); 177           // MoveModel = Matrix.RotationX((float)Math.PI) * MoveModel;//右乘
178             Matrix tmp = Matrix.RotationZ((float)mAngle); 179             tmp = tmp * Matrix.Translation(mPosition.X, mPosition.Y, mPosition.Z); 180             tmp = MoveModel * tmp; 181  drawArgs.Device.SetTransform(TransformState.World, tmp); 182             //设置顶点格式
183             mMeshArrow.DrawSubset(0); 184 
185             Light light2 = new Light(); 186             light2.Type = LightType.Directional; 187             light2.Diffuse = Color.White; 188             light.Direction = new Vector3(mPosition.X, mPosition.Y + 2, mPosition.Z + 4); 189             drawArgs.Device.SetLight(0, light2); 190 
191  drawArgs.Device.SetRenderState(RenderState.Ambient, Color.FromArgb(Color.Blue.ToArgb()).ToArgb()); 192 
193             drawArgs.Device.Material = materialStick; 194 
195             Matrix MoveModel2 = Matrix.Translation(new Vector3(0, 0, 5)); 196            // MoveModel2 = Matrix.RotationX((float)Math.PI) * MoveModel2;
197             Matrix tmp2 = Matrix.RotationZ((float)mAngle); 198             tmp2 = tmp2 * Matrix.Translation(mPosition.X, mPosition.Y, mPosition.Z); 199             tmp2 = MoveModel2 * tmp2; 200  drawArgs.Device.SetTransform(TransformState.World, tmp2); 201             mMeshStick.DrawSubset(0); 202  } 203 
204 
205         public void Dispose() 206  { 207             if (mMeshArrow != null && !mMeshArrow.Disposed) 208  { 209  mMeshArrow.Dispose(); 210                 mMeshArrow = null; 211  } 212             if (mMeshStick != null && !mMeshStick.Disposed) 213  { 214  mMeshStick.Dispose(); 215                 mMeshStick = null; 216  } 217             IsInitialize = false; 218  } 219 
220         public double mAngle 221  { 222             get; 223             set; 224  } 225 
226         public Vector3 mPosition 227  { 228             get; 229             set; 230  } 231 
232         public void SetTransform(Vector3 position) 233  { 234             mPosition = position; 235  } 236 
237         public void SetRotateZ(double angle) 238  { 239             mAngle = angle; 240  } 241  } 242 }
View Code

结果:

[3D]绘制XYZ小坐标轴_第1张图片

你可能感兴趣的:(3D)