用VC#进行DirectX开发,程序结构大体都是一样的。
上一篇博文,VC#版DirectX开发入门详解
http://blog.csdn.net/bcbobo21cn/article/details/44890937
其程序结构如下图:
此次摄像机的例子程序结构如下图:
程序的结构都是:定义绘图设备,一个窗体构造函数,一个Main()函数,一个初始化D3D函数,一个Render()函数;
主要绘制工作在Render()中进行。
下面做摄像机的例子。
摄像机基础
三个概念:世界空间(world space)、摄像机空间(camera space)和模型空间(model space) 。世界空间(world space)可以认为是客观世界空间,所有对象都位于这个世界空间中。摄像机空间(camera space)用于展示显示区域,类似于人的眼睛。模型空间(model space)为模型自身的空间坐标系,如导入某个模型之前在建模时就具有的空间。
再三个概念: View Transformation 、 World Transformation 和 Projection Transformation。View Transformation(视图变换)是表示观察者位于世界空间,也称摄像机变换,把顶点转换成摄像机空间中的点。World Transformation (世界变换)是用于从模型空间转换坐标到世界坐标。Projection Transformation(投影变换)可以认为是用来控制摄像机的,类似于设置摄像机镜头, 这也是这三种变换形式中最复杂的。 其中定义视图变换和投影变换是模拟摄像机必须的, 若不指定世界矩阵, 默认情况下它为一个四阶单位矩阵。三维空间中的坐标,经过世界变换、视图变换(摄像机变换)、投影变换和屏幕转换,才得到
二维屏幕上的坐标。
创建视图矩阵:
float eyez=-20;
......
Vector3 eye = new Vector3(20, 0, eyez);
Vector3 at = new Vector3(0, 0, 0);
Vector3 up = new Vector3(0, 1, 0);
Matrix viewMatrix = Matrix.LookAtLH(eye, at, up);
建立投影矩阵:
Matrix projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, this.Width / this.Height, 1.0f, 50.0f);
进行如下设置建立摄像机:
device.Transform.Projection = projection;
device.Transform.View = viewMatrix;
绘制三角形有线框模式和填充模式,
//device.RenderState.FillMode = FillMode.WireFrame;//线框模式
device.RenderState.FillMode = FillMode.Solid;//填充模式
device.RenderState.Lighting = false; //先不考虑灯光
不同的绘制模式其运行结结果分别如下图:
下面通过改变摄像机Z坐标来看一下改变此值的效果;
Vector3结构描述并操作三维 (3-D) 空间中的向量;
现在图形在屏幕上,摄像机Z坐标其实就是眼睛离屏幕的远近;
添加两个按钮,并加入如下代码:
private void button1_Click(object sender, EventArgs e)
{
eyez = eyez - 5;
}
private void button2_Click(object sender, EventArgs e)
{
eyez = eyez + 5;
}
当单击第一个按钮,Z坐标减小,所绘三角形会越来越小;单击第二个按钮则增大;如下图;
源码下载:
http://pan.baidu.com/s/1dDrQTxf