Welcome![Sign In][Sign Up]
Location:
Search - D3D图形

Search list

[Other resourced3d

Description: 一个3d初级者的很好示例,基于direct3d9.0,包括创建图形,加载贴图,改变视角,改变物体的运动,并且改变贴图.
Platform: | Size: 406632 | Author: huangfei | Hits:

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

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

Description: 图形绘画中的3d网格图-graphic painting of 3d grid map
Platform: | Size: 29696 | Author: james | Hits:

[3D Graphic3d sge

Description: 需要d3d 9SDK,一个图形引擎的一部分,包括3DS MAX的导出插件,模型文件导入,四叉树LOD,等。 -D3D 9SDK needs, a part of the graphics engine, including 3DS MAX plug-derived model file import, quadtree LOD, etc.
Platform: | Size: 990208 | 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:

[OpenGL program3D引擎

Description: 别误会呀,是高中时的作品,用三角函数实现3D图形的显示,不过跟OpenGL和D3D一点关系也没有,只是三角函数的应用-other misunderstood it, is a high school works with trigonometry 3D graphics, But with OpenGL and D3D 1:00 relations has merely trigonometry Application
Platform: | Size: 83968 | Author: 张心海 | Hits:

[Booksd3dmove

Description: 基于D3D的三为虚拟人运动显示。转自《计算机辅助设计与图形学学报》。-based on the Motion of three virtual movement shows. Decanted from the "computer-aided design and graphics Journal."
Platform: | Size: 754688 | Author: ruanjing | Hits:

[MPIfluidsD3D

Description: 基于最新一代通用GPU--Geforce8800,在CUDA平台上开发流体模拟程序,是基于GPU的通用计算应用在图形学领域的一个范例。由于该环境在国内不常见,并且支持模拟环境,保留了可执行文件作为参考。-based on the latest generation of common GPU-- Geforce8800. CUDA platform in the development of fluid simulation program, GPU is based on the generic terms used in the field of graphics one example. As the environment in China is not uncommon, and supports simulation environment, while retaining the executable file as a reference.
Platform: | Size: 1684480 | Author: 白洪涛 | Hits:

[DirextXPick

Description: 用鼠标拾取在D3D中用画的图形-Use the mouse to pick up with painting in the D3D graphics
Platform: | Size: 15360 | Author: | Hits:

[3D Graphicd3d

Description: 一个3d初级者的很好示例,基于direct3d9.0,包括创建图形,加载贴图,改变视角,改变物体的运动,并且改变贴图.-3d junior a good example of those who, based on the direct3d9.0, including creating graphics, load maps, change perspective, change the object movement, and change the map.
Platform: | Size: 3730432 | Author: huangfei | Hits:

[Game Programsf_2008411

Description: 跨平台2D引擎,任何图形设备(2d/3d)均可使用 精灵引擎包括:精灵(支持HotPoint),45度斜角地图,图层,ViewPort,层管理器。 图形引擎包括:ISurf通用2D绘图接口。目前有一个DDraw7的实现;IFont接口。还有一个CGdiFont实现。 *声明:欢迎学习研究或修改,未经本人许可,严禁用于商业用途 Copyright instemast 精灵引擎部分,我发现SUN的J2ME设计的还不错,所以参考了他的设计。 不过J2ME是针对移动设备的,不支持45度斜角地图,我支持了一下。 图形绘制部分,我抽象出了出一个ISurf接口来完成图形绘制。这个接口我改了好几次。 不支持位图Alpha通道,但是支持单个Alpha值。 ISurf接口中的Color格式为X8R8G8B8,不过具体设备上的具体实现与之可能不同。 你可以用D3D实现这个ISurf,也可以用DDraw实现他。目前我只提供了DDraw实现。 另外要说的是,不是说做3D游戏就不需要实现这个2D接口了。 由于我的UI是基于ISurf接口的,所以我的3D游戏也需要实现ISurf,以使UI工作。 里面用到的其他头文件,我也共享了出来,保证可以编译。-err
Platform: | Size: 39936 | Author: test | Hits:

[3D GraphicPhysXBoxes

Description: Ageia s PhysX(著名的游戏物理库) D3D 9使用演示代码。由于PhysX物理库使用OpenGL代码实现图形着色,从而使许多用DirectX 3D的程序员不能使用/读懂demo代码,这是使用D3D着色引擎重新写的一些demo代码。-Ageia s PhysX (well-known game physics library) D3D 9 using the demo code. PhysX physics library as a result of the use of OpenGL graphics rendering code so that many use the DirectX 3D programmer can not use/read demo code, which is the use of D3D shaders to re-write some demo code.
Platform: | Size: 59392 | Author: GoldenCloud | Hits:

[3D GraphicPhysXCharacterController1

Description: Ageia s PhysX(著名的游戏物理库) D3D 9使用代码演示。由于PhysX物理库使用OpenGL代码实现图形着色,从而 使许多用DirectX 3D的程序员不能使用/读懂demo代码,这是使用D3D着色引擎重新写的一些demo代码。 - 角色控制(带执行文件)-Ageia s PhysX (well-known game physics library) D3D 9 demo using the code. PhysX physics library as a result of the use of OpenGL graphics rendering code so that many use the DirectX 3D programmer can not use/read demo code, which is the use of D3D shaders to re-write some demo code.- The role of control (with the implementation of document)
Platform: | Size: 187392 | Author: GoldenCloud | Hits:

[3D GraphicPhysXCollisionCallback

Description: Ageia s PhysX(著名的游戏物理库) D3D 9使用代码演示。由于PhysX物理库使用OpenGL代码实现图形着色,从而使许多用DirectX 3D的程序员不能使用/读懂demo代码,这是使用D3D着色引擎重新写的一些demo代码。-Collision Callback(带执行文件)-Ageia s PhysX (well-known game physics library) D3D 9 demo using the code. PhysX physics library as a result of the use of OpenGL graphics rendering code so that many use the DirectX 3D programmer can not use/read demo code, which is the use of D3D shaders to re-write some demo code.-Collision Callback (with the implementation of document)
Platform: | Size: 60416 | Author: GoldenCloud | Hits:

[Windows DevelopShadow

Description: D3D实现的阴影体,主要参考D3D图形设计此书,代码运行通过,很适合初学阴影体的参考-D3D realize the shadow body, the main reference D3D graphic design book, code to run through, it is suitable for beginners shadow of the reference body
Platform: | Size: 6066176 | Author: 陈翔飞 | Hits:

[3D GraphicD3D-HelloWorld

Description: 《D3D图形程序设计》一书的第一章源码helloworld-resource code for “hello world"
Platform: | Size: 30720 | Author: zhangxuan | Hits:

[DirextXweiweiskybox

Description: 一个不断旋转播放的怪物盒子,里面有很多基础的功能代码。d3d图形渲染。-Play an ever-rotating monster box, there are many basic function code. d3d graphics rendering.
Platform: | Size: 4800512 | Author: 龚伟伟 | Hits:
« 12 3 4 »

CodeBus www.codebus.net