c# 3D效果

zrj0880 2008-02-16 10:25:39
小弟在学习过程中,想在c#中制作出3D的效果,恳请大侠指教阿
我是一点都没做过的啊,恳请可以有代码,哪怕只是做一个小例子的,也可以
...全文
6328 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
looice 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 kkun_3yue3 的回复:]

[/Quote]
这个例子,我有个疑问呢。。。怎么去掉背景?只在桌面上显示那个3D飞机,而没有背景
xq1609 2010-01-07
  • 打赏
  • 举报
回复
25楼的很强,支持25楼
josephbh 2009-06-21
  • 打赏
  • 举报
回复
挺好的,我学习学习
bpf153153 2009-05-13
  • 打赏
  • 举报
回复
朋友能给我个C#做的3D代码吗?QQ:1062626765
自己写的老是有错误!
cai2013 2009-02-25
  • 打赏
  • 举报
回复
支持
zrj0880 2008-04-08
  • 打赏
  • 举报
回复
恩,调试正常了
zrj0880 2008-04-08
  • 打赏
  • 举报
回复
程序执行有错误啊,你给我的那个代码里
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
这块在执行的时候有错误
fengyecsdn 2008-02-27
  • 打赏
  • 举报
回复
你要装DX9C SDK
zrj0880 2008-02-27
  • 打赏
  • 举报
回复
在【.net】选项下同时选中Microsoft.DirectX、Microsoft.DirectX.Direct3D和Microsoft.DirectX.Direct3DX,注意选择的版本要和本章开头列出的版本一致,单击【确定】。
我的引用里没有
zrj0880 2008-02-26
  • 打赏
  • 举报
回复
太强悍了
westcheng 2008-02-25
  • 打赏
  • 举报
回复
不错的说
skyzero110 2008-02-25
  • 打赏
  • 举报
回复
这么复杂不如用3d-max了
kkun_3yue3 2008-02-25
  • 打赏
  • 举报
回复
kkun_3yue3 2008-02-25
  • 打赏
  • 举报
回复
[img=http://www.cnblogs.com/images/cnblogs_com/kkun/124118/o_%e6%97%a0%e6%a0%87%e9%a2%98.JPG]http://www.cnblogs.com/images/cnblogs_com/kkun/124118/o_%e6%97%a0%e6%a0%87%e9%a2%98.JPG[/img]
fengyecsdn 2008-02-25
  • 打赏
  • 举报
回复
能问出这种问题的人,可以肯定对DX基本不了解.
fengyecsdn 2008-02-25
  • 打赏
  • 举报
回复
原文http://blog.csdn.net/fengyecsdn/archive/2005/04/13/345217.aspx

『原创』DX图形显示基本流程(基于MESH静态模型绘制----托管代码)     
fengye - 发表于 - 2005030509514603

MESH的得到一般使用Mesh.FromFile方法。当然它有很多个重载。

一般使用 public static Mesh FromFile(string, MeshFlags, Device, out ExtendedMaterial); 方法。要注意的是,MESH的读取要在初始D3D设备以后来作。在MESH的初始方法中都需要D3D设备为参数,以后的MESH绘制也使用此设备。

对D3D设备的初始化中设置一般的显示属性,比如:深度测试,多重采样,灯光渲染开关,等等。

PresentParameters presentParams = new PresentParameters();

presentParams.Windowed=true;

presentParams.SwapEffect = SwapEffect.Discard;

presentParams.EnableAutoDepthStencil=true;

presentParams.AutoDepthStencilFormat=DepthFormat.D16;

presentParams.MultiSample=MultiSampleType.NonMaskable;

MyDev = new Device(0, DeviceType.Hardware, this,CreateFlags.HardwareVertexProcessing, presentParams);

MyDev.RenderState.MultiSampleAntiAlias=true;

MyDev.RenderState.Lighting=true;

MyDev.RenderState.CullMode=Cull.None;

MyDev.RenderState.ZBufferEnable=true;

MyDev.RenderState.ZBufferFunction=Compare.LessEqual;

MyDev.RenderState.ZBufferWriteEnable=true;

MyDev.RenderState.Ambient=MaterColor;


PresentParameters presentParams = new PresentParameters();

presentParams.Windowed=true;

presentParams.SwapEffect = SwapEffect.Discard;

presentParams.EnableAutoDepthStencil=true;

presentParams.AutoDepthStencilFormat=DepthFormat.D16;

presentParams.MultiSample=MultiSampleType.NonMaskable;

MyDev = new Device(0, DeviceType.Hardware, this,CreateFlags.HardwareVertexProcessing, presentParams);

MyDev.RenderState.MultiSampleAntiAlias=true;

MyDev.RenderState.Lighting=true;

MyDev.RenderState.CullMode=Cull.None;

MyDev.RenderState.ZBufferEnable=true;

MyDev.RenderState.ZBufferFunction=Compare.LessEqual;

MyDev.RenderState.ZBufferWriteEnable=true;

MyDev.RenderState.Ambient=MaterColor;


对于灯光的设置,可以根据需要放在每侦渲染函数内调整,也可以把固定灯光放在绘制之前。


一般绘制一个MESH时候,其中每个模型块都采用相同的世界矩阵。在绘制MESH之前设置好WORLDMATRIX即可。有时一个场景内MESH太多,而有些MESH共同组成一个物体时,对于每个MESH调整WORLDMATRIX可能会非常麻烦。所以最好是按照对应相对坐标调整好这些MESH的坐标,之后对这一组MESH采用同样的WORLDMATRIX。在修改MESH顶点数据之前,先使用Mesh.Clone复制出一个自己控制顶点数据格式的MESH。

public Mesh Clone(MeshFlags, VertexFormats, Device);

根据你需要的 VertexFormats格式,便可以容易的遍历修改顶点数据。当然,在修改前不要忘记LOCK你要修改的数据流。


对于MESH里包含的材质和纹理,需要你手动来调整。在MESH的FROMFILE中,已经OUT出了一个包含纹理的材质组ExtendedMaterial。

我们要声明一个材质组,一个纹理组。

Texture[] meshTextures = new Texture[materials.Length];

Material[] meshMaterials = new Direct3D.Material[materials.Length];

之后分离材质和纹理。

for( int i=0; i<materials.Length; i++ )

{

meshMaterials[i] = materials[i].Material3D;

// Set the ambient color for the material. Direct3D

// does not do this by default.

meshMaterials[i].Ambient = meshMaterials[i].Diffuse;

// Create the texture.

meshTextures[i] = TextureLoader.FromFile(dev,materials[i].TextureFilename);

}



现在我们可以绘制MESH了。

for( int i=0; i<meshMaterials.Length; i++ )

{

// Set the material and texture for this subset.

device.Material = meshMaterials[i];

device.SetTexture(0, meshTextures[i]);


// Draw the mesh subset.

mesh.DrawSubset(i);

}

最后别忘记device.EndScene();device.Present();




在上边D3D设备初始的时候,我们启动了趁度测试,所以,在绘制每侦前,调用CLEAR函数时,一并要清理深度缓冲,否则绘制会一踏糊涂。
li45214521 2008-02-25
  • 打赏
  • 举报
回复
xna
wpf
mdx
你自己看看图形学中的算法自己写
kkun_3yue3 2008-02-25
  • 打赏
  • 举报
回复
//29楼的例子,我用vs2005用不了阿

你的机器需要有一块支持什么shadel 1.1以上的啥啥啥,
另外,你的VS2005需要打SP1补丁,并且需要安装XNA GAME STUDIO 2.0
这些网上搜索一下都能搜索到的,官方可以下载
My_Special100 2008-02-25
  • 打赏
  • 举报
回复
我只是个新手,还不懂。。。。
tommyhuanglei 2008-02-25
  • 打赏
  • 举报
回复
以前一般都主要考虑DirectX
现在可以考虑考虑wpf
加载更多回复(29)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧