Welcome![Sign In][Sign Up]
Location:
Search - directx d3d

Search list

[3D Graphic精通DirectX3D图形与动画程序设计源码1

Description: 精通DirectX 3D图形与动画程序设计 源码 第一部分
Platform: | Size: 19950752 | Author: 853758804@qq.com | Hits:

[Internet-Network用D3D模拟地月系

Description:

 

 

 

  一、建立空窗体

  新建一个工程,添加引用,并导入名称空间。

  加入一个设备对象变量:

private Microsoft.DirectX.Direct3D.Device device = null;

  添加初始化图形函数,并在这里面对设备对象进行实例化:

public void InitializeGraphics()
{
 PresentParameters presentParams = new PresentParameters();
 presentParams.Windowed = true;
 presentParams.SwapEffect = SwapEffect.Flip;
 presentParams.AutoDepthStencilFormat = DepthFormat.D16;
 presentParams.EnableAutoDepthStencil = true;
 device = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, this,  CreateFlags.HardwareVertexProcessing, presentParams);
}

  当程序执行时,需要绘制场景,代码在这个函数里:

public void Render()

{
 // 清空设备,并准备显示下一帧。
 device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black , 1.0f, 0);
 // 设置照相机的位置
 SetupCamera();
 //开始场景
 device.BeginScene();
 if(meshLoaded)
 {
  mesh.Render(meshLoc);
 }
 device.EndScene();
 //显示设备内容。
 device.Present();
}

  设置照相机的位置:

private void SetupCamera()
{
 device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, this.Width / this.Height, 1.0f, 1000.00f);
 device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f ,0.0f, 20.0f), new Vector3(0.0f,0.0f, 0.0f), new Vector3(0,1,0));
}

  现在改变主函数,调用我们写的初始化函数,并显示场景:

[STAThread]

static void Main()
{
 using (Form1 EarthForm = new Form1())
 {
  EarthForm.InitializeGraphics();
  EarthForm.Show();

  while(EarthForm.Created)
  {
   EarthForm.Render();
   Application.DoEvents();
  }
  EarthForm.Dispose();
}

  运行程序,会显示一个空的窗体。

  二、加入地球:

  在这一步里需创建一个3D网格对象,来作为要显示的地球,为此,在工程中新加入一个类Earth,此类可以包含所创建的网格对象的信息。

  加入一些相关变量,含义见注释:

public class Earth : BaseEarth
{
 private Material[] mMaterials; //保存材质
 private Texture[] mTextures; //保存纹理
 private Matrix locationOffset; //用来保存网格对象的相对位置
 private Mesh mMesh = null; //三角形网格对象
 private Device meshDevice; //需要显示在哪个设备上。
}

  在构造函数中,把Device设备拷贝到私有成员变量,这样就可以在这个类的其它方法内使用它,另外就是把位置变量进行赋值:

public Earth(ref Device device, Matrix location): base(ref device)
{
 meshDevice = device;
 locationOffset = location;
}

  下面这个函数是装入.X文件。

public bool LoadMesh(string meshfile)
{
 ExtendedMaterial[] mtrl;
 try
 {
  // 装载文件
  mMesh = Mesh.FromFile(meshfile, MeshFlags.Managed, meshDevice, out mtrl);
  // 如果有材质的话,装入它们
  if ((mtrl != null) && (mtrl.Length > 0))
  {
   mMaterials = new Material[mtrl.Length];
   mTextures = new Texture[mtrl.Length];

   // 得到材质和纹理

   for (int i = 0; i < mtrl.Length; i++)
   {
    mMaterials[i] = mtrl[i].Material3D;
    if ((mtrl[i].TextureFilename != null) && (mtrl[i].TextureFilename != string.Empty))

 

    {
     //前面得到的纹理的路径是相对路径,需要保存的是绝对路径,通过应用程序路径可以获得
     mTextures[i] = TextureLoader.FromFile(meshDevice, @"..\..\" + mtrl[i].TextureFilename);
    }
   }
  }
  return true;
 }
 catch
 {
  return false;
 }
}

  在这个方法内,使用Mesh.FromFile()这个方法,从给定的文件名中找到.X文件,并装入相关数据,一旦数据格式设置完成,可以从此文件中找到材质和贴图信息,并把它存放在数组中,并通过文件路径,得到纹理文件文件的路径,最后返回真值,如果整个过程出现错误,返回假值。

  下面这个Render()方法,是把此对象,即地球显示在设备对象上,此方法较简单,通过变形操作来得到网格对象的X,Y,Z坐标,接着设置网格对象的材质和纹理,最后,将每个材质和纹理应用到每个网格。

public void Render(Matrix worldTransform)
{
 /把位置变为世界坐标
 meshDevice.Transform.World = Matrix.Multiply(locationOffset, worldTransform);
 //绘制网格
 for (int i = 0; i < mMaterials.Length; i++)
 {
  meshDevice.Material = mMaterials[i];
  meshDevice.SetTexture(0, mTextures[i]);
  mMesh.DrawSubset(i);
 }
}

  现在回到窗体代码中,添加引用网格对象的相关变量:

private Earth mesh = null;
private Matrix meshLoc;
private bool meshLoaded = false;

  在图形初始化函数中,需要对网格对象进行初始化。加入下面的代码:

meshLoc = Matrix.Identity;
meshLoc.M41 = 2.0f;
mesh = new Earth(ref device, meshLoc);
if (mesh.LoadMesh(@"..\..\earth.x"))
{
 meshLoaded = true;
}

  代码第一句把网格对象的位置定为原点,接着偏移X轴2个单位,接下来从文件中得到此.X文件。如果成功设置,meshLoaded置为真。注意,这里有一个.X文件,在源代码中有此文件。

 


  在设置相机的函数中,加入一盏灯光:

device.Lights[0].Type = LightType.Directional;
device.Lights[0].Diffuse = Color.White;
device.Lights[0].Direction = new Vector3(0, -1, -1);
device.Lights[0].Update();
device.Lights[0].Enabled = true;


  此灯光较简单,仅为一个直射型白光灯。

最后,在Render()方法中,调用网格对象的Render()方法,以显示地球。

 

  三、使地球旋转

  前面用一个网格对象来建立地球,但此类没有平移,旋转及缩放等方法,下面就加入这些方法,因为这些方法具有通用性,因此可以新建一个类,把这些方法写在这些类中,使地球对象成为它的派生类。

  在工程中新添加一个类:BaseEarth;

  加入进行平移、旋转、缩放的变量:

 

private float xloc = 0.0f;
private float yloc = 0.0f;
private float zloc = 0.0f;
private float xrot = 0.0f;
private float yrot = 0.0f;
private float zrot = 0.0f;
private float xscale = 1.0f;
private float yscale = 1.0f;
private float zscale = 1.0f;


  加入相应的属性代码:

 

public float XLoc
{
 get
 {
  return xloc;
 }
 set
 {
  xloc = value;
 }
}
…………

 

  在Render()虚函数中,应用平移、旋转及缩放。
 

public virtual void Render()
{
 objdevice.MultiplyTransform(TransformType.World,Matrix.Translation(xloc, yloc, zloc));
 objdevice.MultiplyTransform(TransformType.World,Matrix.RotationAxis(new Vector3(1.0f, 0.0f, 0.0f), xrot));
 objdevice.MultiplyTransform(TransformType.World,Matrix.RotationAxis(new Vector3(0.0f, 1.0f, 0.0f), yrot));
 objdevice.MultiplyTransform(TransformType.World,Matrix.RotationAxis(new Vector3(0.0f, 0.0f, 1.0f), zrot));
 objdevice.MultiplyTransform(TransformType.World,Matrix.Scaling(xscale, yscale, zscale));
 return;
}

 

  现在回到地球类,需要将其改为新类的派生类,同时更改构造函数,另外,在Render()方法中,应先调用基类的Render()方法:


public override void Render()
{
 base.Render();
 //把位置变为世界坐标
 // meshDevice.Transform.World = Matrix.Multiply(locationOffset, worldTransform);
 //绘制网格
 。。。。。。
}

 


  现在,由于在基类中可以设置对象位置,因此,可以把与locationOffset相关,即与设置位置的变量及语句注释掉。

  四、加入月球

  在这一步加入月球,实际上是再创建一个网格对象新实例,只是把纹理进行更改即可,为了代码模块性更好,把两个对象放在一个新类CModel中,在工程中新添加一个类CModel,并声明对象实例。


public class cModel
{
 private cMeshObject mesh1 = null;
 private cMeshObject mesh2 = null;
 private bool modelloaded;
}


  把窗口代码中的Load()事件,放在CModel中,这次不仅生成了地球,而且生成了月球。

 


public void Load(ref Device device)
{
 mesh1 = new Earth(ref device);
 mesh2 = new Earth(ref device);
 if (mesh1.LoadMesh(@"..\..\earth2.x"))
 {
  modelloaded = true;
 }
 else
 {
  modelloaded = false;
 }
 if (mesh2.LoadMesh(@"..\..\moon.x"))
 {
  mesh2.XLoc += 20.0f;
  modelloaded = true;
 }
 else
 {
  modelloaded = false;
 }
}

 

  下面的Update()方法中,参数dir 用来判断是顺时针旋转还是逆时针旋转,另外,地球和月球绕Y轴增加的角度大小不同,也就决定了二者旋转的速度不同。


public void Update(int dir)
{
 if(dir > 0)
 {
  mesh1.YRot += 0.02f;
  mesh2.YRot += 0.05f;
 }
 else if(dir < 0)
 {
  mesh1.YRot -= 0.02f;
  mesh2.YRot -= 0.05f;
 }
}


  在下面的render()方法中,生成显示月球和地球:

 


public void Render(ref Device device)
{
 device.Transform.World = Matrix.Identity;
 if(modelloaded)
 {
  mesh1.Render();
  mesh2.Render();
 }
}


  把窗口代码中的加入灯光的方法,也放在此类中:


public void LoadLights(ref Device device)
{
 device.Lights[0].Type = LightType.Directional;
 device.Lights[0].Diffuse = Color.White;
 device.Lights[0].Position = new Vector3(0.0f, 0.0f, 25.0f);
 device.Lights[0].Direction = new Vector3(0, 0, -1);
}
public void Light(ref Device device)
{
 device.Lights[0].Update();
 device.Lights[0].Enabled = true;
}


  五、与鼠标交互操作

  为了实现与键盘、鼠标交互,新添加一个类:CMouse,添加引用Microsoft.DirectX.DirectInput,并添加命名空间。加入相关变量:


private Microsoft.DirectX.DirectInput.Device mouse = null;
public System.Threading.AutoResetEvent MouseUpdated;
private float x, y, z = 0.0f;
private byte[] buttons;

 

  在下面的构造函数代码中,首先创建鼠标设备,并初始化回调事件:


public CMouse(System.Windows.Forms.Control control)
{
 mouse = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Mouse);
 mouse.SetCooperativeLevel(control, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
 mouse.Properties.AxisModeAbsolute = false;
 MouseUpdated = new System.Threading.AutoResetEvent(false);
 mouse.SetEventNotification(MouseUpdated);
 mouse.Acquire();
 Update();

 


  下面的Update()方法中获得鼠标的坐标值,并赋给私有成员变量:

public void Update()
{
 MouseState state = mouse.CurrentMouseState;
 x = state.X;
 y = state.Y;
 z = state.Z;
 buttons = state.GetMouseButtons();
}


  还需要有一个函数来检测鼠标左键是否按下:

 


public bool LeftButtonDown
{
 get
 {
  bool a;
  return a = (buttons[0] != 0);
 }
}


  六、大结局

  现在已经做完了准备工作,返回到窗口代码中,需要对这里的代码重新进行一些调整:

  在图形初始化函数中创建一个CModel类及CMouse类:

 

private CModel model = null;
private CMouse mouse = null;
private bool leftbuttondown = false;
private float mousexloc;

 

  添加对鼠标初始化的方法:

 

网管联盟bitsCN@com


public void InitializeInput()
{
 mouse = new CMouse(this);
}


  添加UpdateInputState()方法,当按下鼠标左键时,将leftbuttondown值设置为真,当鼠标抬起时,将mousexloc置0:


private void UpdateInputState()
{
 mouse.Update();
 if (mouse.LeftButtonDown)
 {
  if(leftbuttondown == false)
  {
   mousexloc = 0.0f;
   leftbuttondown = true;
  }
  else
  {
   mousexloc = -mouse.X;
  }
 }
 else
 {
  leftbuttondown = false;
  mousexloc = 0.0f;
 }
}


  在此程序中,只对X值进行了操作,即只能左右转。

  Render()方法更新如下:

public void Render()
{
 UpdateInputState();
 device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.DarkGray, 1.0f, 0);
 SetupCamera();
 device.BeginScene();
 model.Update((int)mousexloc);
 model.Light(ref device);
 model.Render(ref device);
 device.EndScene();
 device.Present();
}

 

  最后更改Main()主函数:


static void Main()
{
 using (Form1 EarthForm = new Form1())
 {
  EarthForm.InitializeGraphics();
  EarthForm.InitializeInput();
  EarthForm.Show();
  while(EarthForm.Created)
  {
   EarthForm.Render();
   Application.DoEvents();
  }
  EarthForm.Dispose();
 }
 


Platform: | Size: 11817 | Author: mantoutou | Hits:

[Graph programdirectx+3d图形与动画程序设计源码

Description: directx+3d图形与动画程序设计源码,很好的D3D学习资料
Platform: | Size: 9326929 | Author: zfeng@126.com | Hits:

[DirextXD3D网格基础使用示例

Description: DirectX 3D 9.0的网格基础使用示例
Platform: | Size: 4418782 | Author: andy@igz.cc | Hits:

[DirextXisdom_sdk

Description: 游戏开发包。DirectX相关的组件包装, DirectDraw、D3D、DirectInput、DirectSound、DirectPlay、DirectMedia、及MIDI播放;图形文件读写;网络编程;多线程等方面很多内容- Game development package. DirectX correlation module packing, DirectDraw, D3D, DirectInput, DirectSound, DirectPlay, DirectMedia, and MIDI broadcast; Graphic file read-write; Network programming; Aspect very many contents and so on multithreading
Platform: | Size: 1693696 | Author: | Hits:

[Windows Developd3d02

Description: directx
Platform: | Size: 77824 | Author: 尹克 | Hits:

[BooksD3D5

Description: 《DirectX 5.0游戏编程指南之Direct3D》-"DirectX 5.0 games Programming Guide for Direct3D"
Platform: | Size: 45056 | Author: 沈忠亦 | Hits:

[Multimedia Develop传统多人连网对战arpg游戏《混乱竞技场》源代码

Description: 客户端GSLIB\GSLIB.DSW包含含游戏客户段代码、图形引擎代码和资源工具代码) GSLIB是一个以D3D渲染为主的2d引擎,是作者多年的工作经验积累写成的引擎,引擎效率应该不错,整合了游戏中大量常用的技术,作者认为经过优化以提高至少一倍以上的速度.-client GSLIB \ GSLIB.DSW included with the game of the client code, graphics engine source code tools and resources) is a GSLIB D3D based 2d rendering engine, is the author of many years of work experience accumulated written engines, engine efficiency should be true that the integration of large quantities of used games the technology, the authors believe optimized to increase at least double the speed.
Platform: | Size: 2484224 | Author: 大灰熊 | Hits:

[DirextXD3DShadow

Description: 用DIRECTX 3D 写的阴暗计算,对从事写日照分析有帮助-using DirectX 3D write the dark, was engaged to help sunshine analysis
Platform: | Size: 1731584 | Author: wuyu | Hits:

[DirextXbaseD3D20

Description: 关于一个基于directx 3d的游戏,界面时尚新颖,可控参考。-based on a DirectX 3d game, stylish new interface, controllable reference.
Platform: | Size: 1477632 | Author: 上面 | Hits:

[Game ProgramD3D9Cartoon

Description: 现在市面上流行的3D游戏画面越来越炫目,不过也有一些为了营造一种特殊的效果而使用了卡通渲染技术,比如PC游戏中的《杀手XIII》,《忍者神龟》;PS2游戏中的《真红之泪》,《犬夜叉》等等。这些游戏的画面看上去很像漫画,感觉比较有趣。下面就介绍一种简单的实现方法。 所谓用卡通渲染技术绘制的三维物体一般都有两个明显的特征,一个特征是物体表面覆盖着大块的单调颜色,而且光影变化比较剧烈;另一个特征是物体拥有粗重的边缘效果。如果能自己控制光照和阴影,就可以达到目的。而DirectX 9.0 中的顶点渲染(Vertex Shaders)提供了这样一个途径,使我们可以实现自己的想法。 顶点渲染与以前的T&L在渲染流程中处于二选一的地位,一段代码最多只能有128条指令,而且不能有循环,判断和跳转指令,全是线性执行指令。每次只能有一个Shader程序是激活的,Vertex Shaders让我们可以实时地控制模型的空间变换,光照处理以及像素渲染。 那么现在先来解决第一个问题。我们可以用光线的亮度值作为物体的纹理坐标,这就产生一种带状纹理的效果,然后再调整相应的颜色即可。-now the fashion for 3D games more compelling picture, But there are also some in order to create a special effect and the use of the cartoon rendering technology, PC games such as the "killer XIII," "Turtles"; PS2 game of "truth red tears," "two characters." These games comic picture looks like, I feel more interesting. Now, on a simple method. Using the so-called cartoon rendering of 3D rendering objects normally have two obvious feature a surface characteristics of an object covered with chunks of dull colors, but more dramatic changes in the Universe; Another characteristic is heavy objects have the edge effect. If the ability to control their own light and shadow, we can achieve the aim. DirectX 9.0 vertex Rendering (Vertex Shaders) provide such
Platform: | Size: 662528 | Author: 倪明 | Hits:

[Otherd3d_AlphaBlending

Description: 在DirectX 3D中使用Alpha Blending的方式来实现伪运动模糊的效果-in DirectX 3D Alpha Blending the use of the method to achieve pseudo-campaign mode Paste results
Platform: | Size: 30720 | Author: weiguian | Hits:

[Game EngineCharacter_Engine

Description: 直接利用Directx9的D3D对象,进行人物绘制,动作表现-direct use of the Display Object Directx9, figure drawing, motor performance
Platform: | Size: 738304 | Author: RayDeng | Hits:

[DirextXD3D9UI

Description: 基于DX9的UI界面设计,自己收藏的一个例子, 这套界面最初是根据Alan Thorn的《DirectX 9 User Interfaces Design and Implementation》一书介绍的原理所编写-DX9-based interface of the UI design, an example of their own collections, this interface is based on Alan Thorn initially the
Platform: | Size: 164864 | Author: 李赛伟 | Hits:

[VC/MFCmfcd3d

Description: MFC+D3D编程:在MFC单文档界面下使用D3D9.0进行编程-MFC+ D3D programming: In the MFC Single Document Interface program to use D3D9.0
Platform: | Size: 60416 | Author: 王王王 | Hits:

[3D GraphicD3D-draw

Description: 一个使用DirectX 3D输出的实例,做了一个类似红细胞在血管内流动的效果.-DirectX 3D output using the example of doing a similar flow of red blood cells in the vascular effect.
Platform: | Size: 211968 | Author: demon | Hits:

[DirextXAdvancedAnimationwithDirectX(bookcodes)

Description: directX高级动画制作一书的源代码,想学习directX高级技术的可以下载看看,要求你要有一定的DirectX的基础知识-High directX animation book source code, want to learn advanced technology directX can download and see, ask you to have a certain basic knowledge of DirectX
Platform: | Size: 12299264 | Author: hongqiang | Hits:

[3D Graphicshexianpengzhuang

Description: D3D游戏开发 DirectX 9.0 射线碰撞示例-D3D Game Development DirectX 9.0 Collision-ray sample
Platform: | Size: 2048 | Author: 小雨 | Hits:

[DirextXDirectX9.03DGameDevelopmentProgrammingsourcecodePa

Description: 经典C++ \D3D 游戏编程书籍《DirectX 9.0 3D Game Development Programming》 中的实例代码-Classic C++ \ D3D game programming books, " DirectX 9.0 3D Game Development Programming" in the instance of the code
Platform: | Size: 2006016 | Author: 历代 | Hits:

[DirextXDirectX9.03DGameDevelopmentProgrammingsourcecodePa

Description: 经典C++ \D3D 游戏编程书籍《DirectX 9.0 3D Game Development Programming》 中的实例代码 这是9-15章的(上次是1-8章)-Classic C++ \ D3D game programming books, " DirectX 9.0 3D Game Development Programming" in the example code in this 9-15 chapter (the last is the chapter 1-8)
Platform: | Size: 688128 | Author: 历代 | Hits:
« 12 3 4 5 6 7 »

CodeBus www.codebus.net