易码技术论坛

 找回密码
 加入易码
搜索
查看: 556905|回复: 4

[教程] 利用glLineStipple制作动态虚线

[复制链接]
发表于 2006-10-17 13:26:39 | 显示全部楼层
又是这个看了眼花的  @ i @
发表于 2006-10-17 13:54:59 | 显示全部楼层
偶的与能动 ^_____________^b

24_15598_987374497d00064.jpg
发表于 2006-10-17 17:08:35 | 显示全部楼层
呵呵.明明是静止的图片,呵呵.好神气的视觉误差
 楼主| 发表于 2006-10-17 18:49:38 | 显示全部楼层
好不容易发一贴,谁再继续水下去休怪我无情。
 楼主| 发表于 2006-10-17 12:52:59 | 显示全部楼层 |阅读模式
初学OpenGL,各位前辈不要BS偶^_^
效果图
  1. // 包含头文件
  2. #include <windows.h>   // 调用WIN32API,用于控帧
  3. #include <GL/glut.h>   // GLUT库
  4. // 宏定义
  5. // 定义世界坐标系
  6. #define XMIN   -5.0
  7. #define XMAX    5.0
  8. #define YMIN   -5.0
  9. #define YMAX    5.0
  10. #define ZMIN   -1.0
  11. #define ZMAX    1.0
  12. // 全局定义
  13. // 动态延时
  14. #define DELAY    20
  15. // 窗体大小
  16. int wndWidth = 300;
  17. int wndHeight = 300;
  18. // 上次操作时刻
  19. long lastms = 0;
  20. // 画线风格
  21. unsigned short line = 0xF0F0;
  22. // 函数定义
  23. // 初始化
  24. void init()
  25. {
  26.    // 设置背景色
  27.    glClearColor(0.9, 0.9, 0.9, 1.0);
  28.    // 初始化当前矩阵
  29.    glLoadIdentity();
  30.    glOrtho(XMIN, XMAX, YMIN, YMAX, ZMIN, ZMAX);
  31.    // 允许绘制虚线
  32.    glEnable(GL_LINE_STIPPLE);
  33.    // 设置线条宽度
  34.    glLineWidth(3.0);
  35.    // 设置前景颜色
  36.    glColor3f(0.0, 0.0, 0.0);
  37. }
  38. // 窗体重绘的回调函数
  39. void display()
  40. {
  41.    // 设置为模型视图
  42.    glMatrixMode(GL_MODELVIEW);
  43.    // 清除窗体图像
  44.    glClear(GL_COLOR_BUFFER_BIT);
  45.    // 设置线条风格
  46.    glLineStipple(1, line);   
  47.    // 画4个三角形
  48.    glBegin(GL_LINE_LOOP);
  49.       glVertex2f(-4.0, 2.0);
  50.       glVertex2f(-2.0, 2.0);      
  51.       glVertex2f(-3.0, -1.0);
  52.    glEnd();
  53.    glBegin(GL_LINE_LOOP);
  54.       glVertex2f(-1.0, 2.0);
  55.       glVertex2f(0.0, -1.0);   
  56.       glVertex2f(-2.0, -1.0);        
  57.    glEnd();
  58.    glBegin(GL_LINE_LOOP);
  59.       glVertex2f(0.0, 2.0);
  60.       glVertex2f(2.0, 2.0);      
  61.       glVertex2f(1.0, -1.0);
  62.    glEnd();
  63.    glBegin(GL_LINE_LOOP);
  64.       glVertex2f(3.0, 2.0);
  65.       glVertex2f(4.0, -1.0);
  66.       glVertex2f(2.0, -1.0);      
  67.    glEnd();
  68.    // 交换缓存,刷新窗体
  69.    glutSwapBuffers();
  70. }
  71. // 窗体大小的回调函数
  72. void reshape(int w, int h)
  73. {
  74.    // 设置视口为整个窗体
  75.    glViewport(0, 0, w, h);
  76.    // 记录当前窗体大小
  77.    wndWidth = w;
  78.    wndHeight = h;
  79. }
  80. // 进程空闲的回调函数
  81. void idle()
  82. {
  83.    // 控帧,每隔DELAY毫秒刷新一次
  84.    if (GetTickCount() - lastms > DELAY)
  85.    {
  86.       // 循环移位,改变虚线的样式
  87.       _asm
  88.       {
  89.         rol line, 1;
  90.       }
  91.       // 刷新窗体图像
  92.       glutPostRedisplay();
  93.       // 准备下一次控帧
  94.       lastms = GetTickCount();
  95.    }
  96. }
  97. // 主函数
  98. int main(int argc, char** argv)
  99. {
  100.    // 初始化GLUT库
  101.    glutInit(&argc,argv);
  102.    // 初始化显示模式
  103.    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
  104.    // 初始化窗体大小
  105.    glutInitWindowSize(wndWidth, wndHeight);
  106.    // 创建窗体
  107.    glutCreateWindow("Sample");
  108.    // 初始化
  109.    init();
  110.    // 注册窗体重绘的回调函数
  111.    glutDisplayFunc(display);
  112.    // 注册窗体大小的回调函数
  113.    glutReshapeFunc(reshape);
  114.    // 注册进程空闲的回调函数
  115.    glutIdleFunc(idle);   
  116.    // 进入消息循环
  117.    glutMainLoop();
  118. }
复制代码
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-5-8 02:13 , Processed in 0.012546 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表