OpenGL 画出雷达动态扫描效果(一)
最终效果如下所示

Demo下载 http://files.cnblogs.com/xd-jinjian/Debug.zip
源代码下载 http://download.csdn.net/detail/xdjinjian/8266927
绘制扫面线部分代码如下,扫面部分可改进使用粒子系统,以增加真实感。
glBegin(GL_TRIANGLE_FAN);
glColor4f(0.0f, 0.0f, 0.0f,1.0f);
glVertex2f(0.0f, 0.0f); for(int i=;i<N;++i)
{
pos_x=cos((i/180.0)*Pi+theta)*R;
pos_y=sin((i/180.0)*Pi+theta)*R;
glColor4f(0.0f, (i+0.01)/N, 0.0f,0.8f);
glVertex2f(pos_x, pos_y);
}
glEnd();
雷达界面的框架部分使用纹理贴图完成,加载位图资源代码如下
int power_of_two(int n)
{
if( n <= )
return ;
return (n & (n-)) == ;
} GLuint load_texture(const char* file_name)
{
GLint width, height, total_bytes;
GLubyte* pixels = ;
GLint last_texture_ID;
GLuint texture_ID = ; FILE* pFile = fopen(file_name, "rb");
if( pFile == )
return ; // 读取文件中图象的宽度和高度
fseek(pFile, 0x0012, SEEK_SET);
fread(&width, , , pFile);
fread(&height, , , pFile);
fseek(pFile, BMP_Header_Length, SEEK_SET); // 计算每行像素所占字节数,并根据此数据计算总像素字节数
{
GLint line_bytes = width * ;
while( line_bytes % != )
++line_bytes;
total_bytes = line_bytes * height;
} // 根据总像素字节数分配内存
pixels = (GLubyte*)malloc(total_bytes);
if( pixels == )
{
fclose(pFile);
return ;
} // 读取像素数据
if( fread(pixels, total_bytes, , pFile) <= )
{
free(pixels);
fclose(pFile);
return ;
}
{
GLint max;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);
if( !power_of_two(width)
|| !power_of_two(height)
|| width > max
|| height > max )
{
const GLint new_width = ;
const GLint new_height = ; // 规定缩放后新的大小为边长的正方形
GLint new_line_bytes, new_total_bytes;
GLubyte* new_pixels = ; // 计算每行需要的字节数和总字节数
new_line_bytes = new_width * ;
while( new_line_bytes % != )
++new_line_bytes;
new_total_bytes = new_line_bytes * new_height; // 分配内存
new_pixels = (GLubyte*)malloc(new_total_bytes);
if( new_pixels == )
{
free(pixels);
fclose(pFile);
return ;
} gluScaleImage(GL_RGB,
width, height, GL_UNSIGNED_BYTE, pixels, new_width, new_height, GL_UNSIGNED_BYTE, new_pixels); // 释放原来的像素数据,把pixels指向新的像素数据,并重新设置width和height
free(pixels);
pixels = new_pixels;
width = new_width; height = new_height;
}
}
glGenTextures(, &texture_ID);
if( texture_ID == )
{
free(pixels);
fclose(pFile);
return ;
}
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture_ID);
glBindTexture(GL_TEXTURE_2D, texture_ID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexImage2D(GL_TEXTURE_2D, , GL_RGB, width, height, ,
GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);
glBindTexture(GL_TEXTURE_2D, last_texture_ID);
free(pixels);
return texture_ID;
}
使用位图资源

texGround = load_texture("xxxxx.bmp");
纹理贴图
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texGround);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f,-0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f,-0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f,-0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f,-0.0f);
glEnd();
注意画图形时打开纹理混合,并关闭深度测试
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
OpenGL 画出雷达动态扫描效果(一)的更多相关文章
- OpenGL 画出雷达动态扫描效果(二) 非底图
OpenGL 画出雷达动态扫描效果(一)中给出了已一张图片作为底图的雷达扫面程序 如果有漂亮的雷达底图的话,效果应该非常不错的,另外也可以直接手绘雷达框架 效果如下 雷达主体代码 glLineWidt ...
- 使用PorterDuffXfermode画出刮刮奖效果p146-p148
package com.zzw.Qunyinzghuan3; import android.content.Context; import android.graphics.Bitmap; impor ...
- 像画笔一样慢慢画出Path的三种方法(补充第四种)
今天大家在群里大家非常热闹的讨论像画笔一样慢慢画出Path的这种效果该如何实现. 北京-LGL 博客号@ligl007发起了这个话题.然后各路高手踊跃发表意见.最后雷叔 上海-雷蒙 博客号@雷蒙之星 ...
- 樱花的季节,教大家用canvas画出飞舞的樱花树
又到了樱花的季节,教大家使用canvas画出飞舞的樱花树效果. 废话少说,先看效果. 演示效果地址:http://suohb.com/work/tree4.htm 查看演示效果 第一步,我们先画出一棵 ...
- TWaver动画之雷达扫描效果
UI和功能是好的产品的两个重要因素,很多产品往往只注重功能上的设计,而忽略了UI.在这个“看脸”的时代,就算产品的功能很强大,如果UI跟不上步伐,你的产品都会在客户心中大打折扣.做安全和监控的项目中经 ...
- achartengine画出动态折线图
achartengine画出动态折线图的效果最近有个项目需要用到实时曲线图,我也上网搜索了一下,最后还是选择使用achartengine这个现成的东西,毕竟自己再canvas一下实在是太麻烦,而且项目 ...
- 【canvas系列】canvas实现"雷达扫描"效果
今天来讲解"雷达扫描"效果demo,来源于QQ群里边有群友说想要个雷达效果,就尝试写了一下. 效果图: demo链接: https://win7killer.github.io/c ...
- canvas实现"雷达扫描"效果
今天来讲解“雷达扫描”效果demo,来源于QQ群里边有群友说想要个雷达效果,就尝试写了一下. 效果图: demo链接: https://win7killer.github.io/can_demo/de ...
- 通通玩blend美工(8)——动态绘制路径动画,画出个萌妹子~
原文:通通玩blend美工(8)--动态绘制路径动画,画出个萌妹子~ 2年前我在玩Flex的时候就一直有一个疑问,就是如何来实现一个蚊香慢慢烧完的Loading动画呢? 刚经历了某甲方高强度一个月的洗 ...
随机推荐
- 使用kbmMW#1轻松实现REST
使用kbmMW很容易创建REST服务器. 首先,我们制作服务器应用程序(或服务......取决于您). 在这种情况下,我们将添加一个简单的Form,为我们的kbmMW组件提供GUI和位置. 在Delp ...
- 通过JS动态创建和删除HTML元素
<script type="text/javascript" language="Javascript"> function InputOnBlur ...
- SUST OJ 1642: 绝地求生—死亡顺序
1642: 绝地求生-死亡顺序 时间限制: 1 Sec 内存限制: 128 MB提交: 81 解决: 53[提交][状态][讨论版] 题目描述 最近陕西科技大学六公寓的小东同学深深的入迷了一款游戏 ...
- CentOS7防止CC攻击防止SSH爆破采取的措施
准备工作 1.检查firewalld是否启用 #如果您已经安装iptables建议先关闭 service iptables stop #查看firewalld状态 firewall-cmd --sta ...
- 【HAOI2016】食物链
HA真是弱…… 原题: 1.食物链[问题描述]如图所示为某生态系统的食物网示意图,据图回答第1小题. 1.数一数,在这个食物网中有几条食物链( )现在给你n个物种和m条能量流动关系,求其中的食物链条数 ...
- android 发送UDP广播,搜寻server建立socket链接
应用场景:client(手机.pc)须要搜寻所在局域网内的server并获得server地址. 方法简单介绍:client发送UDP广播,服务收到广播后得到clientip地址,然后向client发送 ...
- dup and dup2的剖析
转:http://www.cnblogs.com/sdphome/archive/2011/04/30/2033381.html dup和dup2都可用来复制一个现存的文件描写叙述符,使两个文件描写叙 ...
- win7上搭建Android环境及调试
工欲善其事必先利其器,好记性不如烂笔头.要学习一门新的语言,首先必须得先搭环境,否则没法实践.如果之前按照网上的提示,搭建过环境,而且环境比较复杂的话,我相信隔很长一段时间后,就会忘记,到真正用的时候 ...
- 浏览器的自动翻译会影响 JS 逻辑
有人在 QQ 群里反馈,官方注册后跳转时出现 Bug. 收到群友非常有用的资讯,这是因为浏览器的自动翻译功能引起的. 11:04:21[潜水]Better Command 2017/12/30 11: ...
- 剑指offer-python面试篇第一部分
互联网协议定义(分别有4层.5层及7层协议的说法,以下从上层向下层介绍)? a) 四层协议:应用层.传输层.网络层.网络接口层 a) 五层协议: 应用层:用户使用的应用程序都归属于应用层,作用为规定应 ...