在3D程序中使用坐标轴提示
一般的3D图形软件都有坐标轴提示的功能,比如3DMax,当旋转物体时,坐标轴也跟着旋转,这样就能实时跟踪物体的角度了,今天我们自己手动做一个,以前一直觉得挺难,今天做起来忽然发现,其实也很简单,说白了,就是画线而已,下面是3DMAX中的坐标轴提示图。
坐标轴是由线段组成的,但由于DirectX中的ID3DXLine接口只能用来绘制2D直线,所以我们这里使用DrawPrimitive函数并传递D3DPT_LINELIST来绘制3D直线,旋转使用的是ArcBall技术,先上个图吧,做成以后效果如下,比起上面那个来,比较丑陋,但是功能一样
好了,下面介绍详细步骤,首先我们来定义顶点格式,因为绘制直线首先要确定顶点,比如要绘制X轴的话,要给出原点O以及X轴的端点X,我们使用的顶点格式如下
2 {
3 FLOAT x, y, z; // position
4 DWORD color; // color
5 };
6
7 #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
这个顶点包含两个信息,位置和颜色,这里我们自己指定顶点的颜色,就不用额外设置光照了,光照不是本篇的主题,所以简化掉
1.确定三个坐标轴的端点,每个轴的长度都设置为0.5,颜色三个轴分别是红,绿,蓝。这样三个轴的端点就确定了,要注意到是,原点不只是一个,而是三个,位置都是(0, 0, 0),颜色分别是红,绿,蓝。
2. 确定三个箭头的端点
箭头可以看作是两条线段拼接而成的,而它们的交点就是上面的坐标轴端点,所以每个箭头实际上只需要两个顶点,如下,关于坐标位置我就不细说了,很简单
3. 确定字母X, Y, Z的顶点
除了绘制箭头以外,我们还需要用字母标出三个坐标轴的名称,这里我没有使用绘制文本的函数,而是直接用线段拼出这三个字母,也是为了简化程序,好在这三个字母的笔画都比较直,拼起来也很容易,更加巧合的是,每个字母都恰好需要四个顶点,同样,坐标的位置不细说了,大家看看下面的图就都明白了
代码
有了上面的顶点以后,就可以创建顶点buffer,然后copy data,最后绘制,这些都是比较基本的东西,不说了,大家可以从文章末尾下载完整的代码
准备顶点数据
绘制
拖动鼠标,体会旋转的乐趣吧!
完整代码 here
happy coding!
==THE END==
本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2009/11/22/1608226.html,如需转载请自行联系原作者