// sample.cpp
// sample program demonstrating use of the arcball.
// see arcball.h for an explanation of what the
// arcball_*** functions do.
//
// must be compiled with glut
//
// -- Bradley Smith, 5/05/2008
#include <stdio.h>
#include <GL/glut.h>
#include <GL/glaux.h>
#include <cstdlib>
#include <cmath>
#include "arcball.h"
// =================
// Drawing the Scene
// =================
static float aspect_ratio = 1.0f;
static int width, height;
// scene parameters
const vec eye( 0.0f, 0.0f, -20.0f );
const vec centre( 0.0f, 0.0f, 0.0f );
const vec up( 0.0f, 1.0f, 0.0f );
float SPHERE_RADIUS = 5.0f;
const int SPHERE_LAT_SLICES = 12;
const int SPHERE_LONG_SLICES = 24;
const int NUM_STARS = 256;
static vec star[NUM_STARS];
vec coord;
GLuint texture[1];
GLUquadricObj *quadratic;
const float PI = 3.141592654f;
AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image
{
FILE *File=NULL; // File Handle
if (!Filename) // Make Sure A Filename Was Given
{
return NULL; // If Not Return NULL
}
File=fopen(Filename,"r"); // Check To See If The File Exists
if (File) // Does The File Exist?
{
fclose(File); // Close The Handle
return auxDIBImageLoad(Filename); // Load The Bitmap And Return A Pointer
}
return NULL; // If Load Failed Return NULL
}
int LoadGLTextures() // Load Bitmaps And Convert To Textures
{
int Status=FALSE; // Status Indicator
AUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Texture
memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL
// Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
if (TextureImage[0]=LoadBMP("Data/earth.bmp"))
{
Status=TRUE; // Set The Status To TRUE
glGenTextures(1, &texture[0]); // Create The Texture
// Typical Texture Generation Using Data From The Bitmap
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
if (TextureImage[0]) // If Texture Exists
{
if (TextureImage[0]->data) // If Texture Image Exists
{
free(TextureImage[0]->data); // Free The Texture Image Memory
}
free(TextureImage[0]); // Free The Image Structure
}
return Status; // Return The Status
}
static void reset_view(int w, int h)
{
width = w;
height = h;
aspect_ratio = (float) width / (float) height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective( 50.0f, aspect_ratio, 1.0f, 50.0f );
gluLookAt(
eye.x, eye.y, eye.z,
centre.x, centre.y, centre.z,
up.x, up.y, up.z );
// set up the arcball using the current projection matrix
arcball_setzoom( SPHERE_RADIUS, eye, up );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
}
inline float randf()
{
return ((1.0f / 127.f) * (((float)(rand() & 255)) - 128.0f)) ;
}
static void startup_scene()
{
// generate random starfield
for ( int i=0; i < NUM_STARS; ++i )
{
star[i] = vec( randf(), randf(), randf() ).unit() * 2.0f;
}
}
static void shutdown_scene()
{
// nothing to be done here
}
static void draw_stars()
{
glBegin( GL_POINTS );
glColor3f( 1.0f, 1.0f, 1.0f );
for ( int i=0; i < NUM_STARS; ++i )
{
glVertex3f( star[i].x, star[i].y, star[i].z );
}
glEnd();
}
inline vec rotate_x( vec v, float sin_ang, float cos_ang )
{
return vec(
v.x,
(v.y * cos_ang) + (v.z * sin_ang),
(v.z * cos_ang) - (v.y * sin_ang)
);
}
inline vec rotate_y( vec v, float sin_ang, float cos_ang )
{
return vec(
(v.x * cos_ang) + (v.z * sin_ang),
v.y,
(v.z * cos_ang) - (v.x * sin_ang)
);
}
static void draw_sphere()
{/*
const int NUM_FACE_COLOURS = 4;
vec FACE_COLOURS[NUM_FACE_COLOURS] = {
vec( 1.0f, 0.0f, 0.0f ),
vec( 0.0f, 1.0f, 0.0f ),
vec( 0.0f, 0.0f, 1.0f ),
vec( 1.0f, 1.0f, 0.0f )
};
const float lat_angle = PI / (float)SPHERE_LAT_SLICES;
const float long_angle = 2.0f * PI / (float)SPHERE_LONG_SLICES;
const float sin_lat = sin( lat_angle );
const float cos_lat = cos( lat_angle );
const float sin_long = sin( long_angle );
const float cos_long = cos( long_angle );
glBegin( GL_QUADS );
vec lat_0( 0.0f, SPHERE_RADIUS, 0.0 );
for ( int y = 0; y < SPHERE_LAT_SLICES; ++y )
{
vec lat_1 = rotate_x( lat_0, sin_lat, cos_lat );
vec long_0_0 = lat_0;
vec long_1_0 = lat_1;
for ( int x = 0; x < SPHERE_LONG_SLICES; ++x )
{
vec long_0_1 = rotate_y( long_0_0, sin_long, cos_long );
vec long_1_1 = rotate_y( long_1_0, sin_long, cos_long );
vec colour = FACE_COLOURS[(x+y)%NUM_FACE_COLOURS];
glColor4f( colour.x, colour.y, colour.z, 1.0f );
glVertex3f( long_0_0.x, long_0_0.y, long_0_0.z );
glVertex3f( long_1_0.x, long_1_0.y, long_1_0.z );
glVertex3f( long_1_1.x, long_1_1.y, long_1_1.z );
glVertex3f( long_0_1.x, long_0_1.y, long_0_1.z );
long_0_0 = long_0_1;
long_1_0 = long_1_1;
}
lat_0 = lat_1;
}
glEnd();*/
quadratic=gluNewQuadric(); //绘制类型
//画图
// 创建二次几何体
gluQuadricNormals(quadratic, GLU_SMOOTH); // 使用平滑法线
gluQuadricTexture(quadratic, GL_TRUE);
glEnable(GL_TEXTURE_2D); // 启用纹理映射
glBindTexture(GL_TEXTURE_2D, texture[0]);
gluSphere(quadratic,SPHERE_RADIUS,48,48);
gluQuadricTexture(quadratic,GLU_TRUE); //建立纹理坐标
gluQuadricDrawStyle(quadratic,GLU_FILL); //用面填充
glDisable(GL_TEXTURE_2D);
}
static void click_scene(int x, int y)
{
int invert_y = (height - y) - 1; // OpenGL viewport coordinates are Cartesian
arcball_start(x,invert_y);
}
static void drag_scene(int x, int y)
{
int invert_y = (height - y) - 1;
arcball_move(x,invert_y,(5/SPHERE_RADIUS));
}
static void draw_scene()
{
// stars: to simulate infinite distance,
// translate the sphere of stars to the eye
// and perform the arcball rotation around the eye
// (also disable depth test so they become the background)
glPushMatrix();
glDrawBuffer(GL_BACK); //指定在后台缓存中绘制图形
glLoadIdentity(); //初始化变换矩阵
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glShadeModel(GL_SMOOTH);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
//glDisable( GL_DEPTH_TEST );
glTranslatef( eye.x, eye.y, eye.z );
arcball_rotate();
//draw_stars();
glEnable( GL_DEPTH_TEST );
glPopMatrix();
// now render the regular scene under the arcball rotation about 0,0,0
// (generally you would want to render everything here)
arcball_rotate();
draw_sphere();
}
// ==============
// GLUT Callbacks
// ==============
static void resize(int w, int h)
{
reset_view(w,h);
}
static void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
draw_scene();
glutSwapBuffers();
}
static void key(unsigned char key, int x, int y)
{
switch (key)
{
case 27 :
case 'q':
shutdown_scene();
exit(0);
break;
case '+':
SPHERE_RADIUS = SPHERE_RADIUS+1;
arcball_setzoom( SPHERE_RADIUS, eye, up );
break;
case '-':
if(SPHERE_RADIUS>1)
{
SPHERE_RADIUS = SPHERE_RADIUS-1;
arcball_setzoom( SPHERE_RADIUS, eye, up );
}
break;
default :
break;
}
glutPostRedisplay();
}
static

传说中的堕落
- 粉丝: 124
最新资源
- GOAT(山羊)是基于 LlaMa 进行 SFT 的中英文大语言模型
- 借助 ChatGPT 大语言模型通过聊天机器人自动搭建 vulhub 漏洞靶机环境
- 一个 JavaScript 的简单范例程序-创建一个简单的待办事项列表(Todo List)
- 第二届广州・琶洲算法大赛智能交通 CV 模型赛题第四名方案
- 第二届广州・琶洲算法大赛智能交通 CV 模型赛题第 4 名解决方案
- 基于ChatGPT大语言模型,通过聊天机器人自动创建vulhub的漏洞靶机环境
- Python 的排序算法范例程序-实现快速排序算法
- 从零开始编写大语言模型相关所有代码用于学习
- kindeditor多图上传H5版 ,替换到原来的plugins\multiimage目录下就可用,无须修改原来的调用代码,要记得刷新缓存
- CID解码最新300-CD软件
- CID解码最新300-CD软件
- 结合大模型强大的自然语言处理能力,自动化地生成全面、高质量的测试用例
- CID解码最新300-CD软件
- MATLAB实现NMEA 0183数据可视化工具
- MATLAB实现NMEA 0183数据可视化工具
- aspmkr7_1.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



评论30