#include <gl/glut.h>
#include <windows.h>//
#include <math.h>
//#include<string.h>//当你用到如strlen(),strcpy(),strcmp()这样的函数时要用到string。h头函数
//#include<sstream>
//#include<fstream>//fstream 继承 iostream; fstream 拥有iostream功能,但并不是包含关系
//fstream 是对 文件操作 而 iostream 是 对 标准输入输出文件的操作
#include <stdlib.h>
#include <time.h>//
#define PI 3.141526
#define N 1000
#define R 1.59
// Rotation amounts
static GLfloat xRot = 0.0f;//x轴
static GLfloat yRot = 0.0f;//y轴
//////////////////////////////////////////////
char timebuffer[100];//保存时间字符
GLfloat second,miniter,hour;
GLfloat nRange=3;
// Current Time
static GLfloat h =0; //小时
static GLfloat m =0 ; //分钟
static GLfloat s= 0; //秒
// Light values and coordinates
GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f };//环境光成分
GLfloat diffuseLight[] = { 0.9f, 0.9f, 0.9f, 1.0f };//漫射光成分
GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f};//镜面光成分
GLfloat specref[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat materialColor[] = { 0.8f, 0.0f, 0.0f };
GLfloat lightPos[] = { R, R, 2.0f, 0.0f };//定光源的位置
GLfloat r=1.5; //
static float BzRot=0;//我的摆钟的一个角度参数 用于表示不同时间摆针的不同位置
int flag=0;//一面旗帜 因为我的摆针是要来回摆动的 因此我要设定一个 旗帜 看摆针到了什么位置 到了具体的位置好就可以 变向摆动了
//想这个花了一点时间 主要是我的摆动那种动态效果 是以 windows 的刷新实现的 而我的时间是设定的 要以一秒显示 而我的摆针我想要他连续
//摆动 所以要想办法 在下面解释
////////////////////////////////////////////////////
GLuint textures[8];//存储位图id
static GLUquadricObj *pSphere = NULL;//就是我摆求的2维曲面指针
static GLUquadricObj *Cylinder =NULL ;//摆柱
static GLUquadricObj *Disk =NULL ;//Drawwh()中的圆盘2维曲面指针
static GLUquadricObj *cylinder1 =NULL ;//Drawwh()中的圆柱2维曲面指针
static GLUquadricObj *cylinder_obj1; //下面几个多是我画base的2维曲面指针
static GLUquadricObj *cylinder_obj2; //
static GLUquadricObj *cylinder_obj3;//
static GLUquadricObj *cylinder_obj4;//
static GLUquadricObj *pSphere1;
///////////////////////////////////////////////////////////////////////////////
// Called to draw scene
// Reset flags as appropriate in response to menu selections
/////这是直接 的一个读取位图的还数 这个函数我没学号没听好课 直接引用 应该也很简单
BYTE* gltReadBMPBits(const char *szFileName, int *nWidth, int *nHeight)
{
HANDLE hFileHandle;
BITMAPINFO *pBitmapInfo = NULL;
unsigned long lInfoSize = 0;
unsigned long lBitSize = 0;
BYTE *pBits = NULL; // Bitmaps bits
BITMAPFILEHEADER bitmapHeader;
DWORD dwBytes;
// Open the Bitmap file
hFileHandle = CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
// Check for open failure (most likely file does not exist).
if(hFileHandle == INVALID_HANDLE_VALUE)
return NULL;
// File is Open. Read in bitmap header information
ReadFile(hFileHandle,&bitmapHeader,sizeof(BITMAPFILEHEADER),
&dwBytes,NULL);
// Check for a couple of simple errors
if(dwBytes != sizeof(BITMAPFILEHEADER))
return FALSE;
// Check format of bitmap file
if(bitmapHeader.bfType != 'MB')
return FALSE;
// Read in bitmap information structure
lInfoSize = bitmapHeader.bfOffBits - sizeof(BITMAPFILEHEADER);
pBitmapInfo = (BITMAPINFO *) malloc(sizeof(BYTE)*lInfoSize);
ReadFile(hFileHandle,pBitmapInfo,lInfoSize,&dwBytes,NULL);
if(dwBytes != lInfoSize)
{
free(pBitmapInfo);
CloseHandle(hFileHandle);
return FALSE;
}
// Save the size and dimensions of the bitmap
*nWidth = pBitmapInfo->bmiHeader.biWidth;
*nHeight = pBitmapInfo->bmiHeader.biHeight;
lBitSize = pBitmapInfo->bmiHeader.biSizeImage;
// If the size isn't specified, calculate it anyway
if(pBitmapInfo->bmiHeader.biBitCount != 24)
{
free(pBitmapInfo);
return FALSE;
}
if(lBitSize == 0)
lBitSize = (*nWidth *
pBitmapInfo->bmiHeader.biBitCount + 7) / 8 *
abs(*nHeight);
// Allocate space for the actual bitmap
free(pBitmapInfo);
pBits = malloc(sizeof(BYTE)*lBitSize);
// Read in the bitmap bits, check for corruption
if(!ReadFile(hFileHandle,pBits,lBitSize,&dwBytes,NULL) ||
dwBytes != (sizeof(BYTE)*lBitSize))
pBits = NULL;
// Close the bitmap file now that we have all the data we need
CloseHandle(hFileHandle);
return pBits;
}
///////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
void DrawBase()
{
//////////////////////////////////////////
//////////////////////////////////////////////////
//这是我直接用函数画2次曲面的方法 老师不要怪我啊 我就最后一节课好好听了纹理 opengl博大精深 我没时间 也没实力啊
glPushMatrix();
glEnable(GL_TEXTURE_2D);//打开2维纹理
glBindTexture(GL_TEXTURE_2D,textures[2]);//绑定纹理
glTranslatef(0,0,-0.2);//因为我画的图是先往 z的负值纵深 所以我的画圆柱体的 基面 就在z=-2的那个面了
gluCylinder(cylinder_obj1, r, r, 0.1, 100, 50); //具体参数的含义很简单 第一个就是表示 画2次曲面的指针 第2个表示底圆的半径 第3个表示顶圆半径
// 然后就是高和分段数
glBindTexture(GL_TEXTURE_2D,textures[3]);
gluDisk(cylinder_obj2,0,r,100,50); //画同心圆
//具体参数也和简单 第一个同上 第2个表示内圆 第3个表示外圆 半径 后面同上
/////////////////////////////////////////////////////////////////////
glBindTexture(GL_TEXTURE_2D,textures[1]);
glTranslatef(0,0,0.1);
gluDisk(cylinder_obj3,0,r,100,50);
glPopMatrix();
//glDisable(GL_TEXTURE_2D);
/*int i;
float ang = PI * 2 / N;
glColor3f(0.0,0.0,1.0);
glLineWidth(3);
glBegin(GL_LINE_LOOP);
for(i=0; i<1000;i++)
glVertex2f( R * cos(i* ang), R * sin(i * ang));
glEnd();*/
// 几个时间
/*glBegin(GL_LINES);
glVertex2f( 0,R * 0.9);glVertex2f( 0,R );//12点
glVertex2f( R * 0.9,0);glVertex2f(R ,0 );//3点
glVertex2f( 0,-R * 0.9);glVertex2f( 0,-R );//6点
glVertex2f( -R * 0.9,0);glVertex2f(-R ,0 );//9点
glEnd();
*/
}
void Drawwh(void)
{ /////////
//////这个函数吗就是 我为了加一点 立体效果 我在我的表的上面还加了一个环 这样我的表针就包在里面了 呵呵 其实也没做好 还shiite没有立体感
//还是遥遥转起来才勉强有点 立体感
////下面还数的具体含义 我已经在DrawBase()中写了
//就不多说咯 只是我画这个是相当于 把一个实心的圆柱给挖了一个 base 圆柱 再把之在Z轴平移了一个正单位
glTranslatef(0,0,-0.1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,textures[6]);
gluCylinder(cylinder1, r+0.1, r+0.1, 0.1, 100, 50);
glBindTexture(GL_TEXTURE_2D,textures[0]);
gluCylinder(cylinder1, r, r, 0.1, 100, 50);
glBindTexture(GL_TEXTURE_2D,textures[5]);
gluDisk(Disk,r,r+0.1,100,50);
glTranslatef(0,0,0.1);
glBindTexture(GL_TEXTURE_2D,textures[7]);
gluDisk(Disk,r,r+0.1,100,50);
}
/*void secondkd()//为了秒针的懂更加形象 我加了一些点 呵呵
{
int i;
float ang = PI * 2 / N;
glPointSize(3);
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_POINTS);
for (i = 0; i < 60; i++)
{
ang = 2*PI*i/60;
glVertex2f(1.4*cos(ang), 1.4*sin(ang));
}
glEnd();
glPointSize(10);
glColor3f(0.0, 255.0, 255.0);
glBegin(GL_POINTS);
for (i = 0; i < 4; i++)
{
ang = 2*PI*i/4;
glVertex2f(1.4*cos(ang), 1.4*sin(ang));
}
glEnd();
}*/
void DrawHour()
{
///////////////////////////////////////////////////////////////////
//画时针
float ang = 360 - 360 * (h + m/60 + s/3600) / 12;
glPushMatrix();//push到栈中
glRotatef(ang, 0.0f, 0.0f, 1.0f);//旋转还函数 很简单的 第一个参数表示要旋转的角度 另外3个表示 x,y,z 轴 你要以那一个轴转 当然
//按系统 的3维坐标系 指定的那条轴画 总之 X-Y坐标系 不表就是向窗口垂直向里为—反之为负 因此当然是要Z轴转 所以1代表true
/*glBegin(GL_POLYGON);
glLineWidth(3.0f);
glColor3f(1.0,0,0);
glVertex3f(0,0,0.2
opengl实现3d摆钟
4星 · 超过85%的资源 需积分: 21 113 浏览量
2013-11-18
09:40:10
上传
评论 2
收藏 7.56MB RAR 举报
huya-wanghg
- 粉丝: 13
- 资源: 46