源码:

  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. 计算机图形学——OpenGL学习系列之绘制3D下的小桌子

    计算机图形学--OpenGL学习系列之绘制3D下的小桌子 做的一个小练习,主要用到了几何变换还有gl自带的一个绘制立方体的函数,顺便体会一下glPush和glPop的用法.另外,从2D到3D,开心到飞 ...

  2. python 子图_python 实现在一张图中绘制一个小的子图方法

    有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...

  3. Matlab绘图基础——利用axes(坐标系图形对象)绘制重叠图像 及 一图多轴(一幅图绘制多个坐标轴)

    Matlab绘图基础--利用axes(坐标系图形对象)绘制重叠图像 及 一图多轴(一幅图绘制多个坐标轴) - 司徒鲜生 - 博客园 Matlab中axes函数解析_ljh0302的博客-CSDN博客_ ...

  4. python小游戏-16行代码实现3D撞球小游戏!-源码下载

    python小游戏-16行代码实现3D撞球小游戏!-源码下载 所属网站分类: 资源下载 > python小游戏 作者:搞笑 链接: http://www.pythonheidong.com/bl ...

  5. python画50个图-python 实现在一张图中绘制一个小的子图方法

    有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...

  6. python画简便的图-python 实现在一张图中绘制一个小的子图方法

    有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...

  7. 高德地图上画图!和3D绘制区域

    封装了一些方法 前提是引入 高德api 才能使用这个办法 // 绘制进博会的区域$(document).ready(function () {// 绘制板块$.ajax({ //可以是一个json里面 ...

  8. Matlab绘制各种小波函数及尺度函数图

    本次使用的MATLAB版本为2018a,最近的版本测试无误,较远的版本有所差别~~ 进入正题: 我们需要绘制各种小波函数  eg:Haar 这种 对于我们写文章等就很方便了 那么 现在打开MATLAB ...

  9. python一张图-python 实现在一张图中绘制一个小的子图方法

    有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...

最新文章

  1. 关于网站域名的配置过程
  2. 【BZOJ3821/UOJ46】玄学(二进制分组,线段树)
  3. Hash(4) hashtable,hashmap
  4. Struts2_HelloWorld_2
  5. 有一句说一千句,是作家....
  6. 如何选择开源许可证?
  7. unity常连接mysql,Unity使用BestHttp插件时Socket.IO保持长连接的问题
  8. 神武显示未能成功连接服务器,神武:疑难问题解答,总有你要的答案
  9. 2022卡塔尔世界杯来临,体育界最新创意二维码案例大盘点!
  10. 推荐一些程序猿学习的网站
  11. 还在用git commit -m 吗?Git 提交规范和自动产生changelog手摸手教程。
  12. visio任意角度精确旋转图形
  13. 基于Linux操作系统的 智能家居的设计
  14. Android如何判断系统是否已经被Root
  15. whitelabel error page SpEL RCE漏洞复现
  16. 【软件工程——UML基础教程】
  17. 大学计算机信息技术实验教程,计算机信息技术实验教程.pdf
  18. 文献解读 | 单细胞转录组助力解析水稻早期花序的发育轨迹机制
  19. 《缠中说禅108课》7:给赚了指数亏了钱的一些忠告
  20. win10/win11家庭版解压缩时,出现错误代码0x80004005的解决办法

热门文章

  1. android fadingedge,Android:从滚动条中仅删除底部的FadingEdge效果
  2. 查询liunx上磁盘占用情况
  3. python递归算法 电影院票价问题_算法课堂实验报告(二)——python递归和分治(第k小的数,大数乘法问题)...
  4. matlab系统的根轨迹,实验五 利用MATLAB绘制系统根轨迹
  5. 消息队列面试经典十连问
  6. 怎么通过ip连接oracle,Oracle 无法通过IP连接问题
  7. linux搭建mcpe服务器_技术|如何搭建“我的世界”服务器
  8. mybatis mysql 存储过程_Mysql 存储过程+Mybatis调用实现插入操作例子 | 学步园
  9. mysql 资深dba_MySQL数据库专家分享资深DBA经验
  10. spi flash 无法写入数据_非易失性Flash详解