社区
图形处理/算法
帖子详情
glRotatef(30,1,0,0)+glRotatef(20,0,1,0)==glRotatef(50,1,1,0)??
zz11370
2009-11-19 11:46:00
glRotatef(30,1,0,0)+glRotatef(20,0,1,0)
等于glRotatef(?,?,?,?)
先旋转glRotatef(30,1,0,0)
再旋转glRotatef(20,0,1,0)
我想直接旋转一次 从而达到 目的
glRotatef(50,1,1,0)(这样肯定是错的)
glRotatef(?,?,?,?)
...全文
145
1
打赏
收藏
glRotatef(30,1,0,0)+glRotatef(20,0,1,0)==glRotatef(50,1,1,0)??
glRotatef(30,1,0,0)+glRotatef(20,0,1,0) 等于glRotatef(?,?,?,?) 先旋转glRotatef(30,1,0,0) 再旋转glRotatef(20,0,1,0) 我想直接旋转一次 从而达到 目的 glRotatef(50,1,1,0)(这样肯定是错的) glRotatef(?,?,?,?)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fandh
2009-11-19
打赏
举报
回复
旋转应该是一个矩阵映射 变换!楼主不妨做这样的变换!
open
gl
橡皮筋
#include "stdafx.h" #include <
GL
/
gl
ut.h> #include
#include
#define stripeImageWidth 32
GL
ubyte stripeImage[4 * stripeImageWidth]; #ifdef
GL
_VERSION_1_1 static
GL
uint texName; #endif void makeStripeImage(void) { int j; for (j = 0; j < stripeImageWidth; j++) { stripeImage[4 * j] = (
GL
ubyte)((j <= 4) ? 255 : 0); stripeImage[4 * j + 1] = (
GL
ubyte)((j>4) ? 255 : 0); stripeImage[4 * j + 2] = (
GL
ubyte)0; stripeImage[4 * j + 3] = (
GL
ubyte)255; } } /* planes for texture coordinate generation */ static
GL
float xequalzero[] = { 1.0, 0.0, 0.0, 0.0 }; static
GL
float slanted[] = { 1.0, 1.0, 1.0, 0.0 }; static
GL
float *currentCoeff; static
GL
enum currentPlane; static
GL
int currentGenMode; static float roan
gl
es; static float roan
gl
es1; float roan
gl
es2 = -2; float roan
gl
es3 = -3; void SpecialKeys(int key, int x, int y) { if (key ==
GL
UT_KEY_F1) roan
gl
es += 2.0f; roan
gl
es2 += 0.05; roan
gl
es3 += 1; if (key ==
GL
UT_KEY_F2) roan
gl
es1 += 2.0f; if (roan
gl
es2 >= 3) roan
gl
es2 = -3; // 使用新的坐标重新绘制场景
gl
utPostRedisplay(); } void init(void) {
gl
ClearColor(1.0, 1.0, 1.0, 0.0);
gl
Enable(
GL
_DEPTH_TEST);
gl
ShadeModel(
GL
_SMOOTH); makeStripeImage();
gl
PixelStorei(
GL
_UNPACK_ALIGNMENT, 1); #ifdef
GL
_VERSION_1_1
gl
GenTextures(1, &texName;);
gl
BindTexture(
GL
_TEXTURE_1D, texName); #endif
gl
TexParameteri(
GL
_TEXTURE_1D,
GL
_TEXTURE_WRAP_S,
GL
_REPEAT);
gl
TexParameteri(
GL
_TEXTURE_1D,
GL
_TEXTURE_MAG_FILTER,
GL
_LINEAR);
gl
TexParameteri(
GL
_TEXTURE_1D,
GL
_TEXTURE_MIN_FILTER,
GL
_LINEAR); #ifdef
GL
_VERSION_1_1
gl
TexImage1D(
GL
_TEXTURE_1D, 0,
GL
_RGBA, stripeImageWidth, 0,
GL
_RGBA,
GL
_UNSIGNED_BYTE, stripeImage); #else
gl
TexImage1D(
GL
_TEXTURE_1D, 0, 4, stripeImageWidth, 0,
GL
_RGBA,
GL
_UNSIGNED_BYTE, stripeImage); #endif
gl
TexEnvf(
GL
_TEXTURE_ENV,
GL
_TEXTURE_ENV_MODE,
GL
_MODULATE); currentCoeff = xequalzero; currentGenMode =
GL
_OBJECT_LINEAR; currentPlane =
GL
_OBJECT_PLANE;
gl
TexGeni(
GL
_S,
GL
_TEXTURE_GEN_MODE, currentGenMode);
gl
TexGenfv(
GL
_S, currentPlane, currentCoeff);
gl
Enable(
GL
_TEXTURE_GEN_S);
gl
Enable(
GL
_TEXTURE_1D); //
gl
Enable(
GL
_CULL_FACE);
gl
Enable(
GL
_LIGHTING);
gl
Enable(
GL
_LIGHT0);
gl
Enable(
GL
_AUTO_NORMAL);
gl
Enable(
GL
_NORMALIZE);
gl
FrontFace(
GL
_CW); //
gl
CullFace(
GL
_BACK);
gl
Materialf(
GL
_FRONT,
GL
_SHININESS, 64.0); roan
gl
es = 45.0f; roan
gl
es1 = 362.0f; } void display(void) {
gl
Clear(
GL
_COLOR_BUFFER_BIT |
GL
_DEPTH_BUFFER_BIT);
gl
PushMatrix();
gl
Begin(
GL
_QUADS);
gl
Color3f(1, 0, 1);
gl
Vertex3f(-1, -1, 0);
gl
Color3f(1, 0, 1);
gl
Vertex3f(-3, -1, 0);
gl
Color3f(1, 0, 1);
gl
Vertex3f(1, -1, 0);
gl
Color3f(1, 0, 1);
gl
Vertex3f(-1, -2, 0);
gl
End();
gl
PopMatrix();
gl
PushMatrix();
gl
Translated(roan
gl
es2, 2, -3);
gl
Rotate
f(roan
gl
es, 0.0, 1.0, 0.0); #ifdef
GL
_VERSION_1_1
gl
BindTexture(
GL
_TEXTURE_1D, texName); #endif //
gl
utSolidTeapot(2.0);
gl
utSolidSphere(0.8, 32, 32);
gl
PopMatrix();
gl
Flush();
gl
PushMatrix();
gl
Translated(1, 2, -3);
gl
Rotate
f(roan
gl
es1, 1.0, 0.0, 0.0);
gl
Rotate
f(roan
gl
es3, 0.0, 1.0, 0.0); #ifdef
GL
_VERSION_1_1
gl
BindTexture(
GL
_TEXTURE_1D, texName); #endif //
gl
utSolidTeapot(2.0);
gl
Translated(-1, -3, -0);
gl
Rotate
f(90, 1.0f, 0.0f, 0.0f);
gl
Rotate
f(180, 0.0f, 1.0f, 0.0f);
gl
Rotate
f(-
30
, 0.0f, 0.0f, 1.0f);
gl
utSolidCone(1, 2, 32, 32);
gl
PopMatrix();
gl
Flush(); } void reshape(int w, int h) {
gl
Viewport(0, 0, (
GL
sizei)w, (
GL
sizei)h);
gl
MatrixMode(
GL
_PROJECTION);
gl
LoadIdentity(); if (w <= h)
gl
Ortho(-3.5, 3.5, -3.5*(
GL
float)h / (
GL
float)w, 3.5*(
GL
float)h / (
GL
float)w, -3.5, 3.5); else
gl
Ortho(-3.5*(
GL
float)w / (
GL
float)h, 3.5*(
GL
float)w / (
GL
float)h, -3.5, 3.5, -3.5, 3.5);
gl
MatrixMode(
GL
_MODELVIEW);
gl
LoadIdentity(); } void idle() { roan
gl
es += 0.1f;
gl
utPostRedisplay(); } int main(int argc, char** argv) {
gl
utInit(&argc;, argv);
gl
utInitDisplayMode(
GL
UT_SIN
GL
E |
GL
UT_RGB |
GL
UT_DEPTH);
gl
utInitWindowSize(600, 600);
gl
utInitWindowPosition(100, 100);
gl
utCreateWindow(argv[0]); //
gl
utIdleFunc(idle); init();
gl
utDisplayFunc(display);
gl
utReshapeFunc(reshape);
gl
utSpecialFunc(SpecialKeys);
gl
utMainLoop(); return 0; }
open
gl
中如何绕轴旋转物体
如何绕轴旋转这些物体。
gl
Rotate
f(An
gl
e,Xvector,Yvector,Zvector) 用于绕轴旋转物体, 这是一条十分有用的函数。 An
gl
e 是一个用于指定旋转角度的数字(通常存储于变量中)。 Xvector, Yvector 和 Zvector 这三个参数用于描述一条向量, 以规定物体的旋转轴。 如果你使用 (1,0,0) 这样的值, 你就描述了一条长度为1个单位的、顺着x轴指向右方的向量; 而 (-1,0,0) 这样的值就描述了一条长度为1个单位的、顺着x轴 但指向左方的向量。
计算机图形学制作时钟源代码
用MFC VC++实现的时钟源代码 // MFCFrame1View.cpp : implementation of the CMFCFrame1View class // #include "stdafx.h" #include "MFCFrame1.h" #include "MFCFrame1Doc.h" #include "MFCFrame1View.h" #include "PointDialog.h" #include "math.h"
GL
UquadricObj *objCylinder =
gl
uNewQuadric(); #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMFCFrame1View IMPLEMENT_DYNCREATE(CMFCFrame1View, CView) BEGIN_MESSAGE_MAP(CMFCFrame1View, CView) //{{AFX_MSG_MAP(CMFCFrame1View) ON_WM_CREATE() ON_WM_DESTROY() ON_WM_SIZE() ON_COMMAND(IDM_ZIXUAN, OnZixuan) ON_WM_TIMER() ON_COMMAND(IDM_ChangDirect, OnChangDirect) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMFCFrame1View construction/destruction CMFCFrame1View::CMFCFrame1View() { // TODO: add construction code here this->m_
GL
PixelIndex = 0; this->m_h
GL
Context = NULL; An
gl
e1=0.0; An
gl
e2=
30
.0; Timer=0; x=0.0; z=0.0; juli=40.0; } CMFCFrame1View::~CMFCFrame1View() { } BOOL CMFCFrame1View::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS); return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CMFCFrame1View drawing ///////////////////////////////////////////////////////////////////////////// // CMFCFrame1View printing BOOL CMFCFrame1View::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CMFCFrame1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CMFCFrame1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CMFCFrame1View diagnostics #ifdef _DEBUG void CMFCFrame1View::AssertValid() const { CView::AssertValid(); } void CMFCFrame1View::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMFCFrame1Doc* CMFCFrame1View::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCFrame1Doc))); return (CMFCFrame1Doc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMFCFrame1View message handlers BOOL CMFCFrame1View::SetWindowPixelFormat(HDC hDC) { PIXELFORMATDESCRIPTOR pixelDesc= { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPEN
GL
| PFD_DOUBLEBUFFER|PFD_SUPPORT_GDI, PFD_TYPE_RGBA, 24, 0,0,0,0,0,0, 0, 0, 0, 0,0,0,0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0,0,0 }; this->m_
GL
PixelIndex = ChoosePixelFormat(hDC,&pixelDesc); if(this->m_
GL
PixelIndex==0) { this->m_
GL
PixelIndex = 1; if(DescribePixelFormat(hDC,this->m_
GL
PixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0) { return FALSE; } } if(SetPixelFormat(hDC,this->m_
GL
PixelIndex,&pixelDesc)==FALSE) { return FALSE; } return TRUE; } int CMFCFrame1View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here HWND hWnd = this->GetSafeHwnd(); HDC hDC = ::GetDC(hWnd); if(this->SetWindowPixelFormat(hDC)==FALSE) { return 0; } if(this->CreateView
GL
Context(hDC)==FALSE) { return 0; } return 0; } BOOL CMFCFrame1View::CreateView
GL
Context(HDC hDC) { this->m_h
GL
Context = w
gl
CreateContext(hDC); if(this->m_h
GL
Context==NULL) {//创建失败 return FALSE; } if(w
gl
MakeCurrent(hDC,this->m_h
GL
Context)==FALSE) {//选为当前RC失败 return FALSE; } return TRUE; } void CMFCFrame1View::OnDestroy() { CView::OnDestroy(); // TODO: Add your message handler code here if(w
gl
GetCurrentContext()!=NULL) { w
gl
MakeCurrent(NULL,NULL); } if(this->m_h
GL
Context!=NULL) { w
gl
DeleteContext(this->m_h
GL
Context); this->m_h
GL
Context = NULL; } } void CMFCFrame1View::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // TODO: Add your message handler code here
GL
sizei width,height;
GL
double aspect; width = cx; height = cy; if(cy==0) { aspect = (
GL
double)width; } else { aspect = (
GL
double)width/(
GL
double)height; }
gl
Viewport(0,0,width,height);
gl
MatrixMode(
GL
_PROJECTION);
gl
LoadIdentity();
gl
uPerspective(40.0,aspect,5.0,1000.0); } void CMFCFrame1View::OnDraw(CDC* pDC) { CMFCFrame1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CPaintDC dc(this);
gl
ClearColor(1.0,1.0,1.0,1.0);
gl
Clear(
GL
_COLOR_BUFFER_BIT);
gl
MatrixMode(
GL
_MODELVIEW);
gl
LoadIdentity();
gl
uLookAt(0.0,0.0,10.0,0.0,0.0,0.0,0.0,1.0,0.0);
gl
Rotate
f(-90.0,1.0,0.0,0.0);/*返回原坐标*/
gl
Translatef(-3.0,0.0,0.0); SwapBuffers(dc.m_ps.hdc);
gl
DrawBuffer (
GL
_BACK);
gl
Flush(); } void CMFCFrame1View::OnZixuan() { // TODO: Add your command handler code here Timer=1; SetTimer(1,100,NULL); } void CMFCFrame1View::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CPaintDC dc(this); if (Timer==1) { An
gl
e1=An
gl
e1-1; An
gl
e2=An
gl
e2-1;
gl
ClearColor(1.0,1.0,1.0,1.0);
gl
Clear(
GL
_COLOR_BUFFER_BIT);
gl
MatrixMode(
GL
_MODELVIEW);/**/
gl
LoadIdentity();
gl
uLookAt(0.0,
20
.0,0.000000001,0.0,0.0,0.0,0.0,1.0,0.0);
gl
PushMatrix();
gl
Color3f(0.7,0.7,0.7);
gl
Translatef(0.0,0.0,1.1);
gl
Rotate
f(-90.0,1.0,0.0,0.0);
gl
utSolidCone(5.0,0.0,60.0,60.0); /*底盘*/
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.0);
gl
Translatef(3.9,0.99,1.0); /*刻度*/
gl
Rotate
f(90.0,0.0,1.0,0.0);
gl
uCylinder(objCylinder, 0.05, 0.05, 0.8, 9999, 9);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.0);
gl
Translatef(-4.7,0.99,1.0); /*刻度*/
gl
Rotate
f(90.0,0.0,1.0,0.0);
gl
uCylinder(objCylinder,0.05, 0.05, 0.8, 9999, 9);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.0);
gl
Translatef(0.0,0.99,-2.9); /*刻度*/
gl
Rotate
f(180.0,0.0,1.0,0.0);
gl
uCylinder(objCylinder,0.05, 0.05, 0.8, 9999, 9);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.0);
gl
Translatef(0.0,0.99,5.8); /*刻度*/
gl
Rotate
f(180.0,0.0,1.0,0.0);
gl
uCylinder(objCylinder,0.05, 0.05,0.8, 9999, 9);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(0.0,1.0,0.0);
gl
Rotate
f(45.0,0.0,1.0,0.0);
gl
Translatef(-0.67,0.99,0.7); /*时针*/
gl
Rotate
f(An
gl
e1/129600,0.0,1.0,0.0);
gl
uCylinder(objCylinder, 0.07, 0.02, 2.5, 9999, 9);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(1.0,0.0,0.0);
gl
Translatef(0.0,0.99,1.0); /*分针*/
gl
Rotate
f(An
gl
e2/360,0.0,1.0,0.0);
gl
uCylinder(objCylinder, 0.05, 0.02, 3.5, 9999, 9);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.5);
gl
Translatef(0.0,0.99,1.0); /*秒针*/
gl
Rotate
f(An
gl
e1,0.0,1.0,0.0);
gl
uCylinder(objCylinder, 0.07, 0.02, 4.5, 9999, 9);
gl
PopMatrix(); SwapBuffers(dc.m_ps.hdc);
gl
DrawBuffer (
GL
_BACK);
gl
Flush(); } else if(Timer==2) {
gl
ClearColor(1.0,1.0,1.0,1.0);
gl
Clear(
GL
_COLOR_BUFFER_BIT); if (juli>12.0) {
gl
MatrixMode(
GL
_MODELVIEW);/*建立了从世界坐标系到观察坐标系的转换矩阵*/
gl
LoadIdentity();
gl
uLookAt(0.0,8.0,juli,0.0,0.0,0.0,0.0,1.0,0.0); juli=juli-0.1;
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.0);
gl
Rotate
f(-90.0,1.0,0.0,0.0);
gl
utWireCone(40.0,0.0,
30
.0,
30
.0); /*画高度为0的圆锥*/
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(1.0,0.0,1.0);
gl
LineWidth(4.0);
gl
Translatef(4.0,1.0,0.0);
gl
utWireOctahedron(); /*画八面体*/
gl
LineWidth(1.0);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(1.0,0.0,1.0);
gl
Translatef(0.0,1.1,0.0);
gl
Rotate
f(An
gl
e2,0.0,1.0,0.0);
gl
uCylinder(objCylinder, 1.0, 1.0, 10.0, 9999, 9); /*画壶*/
gl
PopMatrix(); } else if(juli<=12.0) { An
gl
e2=An
gl
e2+0.01; if (An
gl
e2==360.0) An
gl
e2=0.0;
gl
MatrixMode(
GL
_MODELVIEW);/*建立了从世界坐标系到观察坐标系的转换矩阵*/
gl
LoadIdentity(); x=12.0*sin(An
gl
e2); z=12.0*cos(An
gl
e2);
gl
uLookAt(x,5.0,z,0.0,0.0,0.0,0.0,1.0,0.0);
gl
PushMatrix();
gl
Color3f(0.0,0.0,0.0);
gl
Rotate
f(-90.0,1.0,0.0,0.0);
gl
utWireCone(40.0,0.0,
30
.0,
30
.0); /*画高度为0的圆锥*/
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(1.0,0.0,1.0);
gl
LineWidth(4.0);
gl
Translatef(4.0,1.0,0.0);
gl
utWireOctahedron(); /*画八面体*/
gl
LineWidth(1.0);
gl
PopMatrix();
gl
PushMatrix();
gl
Color3f(1.0,0.0,1.0);
gl
Translatef(0.0,1.1,0.0);
gl
uCylinder(objCylinder, 1.0, 1.0, 10.0, 9999, 9); /*画壶*/
gl
PopMatrix(); } SwapBuffers(dc.m_ps.hdc);
gl
DrawBuffer (
GL
_BACK);
gl
Flush(); } CView::OnTimer(nIDEvent); } void CMFCFrame1View::OnChangDirect() { // TODO: Add your command handler code here Timer=2; SetTimer(1,100 ,NULL); }
Open
Gl
实验报告.doc
计算机图形学综合实验报告 烟台大学 计算机学院 软件工程专业 班 级: 计103-3 学 号:
20
1058
50
3334 姓 名: 公茂华 指导教师: 孔繁茹 完成日期:
20
12.11.10 综合试验:太阳系模型 1. 实验目的与要求 1、学习和掌握Open
GL
的使用 2、掌握矩阵堆栈的实现方法 3、根据自己的创意实现实验内容,进一步掌握和理解Open
GL
的使用 2. 实验内容 1、请编写地球围绕太阳自动旋转的方式 2、请再加上一个月亮, 并围绕地球旋转,并添加轨道 3、实现用户通过键盘或鼠标加入或减少行星和卫星 3. 实验结果 1. 开始运行 2. 增加地球和月亮(按键L或l)或其他任意行星及其若干卫星 3. 按照提示用鼠标和键盘增加或减少行星和卫星 转换视角: 4. 异常提示:要将Color.txt文件放到当前文件夹下 4. 体会 通过本次试验的实践,使我更加了解和初步掌握了Open
GL
的用法,对使用Open
Gl
绘制球体等图形有了充分认识,并对平移矩阵堆栈和旋转矩阵堆栈的使用有了初步的 掌握。虽然以前没有接触过Open
Gl
,但是通过学习计算机图形学这门课程的知识,以 及通过多次上机实验,已使我对Open
GL
有了一定了解,不过具体使用和其它方面还需 要进一步理解和学习。最后,感谢老师的悉心指导。 5. 源程序 注:红色注释为新加 #include
#include <
gl
/
gl
ut.h> #include
#include
#include
static float fE = 0.0f; //绕太阳或行星旋转的角度 static int i=0, j=0, m; //for循环计数 static
GL
int x=7, y=3; //转换视角,以太阳为中心 static int a[8]; //计数第几颗行星的卫星的数量 static bool lag = false; //键盘L(l)增加行星的标志,true为增加 int k[8][3]; //读取文件数据 FILE *fp; void Initial() {
gl
Enable(
GL
_DEPTH_TEST); //启用深度测试
gl
ClearColor(0.0, 0.0, 0.0, 0.0);//设置背景颜色 } void Change(int w, int h) {
gl
Viewport(0, 0, (
GL
sizei) w, (
GL
sizei) h);//设置视区尺寸
gl
MatrixMode(
GL
_PROJECTION); //指定当前操作投影矩阵堆栈
gl
LoadIdentity(); //重置投影矩阵
GL
float fAspect; fAspect = (float)w/(float)h;
gl
uPerspective(45, fAspect, 1.0, 600.0);//设置透视投影矩阵
gl
MatrixMode(
GL
_MODELVIEW);
gl
LoadIdentity(); } void Satellite() //增加卫星 { for (int n=0; n< a[i]; n++) {
gl
PushMatrix();
gl
Rotate
f(
30
.0f+6*n, 0.0f, 0.0f, 1.0f); //绕z轴旋转
30
度
gl
Rotate
f(fE*10*(3*n+1), 0.0f, 1.0f, 0.0f); //公转速度fE*10*(3*n+1)
gl
Translated(-5.0f*m, 1.0f, 0.0f);
gl
Color3f(256.0f, 256.0f, 0.0f);
gl
utWireSphere(1.0f,
20
,
20
); //卫星
gl
Color3f(0.0f, 0.0f, 0.0f);
gl
PopMatrix(); } } void Planet() //增加行星 { if (lag==true) //键盘L(l)增加行星 i=j-1; else i=0; for (;i
glPushMatrix(); //保存当前的模型视图矩阵
gl
Color3f(0,0,9);
gl
utWireTorus(
20
.0f*(i+1), 0, 100, 1); //轨道
gl
Rotate
f(fE*(9-i), 0.0f, 1.0f, 0.0f); //绕y轴旋转一定的角度
gl
Translated(
20
.0f*(i+1), 0.0f, 0.0f); //平移一段距离
gl
Color3f(k[i][0], k[i][1], k[i][2]
open
gl
的太阳系模型
视点变换,旋转,加速减速,星空背景 太阳,光晕 各行星纹理 #include #include #include #include #include #include #include #pragma comment(lib, "winmm.lib") #pragma comment(lib,"wininet") // 纹理图像结构 typedef struct { int imgWidth; // 纹理宽度 int imgHeight; // 纹理高度 unsigned char byteCount; // 每个象素对应的字节数,3:24位图,4:带alpha通道的24位图 unsigned char *data; // 纹理数据 }TEXTUREIMAGE; // BMP文件头 #pragma pack(2) typedef struct { unsigned short bfType; // 文件类型 unsigned long bfSize; // 文件大小 unsigned short bfReserved1; // 保留位 unsigned short bfReserved2; // 保留位 unsigned long bfOffBits; // 数据偏移位置 }BMPFILEHEADER; #pragma pack() // BMP信息头 typedef struct { unsigned long biSize; // 此结构大小 long biWidth; // 图像宽度 long biHeight; // 图像高度 unsigned short biPlanes; // 调色板数量 unsigned short biBitCount; // 每个象素对应的位数,24:24位图,32:带alpha通道的24位图 unsigned long biCompression; // 压缩 unsigned long biSizeImage; // 图像大小 long biXPelsPerMeter;// 横向分辨率 long biYPelsPerMeter;// 纵向分辨率 unsigned long biClrUsed; // 颜色使用数 unsigned long biClrImportant; // 重要颜色数 }BMPINFOHEADER; // 定义窗口的标题、宽度、高度、全屏布尔变量 #define WIN_TITLE "模拟太阳系各星球的转动" const int WIN_WIDTH = 800; const int WIN_HEIGHT = 600; BOOL isFullScreen = FALSE; // 初始不为全屏 #define DEG_TO_RAD 0.017453 float an
gl
e=0.0; static
GL
double viewer[]= {0,0,0,0,0}; // 初始化视角
GL
UquadricObj *quadric; // 建立二次曲面对象
GL
float an
gl
e_Z; // 星空旋转角度 bool g_bOrbitOn = true; // 控制转动暂停 float g_fSpeedmodifier = 1.0f; // 时间控制 float g_fElpasedTime; double g_dCurrentTime; double g_dLastTime;
GL
float LightAmbient[] = { 1.0f, 1.0f, 1.0f, 0.0f }; // 环境光参数
GL
float LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 0.0f }; // 漫射光参数
GL
float LightPosition[] = { 0.0f, 0.0f, 0.0f, 1.0f }; // 光源的位置 // 纹理图象 TEXTUREIMAGE skyImg; TEXTUREIMAGE sunImg; TEXTUREIMAGE rayImg; TEXTUREIMAGE mercuImg; TEXTUREIMAGE venusImg; TEXTUREIMAGE earthImg; TEXTUREIMAGE marsImg; TEXTUREIMAGE jupiterImg; TEXTUREIMAGE saturnImg; TEXTUREIMAGE uranusImg; TEXTUREIMAGE neptuneImg; TEXTUREIMAGE moonImg;
GL
uint texture[12]; // 纹理数组 // 星球速度定义 static float fSunSpin = 0.0f; // 太阳自转速度 static float fMercuSpin = 0.0f; // 水星自转速度 static float fMercuOrbit = 0.0f; // 水星公转速度 static float fVenusSpin = 0.0f; // 金星自转速度 static float fVenusOrbit = 0.0f; // 金星公转速度 static float fEarthSpin = 0.0f; // 地球自转速度 static float fEarthOrbit = 0.0f; // 地球公转速度 static float fMarsSpin = 0.0f; // 火星自转速度 static float fMarsOrbit = 0.0f; // 火星公转速度 static float fJupiterSpin = 0.0f; // 木星自转速度 static float fJupiterOrbit = 0.0f; // 木星公转速度 static float fSaturnSpin = 0.0f; // 土星自转速度 static float fSaturnOrbit = 0.0f; // 土星公转速度 static float fUranusSpin = 0.0f; // 天王星自转速度 static float fUranusOrbit = 0.0f; // 天王星公转速度 static float fNeptuneSpin = 0.0f; // 海王星自转速度 static float fNeptuneOrbit = 0.0f; // 海王星公转速度 static float fMoonSpin = 0.0f; // 月亮自转速度 static float fMoonOrbit = 0.0f; // 月亮公转速度 void MakeTexture(TEXTUREIMAGE textureImg,
GL
uint * texName) //转换为纹理 {
gl
PixelStorei(
GL
_UNPACK_ALIGNMENT, 1); //对齐像素字节函数
gl
GenTextures(1,texName); //第一个参数指定表明获取多少个连续的纹理标识符
gl
BindTexture(
GL
_TEXTURE_2D , *texName);
gl
TexParameterf(
GL
_TEXTURE_2D,
GL
_TEXTURE_WRAP_S,
GL
_REPEAT);
gl
TexParameterf(
GL
_TEXTURE_2D,
GL
_TEXTURE_WRAP_T,
GL
_REPEAT);
gl
TexParameterf(
GL
_TEXTURE_2D,
GL
_TEXTURE_MAG_FILTER,
GL
_LINEAR);
gl
TexParameterf(
GL
_TEXTURE_2D,
GL
_TEXTURE_MIN_FILTER,
GL
_LINEAR);
gl
TexImage2D(
GL
_TEXTURE_2D, 0,
GL
_RGB, textureImg.imgWidth,textureImg.imgHeight, 0,
GL
_RGB,
GL
_UNSIGNED_BYTE, textureImg.data); } // 初始化Open
GL
void Init
GL
(void) {
gl
ClearColor(0.0f, 0.0f, 0.0f, 0.5f); //设置黑色背景
gl
ClearDepth(2.0f); // 设置深度缓存
gl
Enable(
GL
_DEPTH_TEST); //启动深度测试
gl
DepthFunc(
GL
_LEQUAL); //深度小或相等的时候渲染
gl
ShadeModel(
GL
_SMOOTH); //启动阴影平滑
gl
Enable(
GL
_CULL_FACE); //开启剔除操作效果
gl
Hint(
GL
_PERSPECTIVE_CORRECTION_HINT,
GL
_NICEST); //使用质量最好的模式指定颜色和纹理坐标的插值质量
gl
Lightfv(
GL
_LIGHT1,
GL
_AMBIENT, LightAmbient); // 设置环境光
gl
Lightfv(
GL
_LIGHT1,
GL
_DIFFUSE, LightDiffuse); // 设置漫反射光
gl
Enable(
GL
_LIGHTING); // 打开光照
gl
Enable(
GL
_LIGHT1); // 打开光源1 // 载入纹理
gl
Enable(
GL
_TEXTURE_2D); // 开启2D纹理映射 MakeTexture(skyImg, &texture;[0]); MakeTexture(sunImg, &texture;[1]); MakeTexture(rayImg, &texture;[2]); MakeTexture(mercuImg, &texture;[3]); MakeTexture(venusImg, &texture;[4]); MakeTexture(earthImg, &texture;[5]); MakeTexture(marsImg, &texture;[6]); MakeTexture(jupiterImg, &texture;[7]); MakeTexture(saturnImg, &texture;[8]); MakeTexture(uranusImg, &texture;[9]); MakeTexture(neptuneImg, &texture;[10]); MakeTexture(moonImg, &texture;[11]); quadric =
gl
uNewQuadric(); // 建立一个曲面对象指针
gl
uQuadricTexture(quadric,
GL
U_TRUE); // 建立纹理坐标
gl
uQuadricDrawStyle(quadric,
GL
U_FILL); // 面填充 } void Display(void) {
gl
LoadIdentity(); // 设置观察点的位置和观察的方向
gl
uLookAt(viewer[0],viewer[1],viewer[2],viewer[3],viewer[4],-5,0,1,0); //摄像机x,摄像机y,摄像机z, 目标点x,目标点y,目标点z, 摄像机顶朝向x,摄像机顶朝向y,摄像机顶朝向z // 获得系统时间使太阳系有动态效果 g_dCurrentTime = timeGetTime(); g_fElpasedTime = (float)((g_dCurrentTime - g_dLastTime) * 0.0005); g_dLastTime = g_dCurrentTime;
gl
Clear(
GL
_COLOR_BUFFER_BIT |
GL
_DEPTH_BUFFER_BIT);
gl
MatrixMode(
GL
_MODELVIEW ); //指定
GL
_MODELVIEW是下一个矩阵操作的目标
gl
Translatef(0.0f, 0.0f, -5.0f); // 将坐标系移入屏幕5.0f
gl
Rotate
f(10, 1.0f ,0.0f, 0.0f); // 将坐标系绕x轴旋转10度
gl
Enable(
GL
_LIGHT0); // 打开光源0 /**********************************绘制背景星空********************************************/
gl
PushMatrix (); // 当前模型矩阵入栈
gl
Translatef(-10.0f, 3.0f, 0.0f);
gl
Rotate
f(an
gl
e_Z, 0.0f, 0.0f, 1.0f);
gl
Enable(
GL
_TEXTURE_2D);
gl
BindTexture(
GL
_TEXTURE_2D, texture[0]); // 星空纹理
gl
Begin(
GL
_QUADS);
gl
Normal3f( 0.0f, 0.0f, 1.0f);
gl
TexCoord2f(0.0f, 0.0f);
gl
Vertex3f(-
50
.0f, -
50
.0f, -
50
.0f);
gl
TexCoord2f(6.0f, 0.0f);
gl
Vertex3f(
50
.0f, -
50
.0f, -
50
.0f);
gl
TexCoord2f(6.0f, 6.0f);
gl
Vertex3f(
50
.0f,
50
.0f, -
50
.0f);
gl
TexCoord2f(0.0f, 6.0f);
gl
Vertex3f(-
50
.0f,
50
.0f, -
50
.0f);
gl
End();
gl
Begin(
GL
_QUADS);
gl
Normal3f( 0.0f, 0.0f, -1.0f);
gl
TexCoord2f(6.0f, 6.0f);
gl
Vertex3f(-
50
.0f, -
50
.0f,
50
.0f);
gl
TexCoord2f(0.0f, 6.0f);
gl
Vertex3f(
50
.0f, -
50
.0f,
50
.0f);
gl
TexCoord2f(0.0f, 0.0f);
gl
Vertex3f(
50
.0f,
50
.0f,
50
.0f);
gl
TexCoord2f(6.0f, 0.0f);
gl
Vertex3f(-
50
.0f,
50
.0f,
50
.0f);
gl
End();
gl
Begin(
GL
_QUADS);
gl
Normal3f( 0.0f, 1.0f, 0.0f);
gl
TexCoord2f(0.0f, 0.0f);
gl
Vertex3f(-
50
.0f, -
50
.0f, -
50
.0f);
gl
TexCoord2f(6.0f, 6.0f);
gl
Vertex3f(
50
.0f, -
50
.0f,
50
.0f);
gl
TexCoord2f(6.0f, 0.0f);
gl
Vertex3f(
50
.0f, -
50
.0f, -
50
.0f);
gl
TexCoord2f(0.0f, 6.0f);
gl
Vertex3f(-
50
.0f, -
50
.0f,
50
.0f);
gl
End();
gl
Begin(
GL
_QUADS);
gl
Normal3f( 0.0f, -1.0f, 0.0f);
gl
TexCoord2f(6.0f, 6.0f);
gl
Vertex3f(-
50
.0f,
50
.0f, -
50
.0f);
gl
TexCoord2f(0.0f, 0.0f);
gl
Vertex3f(
50
.0f,
50
.0f,
50
.0f);
gl
TexCoord2f(0.0f, 6.0f);
gl
Vertex3f(
50
.0f,
50
.0f, -
50
.0f);
gl
TexCoord2f(6.0f, 0.0f);
gl
Vertex3f(-
50
.0f,
50
.0f,
50
.0f);
gl
End();
gl
Begin(
GL
_QUADS);
gl
Normal3f( 1.0f, 0.0f, 0.0f);
gl
TexCoord2f(0.0f, 0.0f);
gl
Vertex3f(-
50
.0f, -
50
.0f, -
50
.0f);
gl
TexCoord2f(6.0f, 6.0f);
gl
Vertex3f(-
50
.0f,
50
.0f,
50
.0f);
gl
TexCoord2f(0.0f, 6.0f);
gl
Vertex3f(-
50
.0f, -
50
.0f,
50
.0f);
gl
TexCoord2f(6.0f, 0.0f);
gl
Vertex3f(-
50
.0f,
50
.0f, -
50
.0f);
gl
End();
gl
Begin(
GL
_QUADS);
gl
Normal3f( -1.0f, 0.0f, 0.0f);
gl
TexCoord2f(6.0f, 6.0f);
gl
Vertex3f(
50
.0f, -
50
.0f, -
50
.0f);
gl
TexCoord2f(0.0f, 0.0f);
gl
Vertex3f(
50
.0f,
50
.0f,
50
.0f);
gl
TexCoord2f(6.0f, 0.0f);
gl
Vertex3f(
50
.0f, -
50
.0f,
50
.0f);
gl
TexCoord2f(0.0f, 6.0f);
gl
Vertex3f(
50
.0f,
50
.0f, -
50
.0f);
gl
End();
gl
PopMatrix (); // 当前模型矩阵出栈 /**********************************绘制太阳************************************************/
gl
BindTexture(
GL
_TEXTURE_2D, texture[2]); // 光晕纹理
gl
Enable(
GL
_BLEND); // 开启混合
gl
Disable(
GL
_DEPTH_TEST); // 关闭深度测试 // 绘制太阳光晕
gl
Disable(
GL
_LIGHTING); // 关闭光照
gl
BlendFunc(
GL
_SRC_ALPHA,
GL
_ONE); // 半透明混合函数
gl
Color4f(1.0f, 0.5f, 0.0f, 0.5f); // 设置RGBA值
gl
Begin(
GL
_QUADS);
gl
Normal3f( 0.0f, 0.0f, 1.0f);
gl
TexCoord2f(0.0f, 0.0f);
gl
Vertex3f(-1.0f,-1.0f, 0.0f);
gl
TexCoord2f(1.0f, 0.0f);
gl
Vertex3f( 1.0f,-1.0f, 0.0f);
gl
TexCoord2f(1.0f, 1.0f);
gl
Vertex3f( 1.0f, 1.0f, 0.0f);
gl
TexCoord2f(0.0f, 1.0f);
gl
Vertex3f(-1.0f, 1.0f, 0.0f);
gl
End();
gl
Disable(
GL
_BLEND); // 关闭混合
gl
Enable(
GL
_DEPTH_TEST);
gl
Enable(
GL
_LIGHTING); // 开启光照
gl
Lightfv(
GL
_LIGHT1,
GL
_POSITION, LightPosition); // 设置光源1位置
gl
BindTexture(
GL
_TEXTURE_2D, texture[1]); // 太阳纹理 // 将坐标系绕Y轴旋转fSunSpin角度,控制太阳自转
gl
Rotate
f(fSunSpin,0.0,1.0,0.0);
gl
uSphere(quadric, 0.3f, 32, 32); // 绘制太阳球体 /**********************************绘制水星************************************************/
gl
Disable(
GL
_LIGHT0);
gl
Enable(
GL
_TEXTURE_2D ); // 开启纹理
gl
PushMatrix (); // 当前模型视图矩阵入栈 // 将坐标系绕Y轴旋转fMercuOrbit角度,控制水星公转
gl
Rotate
f(fMercuOrbit, 0.0f, 1.0f, 0.0f);
gl
Rotate
f(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕X轴旋转-90度
gl
Translatef(0.5f, 0.0f, 0.0f); // 将坐标系右移0.5f
gl
BindTexture(
GL
_TEXTURE_2D, texture[3]); // 水星纹理 // 将坐标系绕Z轴旋转fMercuSpin角度 控制水星自转
gl
Rotate
f(fMercuSpin , 0.0f, 0.0f, 1.0f);
gl
uSphere(quadric, 0.04f, 32, 32); // 水星球体
gl
PopMatrix (); // 当前模型视图矩阵出栈 // 绘制轨道
gl
Begin(
GL
_LINE_LOOP); for(an
gl
e=0;an
gl
e<=360;an
gl
e++)
gl
Vertex3f(0.5f*sin(DEG_TO_RAD*an
gl
e),0,0.5f*cos(DEG_TO_RAD*an
gl
e));
gl
End(); /**********************************绘制金星************************************************/
gl
Disable(
GL
_LIGHT0);
gl
Enable(
GL
_TEXTURE_2D ); // 开启纹理
gl
PushMatrix (); // 当前模型视图矩阵入栈 // 将坐标系绕Y轴旋转fVenusOrbit角度,控制金星公转
gl
Rotate
f(fVenusOrbit , 0.0f, 1.0f, 0.0f);
gl
Rotate
f(-90.0f, 1.0f, 0.0f, 0.0f);// 将坐标系绕X轴旋转-90度
gl
Translatef(0.8f, 0.0f, 0.0f); // 将坐标系右移0.8f
gl
BindTexture(
GL
_TEXTURE_2D, texture[4]); // 金星纹理 // 将坐标系绕Z轴旋转fVenusSpin角度,控制金星自转
gl
Rotate
f(fVenusSpin , 0.0f, 0.0f, 1.0f);
gl
uSphere(quadric, 0.06f, 32, 32); // 金星球体
gl
PopMatrix ();
gl
Begin(
GL
_LINE_LOOP); for(an
gl
e=0;an
gl
e<=360;an
gl
e++)
gl
Vertex3f(0.8f*sin(DEG_TO_RAD*an
gl
e),0,0.8f*cos(DEG_TO_RAD*an
gl
e));
gl
End(); /**********************************绘制地球************************************************/
gl
Disable(
GL
_LIGHT0);
gl
Enable(
GL
_TEXTURE_2D ); // 开启纹理
gl
PushMatrix (); // 当前模型视图矩阵入栈 // 将坐标系绕Y轴旋转fEarthOrbit角度,控制地球公转
gl
Rotate
f(fEarthOrbit , 0.0f, 1.0f, 0.0f);
gl
Rotate
f(-90.0f, 1.0f, 0.0f, 0.0f);// 将坐标系绕X轴旋转-90度
gl
Translatef(1.1f, 0.0f, 0.0f); // 将坐标系右移1.1f
gl
BindTexture(
GL
_TEXTURE_2D, texture[5]); // 地球纹理 // 将坐标系绕Z轴旋转fEarthSpin角度,控制地球自转
gl
Rotate
f(fEarthSpin , 0.0f, 0.0f, 1.0f);
gl
uSphere(quadric, 0.08f, 32, 32); // 地球球体
gl
PopMatrix ();
gl
Begin(
GL
_LINE_LOOP); for(an
gl
e=0;an
gl
e<=360;an
gl
e++)
gl
Vertex3f(1.1f*sin(DEG_TO_RAD*an
gl
e),0,1.1f*cos(DEG_TO_RAD*an
gl
e));
gl
End(); /**********************************绘制火星************************************************/
gl
Disable(
GL
_LIGHT0);
gl
Enable(
GL
_TEXTURE_2D ); // 开启纹理
gl
PushMatrix (); // 当前模型视图矩阵入栈 // 将坐标系绕Y轴旋转fMarsOrbit角度,控制火星公转
gl
Rotate
f(fMarsOrbit , 0.0f, 1.0f, 0.0f);
gl
Rotate
f(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕X轴旋转-90度
gl
Translatef(1.4f, 0.0f, 0.0f); // 将坐标系右移1.4f
gl
BindTexture(
GL
_TEXTURE_2D, texture[6]); // 火星纹理 // 将坐标系绕Z轴旋转fMarsSpin角度,控制火星自转
gl
Rotate
f(fMarsSpin , 0.0f, 0.0f, 1.0f);
gl
uSphere(quadric, 0.04f, 32, 32); // 火星球体
gl
PopMatrix ();
gl
Begin(
GL
_LINE_LOOP); for(an
gl
e=0;an
gl
e<=360;an
gl
e++)
gl
Vertex3f(1.4f*sin(DEG_TO_RAD*an
gl
e),0,1.4f*cos(DEG_TO_RAD*an
gl
e));
gl
End(); /**********************************绘制木星************************************************/
gl
Disable(
GL
_LIGHT0);
gl
Enable(
GL
_TEXTURE_2D ); // 开启纹理
gl
PushMatrix (); // 当前模型视图矩阵入栈 // 将坐标系绕Y轴旋转fJupiterOrbit角度,控制木星公转
gl
Rotate
f(fJupiterOrbit , 0.0f, 1.0f, 0.0f);
gl
Rotate
f(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕X轴旋转-90度
gl
Translatef(1.7f, 0.0f, 0.0f); // 将坐标系右移1.7f
gl
BindTexture(
GL
_TEXTURE_2D, texture[7]); // 木星纹理 // 将坐标系绕Z轴旋转fJupiterSpin角度,控制木星自转
gl
Rotate
f(fJupiterSpin , 0.0f, 0.0f, 1.0f);
gl
uSphere(quadric, 0.13f, 32, 32); // 木星球体
gl
PopMatrix ();
gl
Begin(
GL
_LINE_LOOP); for(an
gl
e=0;an
gl
e<=360;an
gl
e++)
gl
Vertex3f(1.7f*sin(DEG_TO_RAD*an
gl
e),0,1.7f*cos(DEG_TO_RAD*an
gl
e));
gl
End(); /**********************************绘制土星************************************************/
gl
Disable(
GL
_LIGHT0);
gl
Enable(
GL
_TEXTURE_2D ); // 开启纹理
gl
PushMatrix (); // 当前模型视图矩阵入栈 // 将坐标系绕Y轴旋转fSaturnOrbit角度,控制土星公转
gl
Rotate
f(fSaturnOrbit , 0.0f, 1.0f, 0.0f);
gl
Rotate
f(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕X轴旋转-90度
gl
Translatef(1.9f, 0.0f, 0.0f); // 将坐标系右移1.9f
gl
BindTexture(
GL
_TEXTURE_2D, texture[8]); // 土星纹理 // 将坐标系绕Z轴旋转fSaturnSpin角度,控制土星自转
gl
Rotate
f(fSaturnSpin , 0.0f, 0.0f, 1.0f);
gl
uSphere(quadric, 0.1f, 32, 32); // 土星球体
gl
PopMatrix ();
gl
Begin(
GL
_LINE_LOOP); for(an
gl
e=0;an
gl
e<=360;an
gl
e++)
gl
Vertex3f(1.9f*sin(DEG_TO_RAD*an
gl
e),0,1.9f*cos(DEG_TO_RAD*an
gl
e));
gl
End(); /**********************************绘制天王星**********************************************/
gl
Disable(
GL
_LIGHT0);
gl
Enable(
GL
_TEXTURE_2D ); // 开启纹理
gl
PushMatrix (); // 当前模型视图矩阵入栈 // 将坐标系绕Y轴旋转fUranusOrbit角度,控制天王星公转
gl
Rotate
f(fUranusOrbit , 0.0f, 1.0f, 0.0f);
gl
Rotate
f(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕X轴旋转-90度
gl
Translatef(2.1f, 0.0f, 0.0f); // 将坐标系右移2.1f
gl
BindTexture(
GL
_TEXTURE_2D, texture[9]); // 天王星纹理 // 将坐标系绕Z轴旋转fUranusSpin角度,控制天王星自转
gl
Rotate
f(fUranusSpin , 0.0f, 0.0f, 1.0f);
gl
uSphere(quadric, 0.1f, 32, 32); // 天王星球体
gl
PopMatrix ();
gl
Begin(
GL
_LINE_LOOP); for(an
gl
e=0;an
gl
e<=360;an
gl
e++)
gl
Vertex3f(2.1f*sin(DEG_TO_RAD*an
gl
e),0,2.1f*cos(DEG_TO_RAD*an
gl
e));
gl
End(); /**********************************绘制海王星**********************************************/
gl
Disable(
GL
_LIGHT0);
gl
Enable(
GL
_TEXTURE_2D ); // 开启纹理
gl
PushMatrix (); // 当前模型视图矩阵入栈 // 将坐标系绕Y轴旋转fNeptuneOrbit角度,控制海王星公转
gl
Rotate
f(fNeptuneOrbit , 0.0f, 1.0f, 0.0f);
gl
Rotate
f(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕X轴旋转-90度
gl
Translatef(2.3f, 0.0f, 0.0f); // 将坐标系右移2.3f
gl
BindTexture(
GL
_TEXTURE_2D, texture[10]); // 海王星纹理 // 将坐标系绕Z轴旋转fNeptuneSpin角度,控制海王星自转
gl
Rotate
f(fNeptuneSpin , 0.0f, 0.0f, 1.0f);
gl
uSphere(quadric, 0.08f, 32, 32); // 海王星球体
gl
PopMatrix ();
gl
Begin(
GL
_LINE_LOOP); for(an
gl
e=0;an
gl
e<=360;an
gl
e++)
gl
Vertex3f(2.3f*sin(DEG_TO_RAD*an
gl
e),0,2.3f*cos(DEG_TO_RAD*an
gl
e));
gl
End(); /**********************************绘制月亮************************************************/
gl
Disable(
GL
_LIGHT0);
gl
Enable(
GL
_TEXTURE_2D ); //
gl
BindTexture(
GL
_TEXTURE_2D, texture[11]); // 月亮纹理
gl
PushMatrix (); // 将坐标系绕Y轴旋转fEarthOrbit角度,控制月亮跟随地球
gl
Rotate
f(fEarthOrbit , 0.0f, 1.0f, 0.0f);
gl
Translatef(1.1f, 0.0f, 0.0f); // 将坐标系右移1.1f // 将坐标系绕Y轴旋转fMoonOrbit角度,控制月亮公转
gl
Rotate
f(fMoonOrbit , 0.0f, 1.0f, 0.0f);
gl
Translatef(0.15f, 0.0f, 0.0f); // 将坐标系绕Y轴旋转fMoonSpin角度,控制月亮自转
gl
BindTexture(
GL
_TEXTURE_2D, texture[11]);
gl
Rotate
f(fMoonSpin , 0.0f, 1.0f, 0.0f);
gl
uSphere(quadric, 0.02, 32, 32); // 月亮球体
gl
PopMatrix (); // 控制各星球转动的速度 if( g_bOrbitOn == true ) { fSunSpin -= g_fSpeedmodifier * (g_fElpasedTime * 10.0f); fMercuSpin -= g_fSpeedmodifier * (g_fElpasedTime * 15.0f); fMercuOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 40.0f); fVenusSpin -= g_fSpeedmodifier * (g_fElpasedTime * 10.0f); fVenusOrbit -= g_fSpeedmodifier * (g_fElpasedTime *
30
.0f); fEarthSpin -= g_fSpeedmodifier * (g_fElpasedTime * 100.0f); fEarthOrbit -= g_fSpeedmodifier * (g_fElpasedTime *
20
.0f); fMarsSpin -= g_fSpeedmodifier * (g_fElpasedTime *
30
.0f); fMarsOrbit -= g_fSpeedmodifier * (g_fElpasedTime *
50
.0f); fJupiterSpin -= g_fSpeedmodifier * (g_fElpasedTime * 90.0f); fJupiterOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 35.0f); fSaturnSpin -= g_fSpeedmodifier * (g_fElpasedTime * 90.0f); fSaturnOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 25.0f); fUranusSpin -= g_fSpeedmodifier * (g_fElpasedTime * 70.0f); fUranusOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 15.0f); fNeptuneSpin -= g_fSpeedmodifier * (g_fElpasedTime * 40.0f); fNeptuneOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 5.0f); fMoonSpin -= g_fSpeedmodifier * (g_fElpasedTime *
50
.0f); fMoonOrbit -= g_fSpeedmodifier * (g_fElpasedTime *
20
0.0f); } an
gl
e_Z += 0.01f; // 星空旋转
gl
utSwapBuffers(); // 交换双缓存
gl
Flush(); } void Reshape(int width, int height) { if (height==0) height=1; // 改变窗口
gl
Viewport(0,0,width,height); // 设置视口 // 设置投影矩阵
gl
MatrixMode(
GL
_PROJECTION);
gl
LoadIdentity();
gl
uPerspective(45.0f,(
GL
float)width/(
GL
float)height,0.1f,100.0f);
gl
MatrixMode(
GL
_MODELVIEW);
gl
LoadIdentity();
gl
uLookAt(viewer[0],viewer[1],viewer[2],viewer[3],viewer[4],-5,0,1,0); } void keyboard(unsigned char key, int x, int y) { switch(key) { case 'r': case 'R': // 视点上下左右移动 if(viewer[0]=-6.0) viewer[0]-=0.5; break; case 'u': case 'U': if(viewer[1]=-6.0) viewer[1]-=0.1; break; case'+': case '=': // 加速,减速,暂停 g_fSpeedmodifier+=1.0f;
gl
utPostRedisplay(); break; case ' ': g_bOrbitOn = !g_bOrbitOn;
gl
utPostRedisplay(); break; case'-': //按'-'减小运行速度 g_fSpeedmodifier-=1.0f;
gl
utPostRedisplay(); break; case VK_ESCAPE: // 按ESC键时退出 exit(0); break; default: break; } } void special_keys(int s_keys, int x, int y) { switch(s_keys) { case
GL
UT_KEY_F1: // 按F1键时切换窗口/全屏模式 if(isFullScreen) {
gl
utReshapeWindow(WIN_WIDTH, WIN_HEIGHT);
gl
utPositionWindow(
30
,
30
); isFullScreen = FALSE; } else {
gl
utFullScreen(); isFullScreen = TRUE; } break; case
GL
UT_KEY_RIGHT: // 视角上下左右旋转 if(viewer[3]=-3.0) viewer[3]-=0.1; break; case
GL
UT_KEY_UP: if(viewer[4]=-4.5) viewer[4]-=0.1; break; default: break; } } void mouse(int btn, int state, int x, int y) // 远近视角 { if(btn==
GL
UT_RIGHT_BUTTON && state ==
GL
UT_DOWN) viewer[2]+=0.3; if(btn==
GL
UT_LEFT_BUTTON && state ==
GL
UT_DOWN&&viewer;[2]>=-3.9) viewer[2]-=0.3; } void LoadBmp(char *filename, TEXTUREIMAGE *textureImg) // 载入图片 { int i, j; FILE *file; BMPFILEHEADER bmpFile; BMPINFOHEADER bmpInfo; int pixel_size; // 初始化纹理数据 textureImg->imgWidth = 0; textureImg->imgHeight = 0; if (textureImg->data != NULL) { delete []textureImg->data; } // 打开文件 file = fopen(filename, "rb"); if (file == NULL) { return; } // 获取文件头 rewind(file); fread(&bmpFile;, sizeof(BMPFILEHEADER), 1, file); fread(&bmpInfo;, sizeof(BMPINFOHEADER), 1, file); // 验证文件类型 if (bmpFile.bfType != 0x4D42) { return; } // 获取图像色彩数 pixel_size = bmpInfo.biBitCount >> 3; // 读取文件数据 textureImg->data = new unsigned char[bmpInfo.biWidth * bmpInfo.biHeight * pixel_size]; for(i = 0 ; i < bmpInfo.biHeight; i++) { fseek(file, bmpFile.bfOffBits + (bmpInfo.biHeight - i - 1) * bmpInfo.biWidth * pixel_size, SEEK_SET); for (j = 0; j data + (i * bmpInfo.biWidth + j) * pixel_size + 2, sizeof(unsigned char), 1, file); // 绿色分量 fread(textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 1, sizeof(unsigned char), 1, file); // 蓝色分量 fread(textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 0, sizeof(unsigned char), 1, file); // Alpha分量 if (pixel_size == 4) { fread(textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 3, sizeof(unsigned char), 1, file); } } } // 记录图像相关参数 textureImg->imgWidth = bmpInfo.biWidth; textureImg->imgHeight = bmpInfo.biHeight; textureImg->byteCount = pixel_size; fclose(file); } // 程序主函数 void main(int argc, char** argv) { //读图片 LoadBmp("Picture//Sky.bmp" , &skyImg;); LoadBmp("Picture//Sun.bmp" , &sunImg;); LoadBmp("Picture//Ray.bmp" , &rayImg;); LoadBmp("Picture//Mercu.bmp" , &mercuImg;); LoadBmp("Picture//Venus.bmp" , &venusImg;); //金星 LoadBmp("Picture//Earth.bmp" , &earthImg;); LoadBmp("Picture//Mars.bmp" , &marsImg;); //火星 LoadBmp("Picture//Jupiter.bmp" , &jupiterImg;); //木星 LoadBmp("Picture//Saturn.bmp" , &saturnImg;); //土星 LoadBmp("Picture//Uranus.bmp" , &uranusImg;); //天王星 LoadBmp("Picture//Neptune.bmp" , &neptuneImg;); //海王星 LoadBmp("Picture//Moon.bmp" , &moonImg;);
gl
utInit(&argc;, argv); // 初始化
GL
UT库
gl
utInitDisplayMode(
GL
UT_RGBA |
GL
UT_DOUBLE |
GL
UT_DEPTH); // 初始化显示模式
gl
utInitWindowSize(WIN_WIDTH, WIN_HEIGHT); // 初始化窗口大小
gl
utInitWindowPosition(
20
,
20
); // 初始化窗口位置
GL
uint window =
gl
utCreateWindow(WIN_TITLE); // 建立窗口 Init
GL
(); // 初始化Open
GL
gl
utDisplayFunc(Display);
gl
utReshapeFunc(Reshape);
gl
utKeyboardFunc(keyboard);
gl
utSpecialFunc(special_keys);
gl
utMouseFunc(mouse);
gl
utIdleFunc(Display); // 设置窗口空闲时的处理函数
gl
utMainLoop(); // 进入事件处理循环 }
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章