[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小坐标轴相关推荐
- 计算机图形学——OpenGL学习系列之绘制3D下的小桌子
计算机图形学--OpenGL学习系列之绘制3D下的小桌子 做的一个小练习,主要用到了几何变换还有gl自带的一个绘制立方体的函数,顺便体会一下glPush和glPop的用法.另外,从2D到3D,开心到飞 ...
- python 子图_python 实现在一张图中绘制一个小的子图方法
有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...
- Matlab绘图基础——利用axes(坐标系图形对象)绘制重叠图像 及 一图多轴(一幅图绘制多个坐标轴)
Matlab绘图基础--利用axes(坐标系图形对象)绘制重叠图像 及 一图多轴(一幅图绘制多个坐标轴) - 司徒鲜生 - 博客园 Matlab中axes函数解析_ljh0302的博客-CSDN博客_ ...
- python小游戏-16行代码实现3D撞球小游戏!-源码下载
python小游戏-16行代码实现3D撞球小游戏!-源码下载 所属网站分类: 资源下载 > python小游戏 作者:搞笑 链接: http://www.pythonheidong.com/bl ...
- python画50个图-python 实现在一张图中绘制一个小的子图方法
有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...
- python画简便的图-python 实现在一张图中绘制一个小的子图方法
有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...
- 高德地图上画图!和3D绘制区域
封装了一些方法 前提是引入 高德api 才能使用这个办法 // 绘制进博会的区域$(document).ready(function () {// 绘制板块$.ajax({ //可以是一个json里面 ...
- Matlab绘制各种小波函数及尺度函数图
本次使用的MATLAB版本为2018a,最近的版本测试无误,较远的版本有所差别~~ 进入正题: 我们需要绘制各种小波函数 eg:Haar 这种 对于我们写文章等就很方便了 那么 现在打开MATLAB ...
- python一张图-python 实现在一张图中绘制一个小的子图方法
有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...
最新文章
- 关于网站域名的配置过程
- 【BZOJ3821/UOJ46】玄学(二进制分组,线段树)
- Hash(4) hashtable,hashmap
- Struts2_HelloWorld_2
- 有一句说一千句,是作家....
- 如何选择开源许可证?
- unity常连接mysql,Unity使用BestHttp插件时Socket.IO保持长连接的问题
- 神武显示未能成功连接服务器,神武:疑难问题解答,总有你要的答案
- 2022卡塔尔世界杯来临,体育界最新创意二维码案例大盘点!
- 推荐一些程序猿学习的网站
- 还在用git commit -m 吗?Git 提交规范和自动产生changelog手摸手教程。
- visio任意角度精确旋转图形
- 基于Linux操作系统的 智能家居的设计
- Android如何判断系统是否已经被Root
- whitelabel error page SpEL RCE漏洞复现
- 【软件工程——UML基础教程】
- 大学计算机信息技术实验教程,计算机信息技术实验教程.pdf
- 文献解读 | 单细胞转录组助力解析水稻早期花序的发育轨迹机制
- 《缠中说禅108课》7:给赚了指数亏了钱的一些忠告
- win10/win11家庭版解压缩时,出现错误代码0x80004005的解决办法
热门文章
- android fadingedge,Android:从滚动条中仅删除底部的FadingEdge效果
- 查询liunx上磁盘占用情况
- python递归算法 电影院票价问题_算法课堂实验报告(二)——python递归和分治(第k小的数,大数乘法问题)...
- matlab系统的根轨迹,实验五 利用MATLAB绘制系统根轨迹
- 消息队列面试经典十连问
- 怎么通过ip连接oracle,Oracle 无法通过IP连接问题
- linux搭建mcpe服务器_技术|如何搭建“我的世界”服务器
- mybatis mysql 存储过程_Mysql 存储过程+Mybatis调用实现插入操作例子 | 学步园
- mysql 资深dba_MySQL数据库专家分享资深DBA经验
- spi flash 无法写入数据_非易失性Flash详解