zoukankan      html  css  js  c++  java
  • 在3D程序中使用坐标轴提示

    一般的3D图形软件都有坐标轴提示的功能,比如3DMax,当旋转物体时,坐标轴也跟着旋转,这样就能实时跟踪物体的角度了,今天我们自己手动做一个,以前一直觉得挺难,今天做起来忽然发现,其实也很简单,说白了,就是画线而已,下面是3DMAX中的坐标轴提示图。

    坐标轴是由线段组成的,但由于DirectX中的ID3DXLine接口只能用来绘制2D直线,所以我们这里使用DrawPrimitive函数并传递D3DPT_LINELIST来绘制3D直线,旋转使用的是ArcBall技术,先上个图吧,做成以后效果如下,比起上面那个来,比较丑陋,但是功能一样

    好了,下面介绍详细步骤,首先我们来定义顶点格式,因为绘制直线首先要确定顶点,比如要绘制X轴的话,要给出原点O以及X轴的端点X,我们使用的顶点格式如下

    1 struct CUSTOMVERTEX 
    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),颜色分别是红,绿,蓝。

    Code

    2. 确定三个箭头的端点

    箭头可以看作是两条线段拼接而成的,而它们的交点就是上面的坐标轴端点,所以每个箭头实际上只需要两个顶点,如下,关于坐标位置我就不细说了,很简单

    Code

    3. 确定字母X, Y, Z的顶点

    除了绘制箭头以外,我们还需要用字母标出三个坐标轴的名称,这里我没有使用绘制文本的函数,而是直接用线段拼出这三个字母,也是为了简化程序,好在这三个字母的笔画都比较直,拼起来也很容易,更加巧合的是,每个字母都恰好需要四个顶点,同样,坐标的位置不细说了,大家看看下面的图就都明白了

    代码

    有了上面的顶点以后,就可以创建顶点buffer,然后copy data,最后绘制,这些都是比较基本的东西,不说了,大家可以从文章末尾下载完整的代码

    准备顶点数据

    绘制

    拖动鼠标,体会旋转的乐趣吧!

    完整代码 here

    happy coding!

    ==THE END==

    作者:zdd
    出处:http://www.cnblogs.com/graphics/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    关于递归的理解
    every few days
    相见恨晚
    VC中自定义消息处理函数的步骤
    wparam和lparam的区别
    VC中新建的类不见了的解决方法
    接连遇到大牛
    老总NB的 romman.sys
    [恢]hdu 1159
    [恢]hdu 1996
  • 原文地址:https://www.cnblogs.com/graphics/p/1608226.html
Copyright © 2011-2022 走看看