• [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

    结果:

  • 相关阅读:
    MFC创建dc的总结
    mini2440驱动的静态加载
    linux文件IO的操作
    mini2440led驱动分析
    关于layout_gravity和gravity的区别
    UI界面和组件(二)
    UI界面和组件(一)
    关于Android的组件使用中出现的一些问题(一)
    关于Android api文档的一些问题
    梳理7---关于java中static方法一些记录
  • 原文地址:https://www.cnblogs.com/yhlx125/p/4053410.html
Copyright © 2020-2023  润新知