基于vb和opengl的三维小球碰撞程序源代码
被多个小球同时碰撞 代码
被多个小球同时碰撞代码当多个小球同时碰撞时,你可以使用编程语言来模拟这个过程。
以下是一个简单的示例代码,使用Python语言来实现多个小球的碰撞:python.import random.class Ball:def __init__(self, x, y, radius, speed):self.x = x.self.y = y.self.radius = radius.self.speed = speed.self.direction = random.uniform(0, 2 math.pi) # 随机初始化小球的运动方向。
def move(self):self.x += self.speed math.cos(self.direction)。
self.y += self.speed math.sin(self.direction)。
def check_collision(self, other_ball):distance = math.sqrt((self.x other_ball.x) 2 + (self.y other_ball.y) 2)。
if distance <= self.radius + other_ball.radius:# 碰撞后,更新小球的运动方向。
self.direction = math.atan2(other_ball.y self.y, other_ball.x self.x)。
other_ball.direction = math.atan2(self.y other_ball.y, self.x other_ball.x)。
# 创建多个小球。
balls = []for i in range(5):x = random.randint(0, 100)。
y = random.randint(0, 100)。
radius = random.randint(5, 10)。
编程高手之路—vb入门和游戏编写—趣味撞球小游戏的编写
编程高手之路—vb入门和游戏编写—趣味撞球小游戏的编写编程高手之路—vb入门和游戏编写—趣味撞球小游戏的编写 Visual Basic是一个功能强大的工具,它有一大特点就是易学易用,下面我们就通过写一个“趣味撞球” 的程序来初步体会一下。
首先启动VB5,新建一个标准的EXE工程。
此时可以看到,工程包括一个Form1框体。
在Form1边框的右下角按住鼠标左键不放,拖动鼠标把Form1的面积改为适当大小,比如6930×4320。
再在属性框中把Form1的ScaleMode 属性改为3,Pixel,表明我们将以像素为我们的坐标计算单位,把Form1的StartUpPosition 属性设为2,CenterScreen,使运行时窗体出现在屏幕正中。
现在,在控件面板上选取CommandButton(命令按钮)控件,为Form1添加Command1和Command2两个按钮控件,把它们的大小设为121×25,再在属性框中把Command1的Caption填为“,GO”,把Command2的Caption填为“,QUIT”,并把Command1放到框体的右上角,把Command2放到框体的右下角。
然后,在控件面板上选取Timer(时钟)控件,为Form1添加一个Timer1时钟控件。
再在属性框中把它的Enabled属性改为False,Interval属性改为50,前一个值表示该时钟控件是否激活,后一个值决定该时钟控件产生Timer事件的间隔时间,我们将用它来控制小球的移动频率。
到此为止,我们已经完成了全部的界面设计工作。
接下来要做的全部工作就是填入程序代码了。
Dim BallX As IntegerDim BallY As IntegerDim AddX As IntegerDim AddY As IntegerDim HitX As IntegerDim W As IntegerDim H As IntegerPrivate Sub Command1_Click()BallX=Int(Rnd(1),Form1.ScaleWidth/10),5,25BallY=Int((Form1.ScaleHeight)/10),5AddX=,5AddY=,5Form_PaintTimer1.Enabled=TrueEnd SubPrivate Sub Command2_Click()EndEnd SubPrivate Sub Form_MouseMove(Button As Integer,Shift As Integer,X As Single,Y As Single)X=X,50If X<15 Then X=15If X>W,105 Then X=W,105HitX=XIf Timer1.Enabled=True ThenLine(16,H,5),(W,6,H),,HC0C0C0,BFLine(HitX,H),(HitX,100,H,5),0,BFEnd IfEnd SubPrivate Sub Form_Paint()ClsW=Int((ScaleWidth,140)/5),5H=Int((ScaleHeight,10)/5),5 BackColor=,HC0C0C0Line(10,10),(15,H),0,BFLine(W,5,10),(W,H),0,BFLine(10,10),(W,15),0,BFEnd SubPrivate Sub Timer1_Timer()Form1.Circle(BallX,BallY),4,,HC0C0C0 BallX=BallX,AddXBallY=BallY,AddYForm1.Circle(BallX,BallY),4,0If BallX<=20 Then AddX=,AddXIf BallY<=20 Then AddY=,AddYIf BallX>=W,10 Then AddX=,AddXIf BallY>=H,10 ThenIf BallXHitX,100 ThenTimer1.Enabled=FalseForm_PaintEnd IfAddY=,AddY End If End Sub。
空间物体碰撞代码
空间物体碰撞代码空间物体碰撞检测是计算机图形学和游戏开发中的一项重要技术。
下面是一个简单的2D碰撞检测的示例代码,采用Python语言编写。
pythonclass Rectangle:def __init__(self, x, y, width, height):self.x = xself.y = yself.width = widthself.height = heightdef is_colliding(self, other):# 检查两个矩形是否有重叠的部分if self.x < other.x + other.width and other.x < self.x + self.width: if self.y < other.y + other.height and other.y < self.y + self.height:return Truereturn False# 创建两个矩形对象rect1 = Rectangle(0, 0, 100, 100)rect2 = Rectangle(50, 50, 100, 100)# 检查两个矩形是否有碰撞if rect1.is_colliding(rect2):print("碰撞发生!")else:print("没有碰撞!")这个代码定义了一个Rectangle类,表示一个矩形物体。
is_colliding方法用于检查两个矩形是否发生碰撞。
通过比较两个矩形的位置和大小,可以判断它们是否重叠。
在示例中,我们创建了两个矩形对象,并使用is_colliding方法检查它们是否有碰撞。
如果有碰撞,则输出“碰撞发生!”,否则输出“没有碰撞!”。
请注意,这只是一个简单的示例代码,用于说明碰撞检测的基本原理。
在实际应用中,可能需要更复杂的算法和数据结构来处理更复杂的场景和物体形状。
用VB编写的弹球游戏
用VB编写的弹球游戏整理编写:西贝一哲QQ:710886275 一、功能描述:用VB设计编写一个弹球游戏,使球在向上或左右方向碰壁反弹,下部有一可左右水平移动的挡板,当小球接触挡板时,小球反弹,否则小球出界,即游戏失败,小球每接触次挡板,加10分,当得分是10的倍数时,挡板缩短,小球移动加快,致使难度增加,得分90时游戏结束。
二、使用的控件只列出控件数目、Name及功能,具体的属性设置请对照代码自行确定和修改。
Picture:游戏窗口,里面画小球和挡板,Name为PicGameWindowShape:画小球,Name为BallLine:画挡板,Name为PlateLable:三个标签,分别显示“得分”、“用时”和“点击‘继续’恢复游戏”(Name为LabPause)Textbox:两个,分别用于显示得分(ScoresGet)和用时(TimeUse)Timer:两个,Timer1控制球的移动,Timer2用于计时Command:三个,开始(BeginGame)、暂停(PauseGame)和结束(OverGame)三、程序窗口和代码Dim Time%, key%, Score%, a#, y#, PicWinWit%, PlaLonger% Private Sub Form_Load()'游戏初始化PicWinWit = PicGameWindow.WidthPlaLonger = Plate.X2 - Plate.X1Plate.X1 = PicWinWit / 2 - PlaLonger / 2Plate.X2 = PicWinWit / 2 + PlaLonger / 2Timer1.Interval = FalseTimer2.Enabled = FalseScore = -10Time = 0Shape1.Left = (Plate.X1 + Plate.X2) / 2 - Shape1.Height / 2 Shape1.Top = Plate.Y1 - Shape1.HeightEnd SubPrivate Sub BeginGame_Click()Dim m%, n%PicGameWindow.SetFocusTimer1.Interval = 100Timer1.Enabled = TrueTimer2.Interval = 1000Timer2.Enabled = TrueRandomizem = Int(Rnd * 1) + 0If m = 0 ThenRandomizea = Int(Rnd * (46 * 3.1416 / 180)) + 30 * 3.1416 / 180y = 100 * Abs(Tan(a))Else: Randomize'平移移动量和竖直移动量的夹角a = Int(Rnd * (46 * 3.1416 / 180)) + 105 * 3.1416 / 180'确定单位时间内水平移动量,求出竖直移动量y = 100 * Abs(Tan(a))End IfEnd SubPrivate Sub PauseGame_Click()If PauseGame.Caption = "暂停" ThenTimer1.Enabled = FalseTimer2.Enabled = FalseLabPause.Visible = TrueBeginGame.Enabled = FalseOverGame.Enabled = FalsePauseGame.Caption = "继续"ElsePicGameWindow.SetFocusTimer1.Enabled = TrueTimer2.Enabled = TrueLabPause.Visible = FalseBeginGame.Enabled = TrueOverGame.Enabled = TruePauseGame.Caption = "暂停"End IfEnd SubPrivate Sub OverGame_Click()'挡板位置初始化Plate.X1 = PicGameWindow.Width / 2 - PlaLonger / 2Plate.X2 = PicGameWindow.Width / 2 + PlaLonger / 2Timer1.Interval = FalseScoresGet.Text = ""Timer2.Enabled = FalseTimer1.Enabled = FalseTimeUse.Text = ""Score = -10Time = 0'球位置初始化Shape1.Left = (Plate.X1 + Plate.X2) / 2 - Shape1.Height / 2Shape1.Top = Plate.Y1 - Shape1.HeightEnd SubPrivate Sub PicGameWindow_KeyDown(KeyCode As Integer, Shift As Integer) key = KeyCodeSelect Case KeyCode'如果按下左箭头,则板子向左移动(37是左键的编码)Case 37If Plate.X1 <= 0 ThenPlate.X1 = 0ElsePlate.X1 = Plate.X1 - 100Plate.X2 = Plate.X2 - 100End If'如果按下右箭头,则板子向右移动Case 39If Plate.X2 >= PicGameWindow.Width ThenPlate.X2 = PicGameWindow.WidthElsePlate.X1 = Plate.X1 + 100Plate.X2 = Plate.X2 + 100End IfEnd SelectEnd SubPrivate Sub PicGameWindow_KeyUp(KeyCode As Integer, Shift As Integer) key = KeyAsciiEnd SubPrivate Static Sub Timer1_Timer()Dim n%, m%, i%'使球碰壁反弹的条件If Shape1.Left <= 0 Thenn = 0End IfIf Shape1.Left >= PicGameWindow.Width - Shape1.Height - 100 Thenn = 1End IfSelect Case (n)Case 0'小球每次移动长度为60+60=120Shape1.Left = Shape1.Left + 50Case 1Shape1.Left = Shape1.Left - 50End Select'球遇到挡板反弹的条件If Shape1.Top + Shape1.Height >= Plate.Y1 And Shape1.Left <= (Plate.X2 - Shape1.Width / 2) And Shape1.Left >= (Plate.X1 - Shape1.Width / 2) Thenm = 0Score = Score + 10ScoresGet.Text = Str(Score) + "分"'当得分是10的倍数时,挡板的长度减少,小球移动时间间隔也缩短If Score Mod 10 = 0 And Timer1.Interval > 50 ThenPlate.X1 = Plate.X1 + 50Plate.X2 = Plate.X2 - 50Timer1.Interval = Timer1.Interval - 4End IfEnd IfIf Shape1.Top <= 0 Thenm = 1End IfSelect Case (m)Case 0Shape1.Top = Shape1.Top - yCase 1Shape1.Top = Shape1.Top + yEnd SelectIf Shape1.Top > Plate.Y1 Then' Timer1.Enabled = Falsei = MsgBox("你输了!", vbInformation, "结果")'游戏失败后重新初始化If i = 1 ThenPlate.X1 = PicGameWindow.Width / 2 - PlaLonger / 2Plate.X2 = PicGameWindow.Width / 2 + PlaLonger / 2Timer1.Interval = 0ScoresGet.Text = ""Timer2.Enabled = FalseTimeUse.Text = ""Score = -10Time = 0Shape1.Left = (Plate.X2 + Plate.X1) / 2 - Shape1.Width/2Shape1.Top = Plate.Y1 - Shape1.HeightEnd IfEnd If'游戏完成的条件If Score > 80 ThenMsgBox "祝贺你,游戏完成!"ScoresGet.Text = ""TimeUse.Text = ""'游戏通过后重新初始化Timer1.Enabled = FalseTimer2.Enabled = FalseTimer1.Enabled = flaseTimer1.Interval = 100Score = -10Time = 0Plate.X1 = PicGameWindow.Width / 2 - PlaLonger / 2Plate.X2 = PicGameWindow.Width / 2 + PlaLonger / 2Shape1.Left = PicGameWindow.Width / 2 - Shape1.Height / 2 Shape1.Top = Plate.Y1 - Shape1.HeightEnd IfEnd SubPrivate Sub Timer2_Timer()Time = Time + 1TimeUse.Text = Str(Time) + "秒"End Sub。
OpenGL课程设计-三维球体的实现
游戏软件设计课程报告(三维球体的实现)院系:专业:学号:姓名:指导教师:2010年10月10日目录目录一、应用程序的最终界面----------------------------------------------------------------1二、三维球体的绘制---------------------------------------------------------------------21、球体绘制方法研究 ----------------------------------------------------------------22、面分解法的实现----------------------------------------------------------------32.1面分解函数 ----------------------------------------------------------------32.2初值的选取 ----------------------------------------------------------------32.3 球体的实现----------------------------------------------------------------43、三角形绘制函数----------------------------------------------------------------44、三角面法向量函数 ----------------------------------------------------------------55、点的模长扩展函数 ----------------------------------------------------------------56、南北极法的实现----------------------------------------------------------------57、动画的实现-------------------------------------------------------------------10三、二种绘制方法的比较---------------------------------------------------------------12一、应用程序的最终界面一、应用程序的最终界面本OpenGL应用程序的最终界面主要由二部分构成,其一是参数控制栏,其二是视图显示窗。
基于OpenGL的小球碰撞动画模拟的实现
基于OpenGL的小球碰撞动画模拟的实现
贺孝梅;刘丹青;姚新港
【期刊名称】《计算机应用与软件》
【年(卷),期】2007(24)6
【摘要】介绍了利用图形工业标准OpenGL双缓存技术实现计算机动画的原理和方法,并结合实例"小球碰撞动画模拟"的演示动画,详细描述了MFC构架下OpenGL动画编程的要点.
【总页数】3页(P184-186)
【作者】贺孝梅;刘丹青;姚新港
【作者单位】中国矿业大学机电工程学院,江苏,徐州,221008;中国矿业大学机电工程学院,江苏,徐州,221008;中国矿业大学机电工程学院,江苏,徐州,221008
【正文语种】中文
【中图分类】TP3
【相关文献】
1.基于OpenGL的Hanoi塔问题动画模拟程序的设计与实现 [J], 吴元斌
2.基于OpenGL的水波动画模拟 [J], 马义俊;巴力登
3.基于VC++与OpenGL的管线碰撞检测算法设计与实现 [J], 魏家玲
4.基于图像空间的刚体碰撞检测的OpenGL实现 [J], 黄祥建; 田怀文
5.基于图像空间的刚体碰撞检测的OpenGL实现 [J], 黄祥建;田怀文
因版权原因,仅展示原文概要,查看原文内容请购买。
一个OPENGL台球实例
//一个OPENGL台球实例――――#include <gl/glut.h>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <time.h>#include <windows.h>#include <mmsystem.h>#pragma comment(lib, "OPENGL32.LIB")#pragma comment(lib, "glu32.lib")#pragma comment(lib, "glaux.lib")#pragma comment(lib, "winmm.lib")#define WIDTH 1024#define HEIGHT 768#define BMP_Header_Length 54#define PI 3.1415926#define L0 GL_LIGHT0#define L1 GL_LIGHT1//变量申明GLint font=(int)GLUT_BITMAP_HELVETICA_12,width=1024,height=768; GLuint texGround,texWall,thb,texzb,texqz,thb1,texqg,texgt,texhe;int mx=0,my=0,i=0,j=0,k=0,bcnt=16,jds=0,hqg=0,jiqiu=0;int leftm=0,rightm=0;GLfloat rx,ry,rz,speed=0;static GLfloat kx=0,ky=0,kz=0,zoom=300;static GLfloat anglex=0,angley=90,nowanglex=0,nowangley=0,nowatx=0,nowaty=0; static GLfloat at[6]={0.0,300.0,500.0,0.0,80.0,0.0};static GLfloat M=1,U=0.2,T=0.1,QR=5.715,G=-4;GLfloat m[16];//定义球及位置矢量结构体struct p3{GLfloat x;GLfloat y;GLfloat z;};struct myb{ struct p3 p;struct p3 v;struct p3 a;GLfloat mv;GLfloat ma;int jd;GLuint wl;} B[16];//函数申明int power_of_two(int n);GLuint load_texture(const char* file_name);void mydball(GLfloat mybr,GLuint BALL);void myinitball();void mycolide(int j,int k);void mybianyuan(int j);void myjindai(int j);void mylight(GLint lh,GLfloat lx,GLfloat ly,GLfloat lz,GLfloat lm);void renderoom(void);void renderqz(void);void myinitload();void myIdle(void);void myDisplay(void);static void key(unsigned char key,int x,int y);static void mymouse(int mbutton,int mstate,int x,int y);static void mymotion(int x,int y);void myhqg(GLfloat mspeed);void mystring(float x, float y, void *font, char* c);void myto2d();void myto3d();int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_STENCIL);glutInitWindowPosition(200, 100);glutInitWindowSize(WIDTH, HEIGHT);glutCreateWindow("OpenGL光照演示");glutFullScreen();myinitball();glutDisplayFunc(&myDisplay);glutKeyboardFunc(key); //设置键盘回调函数glutIdleFunc(&myIdle); //设置窗口刷新的回调函数glutMouseFunc(mymouse); //设置鼠标器按键回调函数glutMotionFunc(mymotion); //设置鼠标器移动回调函数mylight(L1,0,390,0,1); //光照模型glutMainLoop();return 0;}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);// 创建透视效果视图glLoadIdentity();gluPerspective(60.0f, 16.0/9, 1, 10000.0f);glTranslatef(kx,ky,kz);glMatrixMode(GL_TEXTURE);glLoadIdentity();glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(at[0],at[1],at[2],at[3],at[4],at[5], 0.0, 1.0, 0.0);renderoom();renderqz();for(i=0;i<bcnt;i++){if(B[i].jd==0){for (j=0; j < 15; j++) m[j] = 0.0;m[0] = m[5] = m[10] = 1.0;m[7] = (-1.0)/405;glPushMatrix();glTranslatef(B[i].p.x,B[i].p.y,B[i].p.z);glPushMatrix();glTranslatef(0, 400, 0);glMultMatrixf(m);glTranslatef(0, -400, 0);glDepthMask(GL_FALSE);glEnable (GL_BLEND);glColor4f(0.3,0.3,0.3,0.5);glBlendFunc(GL_SRC_ALPHA, GL_DST_COLOR);mydball(QR, texhe);glDisable (GL_BLEND);glDepthMask(GL_TRUE);glPopMatrix();glRotatef(B[i].ma, B[i].a.x, B[i].a.y, B[i].a.z);mydball(QR,B[i].wl);glPopMatrix();}else{glPushMatrix();glTranslatef(B[i].p.x,B[i].p.y,B[i].p.z);mydball(QR,B[i].wl);glPopMatrix();}}if(hqg==1) myhqg(speed);glutSwapBuffers();}void myIdle(void){GLfloat vx=0,vz=0;at[0]=zoom*(cos(anglex))+at[3];at[1]=zoom*(sin(angley))+at[4];at[2]=zoom*(sin(anglex))+at[5];for(i=0;i<bcnt;i++){if(B[i].jd==0){for(k=i+1;k<bcnt;k++) mycolide(i,k);//碰撞检测mybianyuan(i);myjindai(i);B[i].mv=pow(B[i].v.x,2)+pow(B[i].v.z,2);if(B[i].mv>0.1){B[i].mv=sqrt(B[i].mv);vx=B[i].v.x/B[i].mv;vz=B[i].v.z/B[i].mv;B[i].mv+=G*T;B[i].v.x=B[i].mv*vx;B[i].v.z=B[i].mv*vz;B[i].p.x+=B[i].v.x*T;B[i].p.z+=B[i].v.z*T;B[i].a.x=(-1)*vz;B[i].a.z=vx;B[i].ma+=-180*B[i].mv*T/(QR*PI);}else B[i].mv=0;}}if(hqg==1){if(speed>200) speed-=200;else speed+=2;}if(jiqiu==1){GLfloat atxy=0;atxy=sqrt(pow(at[3]-at[0],2)+pow(at[5]-at[2],2));B[0].v.x=speed*(at[3]-at[0])/atxy;B[0].v.z=speed*(at[5]-at[2])/atxy;jiqiu=0;speed=0;}if(leftm){B[0].v.x=0;B[0].v.z=0;speed=0;}myDisplay();}void myinitball(){GLfloat hhh;hhh=2*QR*sin(PI/3);B[0].p.x=0; B[0].p.y=80; B[0].p.z=-70;B[1].p.x=0; B[1].p.y=80; B[1].p.z=70;B[2].p.x=-3*QR; B[2].p.y=80; B[2].p.z=70.0+3.0*hhh;B[3].p.x=-1*QR; B[3].p.y=80; B[3].p.z=70+hhh;B[4].p.x=4*QR; B[4].p.y=80; B[4].p.z=70+4.0*hhh;B[5].p.x=2*QR; B[5].p.y=80; B[5].p.z=70+2.0*hhh;B[6].p.x=-2*QR; B[6].p.y=80; B[6].p.z=70+4.0*hhh;B[7].p.x=QR; B[7].p.y=80; B[7].p.z=70+3.0*hhh;B[8].p.x=0; B[8].p.y=80; B[8].p.z=70+2.0*hhh;B[9].p.x=2*QR; B[9].p.y=80; B[9].p.z=70+4.0*hhh;B[10].p.x=QR; B[10].p.y=80; B[10].p.z=70+hhh;B[11].p.x=-1*QR; B[11].p.y=80; B[11].p.z=70+3.0*hhh;B[12].p.x=0; B[12].p.y=80; B[12].p.z=70+4.0*hhh;B[13].p.x=-4*QR; B[13].p.y=80; B[13].p.z=70+4.0*hhh;B[14].p.x=-2*QR; B[14].p.y=80; B[14].p.z=70.0+2.0*hhh;B[15].p.x=3*QR; B[15].p.y=80; B[15].p.z=70+3.0*hhh;for(i=0;i<bcnt;i++){B[i].v.x=0; B[i].v.y=0; B[i].v.z=0;B[i].a.x=0; B[i].a.y=0; B[i].a.z=0;B[i].jd=0;B[i].mv=0;B[i].ma=0;}myinitload();}void mycolide(int j,int k){GLfloat rr,cx,cy,ccx,ccy,v1c,v1cc,v2c,v2cc;rr=sqrt(pow(B[k].p.x-B[j].p.x,2)+pow(B[k].p.z-B[j].p.z,2));if(rr<2*QR-1){PlaySound("audio/hit.wav", NULL, SND_FILENAME | SND_ASYNC);cx=(B[k].p.x-B[j].p.x)/rr;cy=(B[k].p.z-B[j].p.z)/rr;ccx=cy*(-1);ccy=cx;v1c=B[j].v.x*cx+B[j].v.z*cy;v1cc=B[j].v.x*ccx+B[j].v.z*ccy;v2c=B[k].v.x*cx+B[k].v.z*cy;v2cc=B[k].v.x*ccx+B[k].v.z*ccy;B[j].v.x=v1cc*ccx+v2c*cx;B[j].v.z=v1cc*ccy+v2c*cy;B[k].v.x=v1c*cx+v2cc*ccx;B[k].v.z=v1c*cy+v2cc*ccy;B[k].p.x=B[j].p.x+2*QR*cx;B[k].p.z=B[j].p.z+2*QR*cy;}}void mybianyuan(int j){if(abs(B[j].p.x)>72-2*QR ){if(B[j].p.x>0) B[j].p.x=72-2*QR;if(B[j].p.x<0) B[j].p.x=-72+2*QR;B[j].v.x*=(-1);}if(abs(B[j].p.z)>137-2*QR ){if(B[j].p.z>0) B[j].p.z=137-2*QR;if(B[j].p.z<0) B[j].p.z=-137+2*QR;B[j].v.z*=(-1);}}void myjindai(int j){GLfloat hhh;hhh=2*QR*sin(PI/3);if(sqrt(pow(B[j].p.x-(-65),2)+pow(B[j].p.z-(-135),2))<15 ||sqrt(pow(B[j].p.x-65,2)+pow(B[j].p.z-(-135),2))<15 ||sqrt(pow(B[j].p.x-(-65),2)+pow(B[j].p.z-135,2))<15 ||sqrt(pow(B[j].p.x-65,2)+pow(B[j].p.z-135,2))<15 ||sqrt(pow(B[j].p.x-(-70),2)+pow(B[j].p.z,2))<12 ||sqrt(pow(B[j].p.x-70,2)+pow(B[j].p.z,2))<12 ){if(j==0) {B[0].p.x=0; B[0].p.y=80; B[0].p.z=-70;}else if(j==8) {B[8].p.x=0; B[8].p.y=80; B[8].p.z=70+2.0*hhh;}else{B[j].jd=1;jds+=1;B[j].p.z=-100+jds*20;B[j].p.y=80;if(j>8) B[j].p.x=100;else B[j].p.x=-100;}B[j].v.x=0;B[j].v.y=0;B[j].v.z=0;}}static void key(unsigned char key,int x,int y){switch (key){case 27 :exit(0);case 'd' :case 'D' :if(kx>-490) kx-=10;break;case 'a':case 'A':if(kx<490) kx+=10;break;case 'w':case 'W':zoom-=10;if(zoom<10) zoom=10;break;case 's':case 'S':zoom+=10;if(zoom>500) zoom=500;break;}}static void mymouse(int mbutton,int mstate,int x,int y){mx=x;my=y;if(mbutton==GLUT_LEFT_BUTTON && mstate==GLUT_DOWN){ nowatx=kx;nowaty=ky;leftm=1;rightm=0;}else {leftm=0;}if(mbutton==GLUT_MIDDLE_BUTTON && mstate==GLUT_DOWN){at[3]=B[0].p.x; at[4]=B[0].p.y; at[5]=B[0].p.z; }if(mbutton==GLUT_RIGHT_BUTTON && mstate==GLUT_DOWN){nowanglex=anglex;nowangley=angley;leftm=0;rightm=1;hqg=1; }else {rightm=0;hqg=0;}if(mbutton==GLUT_RIGHT_BUTTON && mstate==GLUT_UP) jiqiu=1;else jiqiu=0;}static void mymotion(int x,int y){if(leftm) { kx=nowatx+x-mx; ky=nowaty+y-my; }if(rightm) {anglex=nowanglex+(x-mx)*0.01; angley=nowangley+(y-my)*0.01;} }void myinitload(){B[1].wl=load_texture("tex/B1.bmp");B[2].wl=load_texture("tex/B2.bmp");B[3].wl=load_texture("tex/B3.bmp");B[4].wl=load_texture("tex/B4.bmp");B[5].wl=load_texture("tex/B5.bmp");B[6].wl=load_texture("tex/B6.bmp");B[7].wl=load_texture("tex/B7.bmp");B[8].wl=load_texture("tex/B8.bmp");B[9].wl=load_texture("tex/B9.bmp");B[10].wl=load_texture("tex/B10.bmp");B[11].wl=load_texture("tex/B11.bmp");B[12].wl=load_texture("tex/B12.bmp");B[13].wl=load_texture("tex/B13.bmp");B[14].wl=load_texture("tex/B14.bmp");B[15].wl=load_texture("tex/B15.bmp");B[0].wl=load_texture("tex/B16.bmp");texGround=load_texture("tex/DB.bmp");texWall=load_texture("tex/wood.bmp");thb=load_texture("tex/thb2.bmp");thb1=load_texture("tex/thb1.bmp");texzb=load_texture("tex/zb.bmp");texqz=load_texture("tex/qz.bmp");texqg=load_texture("tex/QG.bmp");texgt=load_texture("tex/GT.bmp");texhe=load_texture("tex/black.bmp");}int power_of_two(int n){if( n <= 0 )return 0;return (n & (n-1)) == 0;}GLuint load_texture(const char* file_name){GLint width, height, total_bytes;GLubyte* pixels = 0;GLuint last_texture_ID, texture_ID = 0;FILE* pFile = fopen(file_name, "rb");if( pFile == 0 )return 0;fseek(pFile, 0x0012, SEEK_SET);fread(&width, 4, 1, pFile);fread(&height, 4, 1, pFile);fseek(pFile, BMP_Header_Length, SEEK_SET);{GLint line_bytes = width * 3;while( line_bytes % 4 != 0 ) ++line_bytes;total_bytes = line_bytes * height;}pixels = (GLubyte*)malloc(total_bytes);if( pixels == 0 ) {fclose(pFile); return 0;}if( fread(pixels, total_bytes, 1, pFile) <= 0 ) { free(pixels); fclose(pFile); return 0; } {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 = 256;const GLint new_height = 256; // 规定缩放后新的大小为边长的正方形GLint new_line_bytes, new_total_bytes;GLubyte* new_pixels = 0;new_line_bytes = new_width * 3;while( new_line_bytes % 4 != 0 )++new_line_bytes;new_total_bytes = new_line_bytes * new_height;new_pixels = (GLubyte*)malloc(new_total_bytes);if( new_pixels == 0 ) { free(pixels); fclose(pFile); return 0; }gluScaleImage(GL_RGB,width, height, GL_UNSIGNED_BYTE, pixels,new_width, new_height, GL_UNSIGNED_BYTE, new_pixels);free(pixels);pixels = new_pixels;width = new_width;height = new_height;}}glGenTextures(1, &texture_ID);if( texture_ID == 0 ) { free(pixels); fclose(pFile); return 0; }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_REPEA T);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);glBindTexture(GL_TEXTURE_2D, last_texture_ID);free(pixels);return texture_ID;}void mylight(GLint lh,GLfloat lx,GLfloat ly,GLfloat lz,GLfloat lm){glPushMatrix();{/********* 光照处理**********/GLfloat light_ambient[] = { 0.5, 0.5, 0.5, 1 };GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1 };GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat light_position0[] = { lx, ly, lz ,lm }; //定义光位置得齐次坐标(x,y,z,w),如果w=1.0,为定位光源(也叫点光源),如果w=0,为定向光源(无限光源),定向光源为无穷远点,因而产生光为平行光。
实验二结合MFC与OpenGL实现三维应用程序的显示
实验二结合MFC与OpenGL实现三维应用程序的显示1.实验目的●熟悉OpenGL的编程环境设置●熟悉MFC的基本编程框架●MFC与OpenGL混合编程的设置●OpenGL中基本图元的绘制2.实验内容●创建MFC+OpenGL的编程环境●利用三角形和四边形等基本图元绘制底面圆圆心在坐标原点,半径为r,高为h,方向沿z轴方向的圆柱3.实验指导3.1MFC应用程序框架在Visual C++ 2.0以后的版本中,Microsoft公司推出了MFC(Microsoft Foundation Class)类库。
MFC类库是用来编写Windows程序的C++类集。
使用MFC类库,可以简化应用程序的开发,从而缩短开发周期,而且代码的可靠性和可重用性也大大提高。
3.1.1MFC应用程序的文档/视图结构概述MFC提供了一个典型且实用的基于文档与视图的应用程序框架模板,按照其应用程序生成向导的导引步骤(MFC AppWizard)就可以创建一个基于文档/视图结构的MFC应用程序框架。
在此框架的基础上,设计和插入相关的对象,就可以实现交互式的用户界面、几何模型的管理和操作、图形图像的显示,以及其他各种专业功能。
在MFC的文档/视图结构的应用程序框架中,文档类和视图类是成对出现的。
文档用于管理应用程序的数据;而视图用于显示文档中的数据,并处理与用户的交互信息。
MFC通过文档类和视图类的划分,使数据的存储和显示既相对独立又相互关联。
在MFC所提供的框架结构中,文档与视图的关系可以由图0.1简要表示。
MFC中的视图和文档是由视图类(CView Class)和文档类(CDocument Class)分别表示的。
视图类可以调用其本身的成员函数GetDocument(),获得一个指向文档类的指针,从而能够访问文档类中的数据。
例如:在视图类中的OnDraw()函数中,视图类通过调用GetDocument()函数获得一个指向文档累的指针,然后通过这个指针获取文档类中的数据,并使用CDC类(负责处理应用程序显示设备接口的MFC类)中的函数将这些数据绘制在视图窗口中。
基于OPENGL的球体碰撞动画模拟
OpenGL(全写 Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口 规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便 的底层图形库。
OpenGL™ 是行业领域中最为广泛接纳的 2D/3D 图形 API, 其自诞生至今已催生了各种 计算机平台及设备上的数千优秀应用程序。OpenGL™ 是独立于视窗操作系统或其它操作系 统的,亦是网络透明的。在包含 CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业 及虚拟现实等行业领域中,OpenGL™ 帮助程序员实现在 PC、工作站、超级计算机等硬件设 备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
OpenGL 是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开 发的应用程序可以十分方便地在各种平台间移植;OpenGL 可以与 Visual C++紧密接口,便于 实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL 使用简便,效 率高。它具有七大功能:
1.建模:OpenGL 图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂 的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。
2.变换:OpenGL 图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、缩 放、镜像四种变换,投影变换有平行投影(又称正射投影)和透视投 影两种变换。其变换 方法有利于减少算法的运行时间,提高三维图形的显示速度。
3.颜色模式设置:OpenGL 颜色模式有两种,即 RGBA 模式和颜色索引(Color Index)。 4.光照和材质设置:OpenGL 光有自发光(Emitted Light)、环境光(Ambient Light)、 漫反射光(Diffuse Light)和高光(Specular Light)。材质是用光反射率来表示。场景(Scene) 中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的 颜色。 5:纹理映射(Texture Mapping)。利用 OpenGL 纹理映射功能可以十分逼真地表达物体
用VB编写趣味撞球程序
用VB编写趣味撞球程序一只红色的小球在箱子中不停地弹跳,你要适当地移动下面的板子挡住,别让它掉下来。
相信许多人都玩过这样的游戏,有没有想过自己编个来玩呢?界面设计:新建一个工程,Form1的Caption属性设为“趣味撞球”,在Form1上放上一个图片框控件Picture1,一个图形控件Shape1,将Shape属性设为3,FillStyle 属性设为0,FillColor属性设为“&H000000FF&”,即红色,Shape1显示为红色实心圆作小球,一个直线控件Line1,其BorderWidth属性设为3,当做板子;一个定时器Timer1,其Interval属性设为10,Enabled属性设为False,两个标签Label1 和Label2,其Caption 属性分别为“得分”和“0”,再放两个命令按钮Command1和Command2,其Caption属性分别为“开始”和“退出”,设计好的界面如^03020501a^。
程序代码:Option ExplicitDim x_step As IntegerDim y_step As IntegerPrivate Sub Command1_Click()Timer1.Enabled = Not Timer1.Enabled'启动或停止定时器If Command1.Caption = “暂停” ThenCommand1.Caption = “继续”ElseCommand1.Caption = “暂停”End IfEnd SubPrivate Sub Command2_Click()EndEnd SubPrivate Sub Form_Load()x_step = 200'设置小球运动的速度y_step = 200End SubPrivate Sub Picture1_KeyDown KeyCode As Integer, Shift As Integer Select Case KeyCodeCase 37'如果按下左箭头,使板子向左移动If Line1.X1 <= 0 ThenLine1.X1 = 0Line1.X2 = 2000ElseLine1.X1 = Line1.X1 - 100Line1.X2 = Line1.X2 - 100End IfCase 39'如果按下右箭头,使板子向右移动If Line1.X2 >= Picture1.Width ThenLine1.X2 = Picture1.WidthLine1.X1 = Picture1.Width - 2000ElseLine1.X1 = Line1.X1 + 100Line1.X2 = Line1.X2 + 100End IfEnd SelectEnd SubPrivate Sub Timer1_Timer()If Shape1.Top <= 0 Then Shape1.Top = 0:y_step = -y_step'如果小球出了上边界便弹回If Shape1.Left <= 0 Then Shape1.Left = 0:x_step = -x_step'如果小球出了左边界便弹回If Shape1.Left >= Picture1.Width - Shape1.Width Then Shape1.Left = Picture1.Width - Shape1.Width: x_step = -x_step'如果小球出了右边界便弹回If Shape1.Top >= Line1.Y1 - Shape1.Height And Shape1.Left >= Line1.X1 And Shape1.Left <= Line1.X2 Then'如果小球撞在板子上,便弹回Shape1.Top = Line1.Y1 - Shape1.Heighty_step = -y_step* 1.01'速度增加x_step = x_step* 1.01Label2.Caption = Val(Label2.Caption) + 1End IfShape1.Top = Shape1.Top + y_step'使小球移动Shape1.Left = Shape1.Left + x_stepIf Shape1.Top >= Picture1.Height - Shape1.Height ThenMsgBox “你输了!”Timer1.Enabled = FalseCommand1.Caption = “开始”Shape1.Top = 1000Label2.Caption = 0End IfEnd Sub按“F5”键运行,小球来回跳动起来,你招架得住吗?有意思吧,快试试呀!知识点:这个程序的主要控件是Shape(形状控件)和Line(直线控件),这两个控件都是简单形状的控件。
使用OpenGL画球体
(计算机图形学)实验报告实验名称使用OpenGL画球体实验时间年月日专业班级学号姓名成绩教师评语:一、实验目的1、了解并学习open GL的编程;2、掌握在open GL生成图形的基本思想和基本步骤;3、使用open GL具体生成简单的三维立体图形;二、实验原理简单的说,该实验就是使用数学函数与OpenGL库中的函数实现图形的生成,比如生成球的函数为x=sin(thetar)*cos(phir);y=cos(thetar)*cos(phir);z=sin(phir);之后在对thetar的值进行定义,使其在某一范围内变化。
然后面的集合就生成了我们所需要的球体,但是该实验没有进行光照和材质的设定,所以看起来并不像一个立体的球体形状。
其间还需要对OpenGL的编程原理和其所包含的库比较了解。
OpenGL核心库:Windows: OpenGL32。
大多数Unix/Linux系统:GL库(libGL.a)OpenGL实用库(Utility Library, GLU):利用OpenGL核心库提供一些功能,从而避免重复编写代码,与窗口系统的连接OpenGL实用工具库(OpenGL Utility ToolkitLibrary, GLUT),提供所有窗口系统的共同功能,打开窗口,从鼠标和键盘获取输入,弹出菜单,事件驱动。
代码可以在平台间移植,但是GLUT缺乏在特定平台上优秀工具包所具有的功能滚动条。
函数的功能glVertex3f(x, y, z),属于GL库参数个数,x, y, z为float。
在glVertex3fv(p)中注意每部分的大小写,p为指向float的指针。
绝大多数常数采用#define在头文件gl.h, glu.h和glut.h中定义。
注意#include <glut.h>会自动包含其它两个头文件。
例如:glBegin(GL_POLYGON);glClear(GL_COLOR_BUFFER_BIT);在头文件中也定义了OpenGL数据类型:GLfloat, GLdouble, …关于最初建立文件的步骤创建一个win32 console application类型的workspace文件,创建一个C/C++文件,包含前面的代码,并把这个文件插入到workspace文件中进入菜单Project Settings…, 选择Link标签,在Object/library modules文本框中加上opengl32.lib, glu32.lib, glut32.lib, 注意用空格分开,然后编写程序。
趣味撞球游戏VB设计
趣味撞球游戏VB设计
魏青
【期刊名称】《电脑知识与技术》
【年(卷),期】2010(006)020
【摘要】这一款趣味撞球游戏能使玩家在玩游戏时既可以享受游戏的乐趣,又可以锻炼大脑的反应能力和手指的灵活度.该趣味撞球游戏使用Microsoft公司的Visual Basic 6.0开发工具,集各种控件于一体.该游戏有简单、较难、很难等几个级别,玩家可以根据自己的情况,能进行选择.
【总页数】2页(P5493-5494)
【作者】魏青
【作者单位】菏泽学院计算机科学与信息工程系,山东,菏泽,274000
【正文语种】中文
【中图分类】TP311
【相关文献】
1.基于VB的简单游戏开发的初探--华容道游戏的设计 [J], 王学灵;王成祥
2.基于DirectX9技术的三维撞球游戏开发 [J], 潘钦员;周群一
3.VB编程技术在游戏中的应用——撞球游戏的应用与改造 [J], 赵弘宇
4.巨型行星的撞球游戏 [J], 胡德良
5.巨型行星的撞球游戏 [J], 胡德良
因版权原因,仅展示原文概要,查看原文内容请购买。
VB简单弹球游戏
Vb 实验程序设计报告09114104弹球游戏 高扬 2010-6-17目录任务描述……………………………………… 1设计代码………………………………………1问题………………………………………4解决方法………………………………………5运行效果………………………………………5总结………………………………………709114104 高扬一. 任务描述:设计一个弹球游戏,使其在向上或左右方向碰壁反弹,下部 有一可左右水平移动的挡板,当小球接触挡板时,小球反弹,否 则小球出界,即游戏失败,小球每接触次挡板,加十分,当得分 是 20 的倍数时,挡板缩短,小球移动加快,致使难度增加。
二. 设计代码:Dim time%, key%, score%, a#, y# Private Sub Command2_Click() Line1.X1 = 1320 Line1.X2 = 3000 Timer1.Interval = 100 Label1.Caption = 0 Timer2.Enabled = False Timer1.Enabled =False Label4.Caption = "" score = -10 time = 0 Shape1.Left = (Line1.X1 + Line1.X2) / 2 '球位置初始化 Shape1.Top = Line1.Y1 - Shape1.Height End Sub Private Sub Form_Load() Line1.X1 = 1320 Line1.X2 = 3000 Timer1.Interval = 100 Label1.Caption = "" Timer2.Enabled = False Label4.Caption = "" score = -10 time = 0 Shape1.Left = (Line1.X1 + Line1.X2) / 2 Shape1.Top = Line1.Y1 - Shape1.Height '游戏初始化 End Sub Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer) key = KeyCode Select Case KeyCode Case 37 '如果按下左箭头,使板子向左移动09114104 高扬1If Line1.X1 <= 0 Then Line1.X1 = 0 Else Line1.X1 = Line1.X1 - 90 Line1.X2 = Line1.X2 - 90 End If Case 39 '如果按下右箭头,使板子向右移动 If Line1.X2 >= 4575 Then Line1.X2 = 4575 Else Line1.X1 = Line1.X1 + 90 Line1.X2 = Line1.X2 + 90 End If End Select End Sub Private Sub Command1_Click() Dim m%, n% Picture1.SetFocus Timer1.Enabled = True Timer2.Enabled = True Randomize m = Int(Rnd * 1) + 0 If m = 0 Then Randomize a = Int(Rnd * (46 * 3.1416 / 180)) + 30 * 3.1416 / 180 y = 100 * Abs(Tan(a)) Else: Randomize a = Int(Rnd * (46 * 3.1416 / 180)) + 105 * 3.1416 / 180 动量的夹角'平移移动量和竖直移y = 100 * Abs(Tan(a)) '确定单位时间内水平移动量,求出竖直移动量 End If End Sub Private Sub Command3_Click() If Command3.Caption = "暂停" Then Timer1.Enabled = False Timer2.Enabled = False Label5.Visible = True Command1.Enabled = False Command2.Enabled = False Command3.Caption = "继续" Else Picture1.SetFocus09114104 高扬2Timer1.Enabled = True Timer2.Enabled = True Label5.Visible = False Command1.Enabled = True Command2.Enabled = True Command3.Caption = "暂停" End If End Sub Private Sub Picture1_KeyUp(KeyCode As Integer, Shift As Integer) key = KeyAscii End Sub Private Static Sub Timer1_Timer() Dim n%, m%, i% If Shape1.Left < 0 Then n = 0 End If If Shape1.Left > 4200 Then '使球碰壁反弹的条件 n = 1 End If Select Case (n) Case 0 Shape1.Left = Shape1.Left + 100 Case 1 Shape1.Left = Shape1.Left - 100 End Select If Shape1.Top + Shape1.Height >= Line1.Y1 And Shape1.Left <= (Line1.X2 - 175) And Shape1.Left >= (Line1.X1 - 200) Then m = 0 '球遇到挡板反弹的条件 score = score + 10 Label1.Caption = Str(score) + "分" If score Mod 20 = 0 And Timer1.Interval >= 10 Then '当得分是20的倍数时,挡 板的长度减少 Line1.X1 = Line1.X1 + 20 Line1.X2 = Line1.X2 - 20 Timer1.Interval = Timer1.Interval – 3 '当得分是20的倍数时,间隔时间减少 End If End If If Shape1.Top < 0 Then m = 1 End If Select Case (m) Case 0 Shape1.Top = Shape1.Top - y09114104 高扬3Case 1 Shape1.Top = Shape1.Top + y End Select If Shape1.Top > Line1.Y1 Then Timer1.Enabled = False i = MsgBox("你输了!", vbInformation, "结果") If i = 1 Then Line1.X1 = 1320 Line1.X2 = 3000 Timer1.Interval = 100 Label1.Caption = 0 Timer2.Enabled = False Label4.Caption = "" score = -10 time = 0 Shape1.Left = (Line1.X2 + Line1.X1) / 2 Shape1.Top = Line1.Y1 - Shape1.Height '游戏失败后重新初始化 End If End If If Timer1.Interval <= 10 Then '游戏完成的条件 Shape1.Left = (Line1.X1 + Line1.X2) / 2 Label1.Caption = "0" Label4.Caption = "" MsgBox "祝贺你,游戏完成!!" ! Timer1.Enabled = False Timer2.Enabled = False Timer1.Enabled = flase Timer1.Interval = 100 score = -10 time = 0 Shape1.Left = (Line1.X1 + Line1.X2) / 2 Shape1.Top = Line1.Y1 - Shape1.Height '游戏通过后重新初始化 End If End Sub Private Sub Timer2_Timer() time = time + 1 Label4.Caption = Str(time) + "秒" End Sub三.效果及问题: ⒈问题.⑴ 每次开始游戏时,小球发射角度随机(使小球每次向不同方向发射) ;09114104 高扬4⑵ 小球接触挡板致使加分的条件; ⑶ 游戏运行时小球和挡板的初始化; ⑷ 如何使挡板进行左右移动。
opengl跳动的小球
*创建一个球体动画,使球体在窗口内做自由落体运动,并在撞击地面后能够弹回原来的高度。
*/#include<GL/glut.h>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<math.h>#define PI 3.1415926double move = 20.0;double movex = 9.0;double stepx = -0.03;int i=0;int down=1;int count=1;double timeSpan=0; //下降到底所需时间double movey=0.0;double duration=0.0; //持续时间double length=0.0;clock_t start,end;void init(void){printf(" init");GLfloat mat_specular[]={220.220,220.0,220.0,220.0};GLfloat mat_shininess[]={70.0};GLfloat light_position[]={0.0, 0.0, 0.0, -2.0}; //r-l u-d f-bGLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };GLfloat diffuseLight[] = { 0.6f, 0.6f, 0.6f, 1.0f };GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f};glClearColor(0.3,0.8,0.8,0.0); //bgcglColor3ub(23, 17, 215);glShadeModel(GL_SMOOTH);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);glLightfv(GL_LIGHT0,GL_SPECULAR,specular);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_DEPTH_TEST);}void reshape(int w,int h){printf(" reshape");glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)glOrtho(-12,12,-12*(GLfloat)(h)/(GLfloat)(w),12*(GLfloat)(h)/(GLfloat)(w), -1.0,1.0);elseglOrtho(-12*(GLfloat)(w)/(GLfloat)(h),12*(GLfloat)(w)/(GLfloat)(h),-12,12,-1.0,1.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void initDisplay(void){down=1; //向下运动glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(0.0,20.0,0.0);glutSolidSphere(0.4,40,50);glutSwapBuffers();}void display(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(movex,move,0.0);glutSolidSphere(0.4,40,50);glutSwapBuffers();}void MoveSphereUp(){end= clock();duration = (double)(end - start-16.0) /CLOCKS_PER_SEC;length=5*(timeSpan-duration)*(timeSpan-duration);//printf("%f ",length);move= 20 - length;//printf("%f ",move);if(move>19.932) {move=20;down=1;printf("%i",down);start=clock();}display();glLoadIdentity();}void MoveSphereDown(){if(count==1){start=clock();count=0;}end=clock();duration = (double)(end - start) /CLOCKS_PER_SEC;length = 5*duration*duration;move = 20 - length;if(move < - 20) {timeSpan=duration; //记下下降所经历的时间move=-20;start=clock();down=0; //向上运动}display();glLoadIdentity();}void TimerFunc2(int value){movex += stepx;if(i==0){ //leftGLfloat light_position[]={2.0,0.0,0.0,0.0}; //r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==1){ //left-upGLfloat light_position[]={2.0,2.0,0.0,0.0}; //r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==2){ //upGLfloat light_position[]={0.0,2.0,0.0,0.0}; //r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==3){ //up-rightGLfloat light_position[]={-2.0,2.0,0.0,0.0}; //r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==4){ //rightGLfloat light_position[]={-2.0,0.0,0.0,0.0}; //r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==5){ //right-downGLfloat light_position[]={-2.0,-2.0,0.0,0.0}; //r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==6){ //downGLfloat light_position[]={0.0,-2.0,0.0,0.0}; //r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==7){ //down-leftGLfloat light_position[]={2.0,-2.0,0.0,0.0}; //r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}i=(++i)%8;glutTimerFunc(60,TimerFunc2,1);}void TimerFunc1(int value){movex += stepx;if(movex <= -9.0)stepx = 0.03;if(movex >= 9.0)stepx = -0.03;if(down==1){MoveSphereDown();}if(down==0){MoveSphereUp();}glutTimerFunc(10,TimerFunc1,0);}int main(int argc,char **argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);glutInitWindowSize(400,740);glutInitWindowPosition(300,20);glutCreateWindow(argv[0]);init();glutDisplayFunc(initDisplay);glutReshapeFunc(reshape);glutTimerFunc(1400,TimerFunc1,0); //毫秒glutTimerFunc(400,TimerFunc2,1); //毫秒//glutIdleFunc(MoveSphere);glutMainLoop();return 0;}。
基于OpenGL的小球碰撞动画模拟的实现
第6期贺孝梅等:基于OpenGL的小球碰撞动画模拟的实现185换等。
2.3建立openGL视点增加Wjndows消息wM—sIzE,向View类中加人消息响应函数0nsize(),在Onsize()中添加代码,建立视点、启动透视变换及建立透视体以设置投影格式。
2.4在onDraw()函数中设置光源,绘制图形OpenGL提供了点、线、面三种几何图元的绘制功能,运用0penGL的绘图函数库,可以绘制出所需的基本图形,再辅以适当的变换,就可以绘制出比较复杂的三维形体。
在该实例动画场景中,场景物体有运动小球,左右两边的柱子,中间下部是由有立体感的三维直方图组成的墙体。
这些图形可以通过Open.GL的绘图函数库来完成。
材质由环境色、扩散色、镜面高亮色等组成,分别体现该种材质对环境光、漫反射光和镜面反射光的不同反射率‘41。
给物体添加适当的材质,在不同位置和方向架设光源,合理地利用纹理贴图可产生真实的场景效果。
在cBaiicol妇onsView类中添加保护成员函数DrawSeene(),在此函数中编写0penGL的绘图语句,所有的绘图工作都可以通过它来完成;然后在绘图函数0nDraw()中调用Drawscene()即可。
在Drawscene()函数中绘制场景图的代码如下:voidCBallcollisionsView::drawscene(void){91Clea尤0lor(0.O,O.O,O,0,0.O);glClear(GL—COLOR—BUFFER—BITGL—DEPTH—BUFFER—BIT);Ⅱlyinit();auxsolidsphere(1.0,20,1);//绘制碰撞的小球glBegin(GL—QUADS);//DrawAQuad出Vertex3f(1.0f,500.Of,0.0f);//T叩LefcglVertex3“lO.0f,500.Of,O.0f);//T0pRightglVerte】c3f(10.0f,1.0f,O.0f);//BottomR培ht誊V积ex3f(1.Of,1.Of,O.0f);//BottomLe&glEnd();//DoneDrawingTheQuadretumTRUE;//KeepG0ing//绘制左边的柱子glTranslatef(500.Of,0.Of,O.Of);//MoveRight500Units;可以同//样的方式绘制右边的柱子,只是四边形各个定点坐标不同glFlush;}对于场景中下部墙壁的绘制,我们是通过三维的直方图来构建的,为了突出其立体感,我们可以用画刷进行填充。
NEHE的OPENGL中文教程 第30课 碰撞检测与
NEHE的OPENGL中文教程第30课碰撞检测与2011-06-16 opengl粒子系统[转载]NEHE的OPENGL中文教程:第30课碰撞检测与模型运动1opengl粒子系统[转载]NEHE的OPENGL中文教程:第30课碰撞检测与模型运动1下面我们要讨论的是如何快速有效的检测物体的碰撞和合乎物理法则的物体运动,先看一下我们要学的:1)碰撞检测·移动的范围-平面·移动的范围-圆柱·移动的范围-运动的物体2)符合物理规则的物体运动·碰撞后的响应·在具有重力影响的环境下应用Euler公式运动物体。
3)特别的效果·使用A Fin-Tree Billboard方法实现爆炸效果·使用Windows Multimedia Library实现声音(仅限于Windows平台)4)源代码的说明源代码由5个文件组成Lesson31.cpp该实例程序的主程序Image.cpp、Image.h读入位图文件Tmatrix.cpp、Tmatrix.h处理旋转Tray.cpp、Tray.h处理光线Tvector.cpp、Tvector.h矢量Vector,Ray和Matrix类是很有用的,我在个人的项目中常使用它们。
那么下面就让我们马上开始这段学习的历程吧。
31.1、碰撞检测为了实现碰撞检测我们将使用一套经常在光线跟踪算法中使用的规则。
先让我们定义一下什么是光线。
一条通过矢量描述的光线,意味着规定了起点,并且有一个矢量(通常已被归一化),描述了该光线通过的方向。
基本上该光线从起点出发并沿着该矢量规定的方向前进。
所以我们的光线可被一下公式所表达:t是一个浮点数,取值从0到无穷大。
t=0时获得起始点的位置;为其它值时获得相应的位置,当然是在该光线所经过的路线上。
变量PointOnRay,Raystart和Raydirection都是3D的矢量,取值(x,y,z)。
编程碰撞球考试题及答案
编程碰撞球考试题及答案1. 题目一:编写一个程序,模拟两个球在二维平面上的碰撞效果。
答案:程序代码如下:```pythonimport pygameimport syspygame.init()screen = pygame.display.set_mode((800, 600))clock = pygame.time.Clock()# 定义球的初始位置和速度ball1_pos = [100, 100]ball1_vel = [2, 2]ball2_pos = [200, 200]ball2_vel = [3, 3]while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()# 球的移动ball1_pos[0] += ball1_vel[0]ball1_pos[1] += ball1_vel[1]ball2_pos[0] += ball2_vel[0]ball2_pos[1] += ball2_vel[1]# 碰撞检测if (ball1_pos[0] - ball2_pos[0])2 + (ball1_pos[1] -ball2_pos[1])2 < 1002:# 交换速度ball1_vel, ball2_vel = ball2_vel, ball1_vel# 绘制球screen.fill((0, 0, 0))pygame.draw.circle(screen, (255, 0, 0),(int(ball1_pos[0]), int(ball1_pos[1])), 20)pygame.draw.circle(screen, (0, 255, 0),(int(ball2_pos[0]), int(ball2_pos[1])), 20)pygame.display.flip()clock.tick(60)```2. 题目二:描述如何检测两个圆形球体是否发生碰撞,并计算碰撞后的速度。
一个OPENGL台球实例
//一个OPENGL台球实例――――#include <gl/glut.h>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <time.h>#include <windows.h>#include <mmsystem.h>#pragma comment(lib, "OPENGL32.LIB")#pragma comment(lib, "glu32.lib")#pragma comment(lib, "glaux.lib")#pragma comment(lib, "winmm.lib")#define WIDTH 1024#define HEIGHT 768#define BMP_Header_Length 54#define PI 3.1415926#define L0 GL_LIGHT0#define L1 GL_LIGHT1//变量申明GLint font=(int)GLUT_BITMAP_HELVETICA_12,width=1024,height=768; GLuint texGround,texWall,thb,texzb,texqz,thb1,texqg,texgt,texhe;int mx=0,my=0,i=0,j=0,k=0,bcnt=16,jds=0,hqg=0,jiqiu=0;int leftm=0,rightm=0;GLfloat rx,ry,rz,speed=0;static GLfloat kx=0,ky=0,kz=0,zoom=300;static GLfloat anglex=0,angley=90,nowanglex=0,nowangley=0,nowatx=0,nowaty=0; static GLfloat at[6]={0.0,300.0,500.0,0.0,80.0,0.0};static GLfloat M=1,U=0.2,T=0.1,QR=5.715,G=-4;GLfloat m[16];//定义球及位置矢量结构体struct p3{GLfloat x;GLfloat y;GLfloat z;};struct myb{ struct p3 p;struct p3 v;struct p3 a;GLfloat mv;GLfloat ma;int jd;GLuint wl;} B[16];//函数申明int power_of_two(int n);GLuint load_texture(const char* file_name);void mydball(GLfloat mybr,GLuint BALL);void myinitball();void mycolide(int j,int k);void mybianyuan(int j);void myjindai(int j);void mylight(GLint lh,GLfloat lx,GLfloat ly,GLfloat lz,GLfloat lm);void renderoom(void);void renderqz(void);void myinitload();void myIdle(void);void myDisplay(void);static void key(unsigned char key,int x,int y);static void mymouse(int mbutton,int mstate,int x,int y);static void mymotion(int x,int y);void myhqg(GLfloat mspeed);void mystring(float x, float y, void *font, char* c);void myto2d();void myto3d();int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_STENCIL);glutInitWindowPosition(200, 100);glutInitWindowSize(WIDTH, HEIGHT);glutCreateWindow("OpenGL光照演示");glutFullScreen();myinitball();glutDisplayFunc(&myDisplay);glutKeyboardFunc(key); //设置键盘回调函数glutIdleFunc(&myIdle); //设置窗口刷新的回调函数glutMouseFunc(mymouse); //设置鼠标器按键回调函数glutMotionFunc(mymotion); //设置鼠标器移动回调函数mylight(L1,0,390,0,1); //光照模型glutMainLoop();return 0;}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);// 创建透视效果视图glLoadIdentity();gluPerspective(60.0f, 16.0/9, 1, 10000.0f);glTranslatef(kx,ky,kz);glMatrixMode(GL_TEXTURE);glLoadIdentity();glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(at[0],at[1],at[2],at[3],at[4],at[5], 0.0, 1.0, 0.0);renderoom();renderqz();for(i=0;i<bcnt;i++){if(B[i].jd==0){for (j=0; j < 15; j++) m[j] = 0.0;m[0] = m[5] = m[10] = 1.0;m[7] = (-1.0)/405;glPushMatrix();glTranslatef(B[i].p.x,B[i].p.y,B[i].p.z);glPushMatrix();glTranslatef(0, 400, 0);glMultMatrixf(m);glTranslatef(0, -400, 0);glDepthMask(GL_FALSE);glEnable (GL_BLEND);glColor4f(0.3,0.3,0.3,0.5);glBlendFunc(GL_SRC_ALPHA, GL_DST_COLOR);mydball(QR, texhe);glDisable (GL_BLEND);glDepthMask(GL_TRUE);glPopMatrix();glRotatef(B[i].ma, B[i].a.x, B[i].a.y, B[i].a.z);mydball(QR,B[i].wl);glPopMatrix();}else{glPushMatrix();glTranslatef(B[i].p.x,B[i].p.y,B[i].p.z);mydball(QR,B[i].wl);glPopMatrix();}}if(hqg==1) myhqg(speed);glutSwapBuffers();}void myIdle(void){GLfloat vx=0,vz=0;at[0]=zoom*(cos(anglex))+at[3];at[1]=zoom*(sin(angley))+at[4];at[2]=zoom*(sin(anglex))+at[5];for(i=0;i<bcnt;i++){if(B[i].jd==0){for(k=i+1;k<bcnt;k++) mycolide(i,k);//碰撞检测mybianyuan(i);myjindai(i);B[i].mv=pow(B[i].v.x,2)+pow(B[i].v.z,2);if(B[i].mv>0.1){B[i].mv=sqrt(B[i].mv);vx=B[i].v.x/B[i].mv;vz=B[i].v.z/B[i].mv;B[i].mv+=G*T;B[i].v.x=B[i].mv*vx;B[i].v.z=B[i].mv*vz;B[i].p.x+=B[i].v.x*T;B[i].p.z+=B[i].v.z*T;B[i].a.x=(-1)*vz;B[i].a.z=vx;B[i].ma+=-180*B[i].mv*T/(QR*PI);}else B[i].mv=0;}}if(hqg==1){if(speed>200) speed-=200;else speed+=2;}if(jiqiu==1){GLfloat atxy=0;atxy=sqrt(pow(at[3]-at[0],2)+pow(at[5]-at[2],2));B[0].v.x=speed*(at[3]-at[0])/atxy;B[0].v.z=speed*(at[5]-at[2])/atxy;jiqiu=0;speed=0;}if(leftm){B[0].v.x=0;B[0].v.z=0;speed=0;}myDisplay();}void myinitball(){GLfloat hhh;hhh=2*QR*sin(PI/3);B[0].p.x=0; B[0].p.y=80; B[0].p.z=-70;B[1].p.x=0; B[1].p.y=80; B[1].p.z=70;B[2].p.x=-3*QR; B[2].p.y=80; B[2].p.z=70.0+3.0*hhh;B[3].p.x=-1*QR; B[3].p.y=80; B[3].p.z=70+hhh;B[4].p.x=4*QR; B[4].p.y=80; B[4].p.z=70+4.0*hhh;B[5].p.x=2*QR; B[5].p.y=80; B[5].p.z=70+2.0*hhh;B[6].p.x=-2*QR; B[6].p.y=80; B[6].p.z=70+4.0*hhh;B[7].p.x=QR; B[7].p.y=80; B[7].p.z=70+3.0*hhh;B[8].p.x=0; B[8].p.y=80; B[8].p.z=70+2.0*hhh;B[9].p.x=2*QR; B[9].p.y=80; B[9].p.z=70+4.0*hhh;B[10].p.x=QR; B[10].p.y=80; B[10].p.z=70+hhh;B[11].p.x=-1*QR; B[11].p.y=80; B[11].p.z=70+3.0*hhh;B[12].p.x=0; B[12].p.y=80; B[12].p.z=70+4.0*hhh;B[13].p.x=-4*QR; B[13].p.y=80; B[13].p.z=70+4.0*hhh;B[14].p.x=-2*QR; B[14].p.y=80; B[14].p.z=70.0+2.0*hhh;B[15].p.x=3*QR; B[15].p.y=80; B[15].p.z=70+3.0*hhh;for(i=0;i<bcnt;i++){B[i].v.x=0; B[i].v.y=0; B[i].v.z=0;B[i].a.x=0; B[i].a.y=0; B[i].a.z=0;B[i].jd=0;B[i].mv=0;B[i].ma=0;}myinitload();}void mycolide(int j,int k){GLfloat rr,cx,cy,ccx,ccy,v1c,v1cc,v2c,v2cc;rr=sqrt(pow(B[k].p.x-B[j].p.x,2)+pow(B[k].p.z-B[j].p.z,2));if(rr<2*QR-1){PlaySound("audio/hit.wav", NULL, SND_FILENAME | SND_ASYNC);cx=(B[k].p.x-B[j].p.x)/rr;cy=(B[k].p.z-B[j].p.z)/rr;ccx=cy*(-1);ccy=cx;v1c=B[j].v.x*cx+B[j].v.z*cy;v1cc=B[j].v.x*ccx+B[j].v.z*ccy;v2c=B[k].v.x*cx+B[k].v.z*cy;v2cc=B[k].v.x*ccx+B[k].v.z*ccy;B[j].v.x=v1cc*ccx+v2c*cx;B[j].v.z=v1cc*ccy+v2c*cy;B[k].v.x=v1c*cx+v2cc*ccx;B[k].v.z=v1c*cy+v2cc*ccy;B[k].p.x=B[j].p.x+2*QR*cx;B[k].p.z=B[j].p.z+2*QR*cy;}}void mybianyuan(int j){if(abs(B[j].p.x)>72-2*QR ){if(B[j].p.x>0) B[j].p.x=72-2*QR;if(B[j].p.x<0) B[j].p.x=-72+2*QR;B[j].v.x*=(-1);}if(abs(B[j].p.z)>137-2*QR ){if(B[j].p.z>0) B[j].p.z=137-2*QR;if(B[j].p.z<0) B[j].p.z=-137+2*QR;B[j].v.z*=(-1);}}void myjindai(int j){GLfloat hhh;hhh=2*QR*sin(PI/3);if(sqrt(pow(B[j].p.x-(-65),2)+pow(B[j].p.z-(-135),2))<15 ||sqrt(pow(B[j].p.x-65,2)+pow(B[j].p.z-(-135),2))<15 ||sqrt(pow(B[j].p.x-(-65),2)+pow(B[j].p.z-135,2))<15 ||sqrt(pow(B[j].p.x-65,2)+pow(B[j].p.z-135,2))<15 ||sqrt(pow(B[j].p.x-(-70),2)+pow(B[j].p.z,2))<12 ||sqrt(pow(B[j].p.x-70,2)+pow(B[j].p.z,2))<12 ){if(j==0) {B[0].p.x=0; B[0].p.y=80; B[0].p.z=-70;}else if(j==8) {B[8].p.x=0; B[8].p.y=80; B[8].p.z=70+2.0*hhh;}else{B[j].jd=1;jds+=1;B[j].p.z=-100+jds*20;B[j].p.y=80;if(j>8) B[j].p.x=100;else B[j].p.x=-100;}B[j].v.x=0;B[j].v.y=0;B[j].v.z=0;}}static void key(unsigned char key,int x,int y){switch (key){case 27 :exit(0);case 'd' :case 'D' :if(kx>-490) kx-=10;break;case 'a':case 'A':if(kx<490) kx+=10;break;case 'w':case 'W':zoom-=10;if(zoom<10) zoom=10;break;case 's':case 'S':zoom+=10;if(zoom>500) zoom=500;break;}}static void mymouse(int mbutton,int mstate,int x,int y){mx=x;my=y;if(mbutton==GLUT_LEFT_BUTTON && mstate==GLUT_DOWN){ nowatx=kx;nowaty=ky;leftm=1;rightm=0;}else {leftm=0;}if(mbutton==GLUT_MIDDLE_BUTTON && mstate==GLUT_DOWN){at[3]=B[0].p.x; at[4]=B[0].p.y; at[5]=B[0].p.z; }if(mbutton==GLUT_RIGHT_BUTTON && mstate==GLUT_DOWN){nowanglex=anglex;nowangley=angley;leftm=0;rightm=1;hqg=1; }else {rightm=0;hqg=0;}if(mbutton==GLUT_RIGHT_BUTTON && mstate==GLUT_UP) jiqiu=1;else jiqiu=0;}static void mymotion(int x,int y){if(leftm) { kx=nowatx+x-mx; ky=nowaty+y-my; }if(rightm) {anglex=nowanglex+(x-mx)*0.01; angley=nowangley+(y-my)*0.01;} }void myinitload(){B[1].wl=load_texture("tex/B1.bmp");B[2].wl=load_texture("tex/B2.bmp");B[3].wl=load_texture("tex/B3.bmp");B[4].wl=load_texture("tex/B4.bmp");B[5].wl=load_texture("tex/B5.bmp");B[6].wl=load_texture("tex/B6.bmp");B[7].wl=load_texture("tex/B7.bmp");B[8].wl=load_texture("tex/B8.bmp");B[9].wl=load_texture("tex/B9.bmp");B[10].wl=load_texture("tex/B10.bmp");B[11].wl=load_texture("tex/B11.bmp");B[12].wl=load_texture("tex/B12.bmp");B[13].wl=load_texture("tex/B13.bmp");B[14].wl=load_texture("tex/B14.bmp");B[15].wl=load_texture("tex/B15.bmp");B[0].wl=load_texture("tex/B16.bmp");texGround=load_texture("tex/DB.bmp");texWall=load_texture("tex/wood.bmp");thb=load_texture("tex/thb2.bmp");thb1=load_texture("tex/thb1.bmp");texzb=load_texture("tex/zb.bmp");texqz=load_texture("tex/qz.bmp");texqg=load_texture("tex/QG.bmp");texgt=load_texture("tex/GT.bmp");texhe=load_texture("tex/black.bmp");}int power_of_two(int n){if( n <= 0 )return 0;return (n & (n-1)) == 0;}GLuint load_texture(const char* file_name){GLint width, height, total_bytes;GLubyte* pixels = 0;GLuint last_texture_ID, texture_ID = 0;FILE* pFile = fopen(file_name, "rb");if( pFile == 0 )return 0;fseek(pFile, 0x0012, SEEK_SET);fread(&width, 4, 1, pFile);fread(&height, 4, 1, pFile);fseek(pFile, BMP_Header_Length, SEEK_SET);{GLint line_bytes = width * 3;while( line_bytes % 4 != 0 ) ++line_bytes;total_bytes = line_bytes * height;}pixels = (GLubyte*)malloc(total_bytes);if( pixels == 0 ) {fclose(pFile); return 0;}if( fread(pixels, total_bytes, 1, pFile) <= 0 ) { free(pixels); fclose(pFile); return 0; } {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 = 256;const GLint new_height = 256; // 规定缩放后新的大小为边长的正方形GLint new_line_bytes, new_total_bytes;GLubyte* new_pixels = 0;new_line_bytes = new_width * 3;while( new_line_bytes % 4 != 0 )++new_line_bytes;new_total_bytes = new_line_bytes * new_height;new_pixels = (GLubyte*)malloc(new_total_bytes);if( new_pixels == 0 ) { free(pixels); fclose(pFile); return 0; }gluScaleImage(GL_RGB,width, height, GL_UNSIGNED_BYTE, pixels,new_width, new_height, GL_UNSIGNED_BYTE, new_pixels);free(pixels);pixels = new_pixels;width = new_width;height = new_height;}}glGenTextures(1, &texture_ID);if( texture_ID == 0 ) { free(pixels); fclose(pFile); return 0; }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_REPEA T);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);glBindTexture(GL_TEXTURE_2D, last_texture_ID);free(pixels);return texture_ID;}void mylight(GLint lh,GLfloat lx,GLfloat ly,GLfloat lz,GLfloat lm){glPushMatrix();{/********* 光照处理**********/GLfloat light_ambient[] = { 0.5, 0.5, 0.5, 1 };GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1 };GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat light_position0[] = { lx, ly, lz ,lm }; //定义光位置得齐次坐标(x,y,z,w),如果w=1.0,为定位光源(也叫点光源),如果w=0,为定向光源(无限光源),定向光源为无穷远点,因而产生光为平行光。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RadioButton4.Visible = 1
RadioButton5.Visible = 1
If RadioButton2.Checked = True Then
RadioButton6.Visible = 1
'窗体尺寸变化时控件跟随变化
SimpleOpenGlControl1.Width = Me.Width
SimpleOpenGlControl1.Height = Me.Height
TabControl1.Width = Me.Width
Gl.glMatrixMode(Gl.GL_MODELVIEW) '将矩阵变换对象切换为模型视图变换
Gl.glLoadIdentity() '加载单位矩阵
p = 8
q = 1
str = " ***** 第二届军械杯物理竞赛作品 ***** 小球碰撞演示软件 ***** 军械工程学院学员一旅六营十八连高晛哲 ***** "
Label16.Text = 0
Label17.Text = 0
Label18.Text = 0
Label19.Text = 0
Button10.Visible = False
End Sub
Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles Me.Resize
GroupBox1.Height = Me.Height / 4
GroupBox2.Height = Me.Height / 4
GroupBox3.Height = Me.Height / 4
ListBox1.Height = GroupBox1.Height - 30
RadioButton7.Visible = 1
Else
RadioButton6.Visible = 0
RadioButton7.Visible = 0
End If
If RadioButton6.Checked = True Then
If RadioButton6.Checked = True Then
Label4.Text = "V1"
Label5.Text = "V2"
Label8.Visible = 1
TextBox7.Visible = 1
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
If sj > 99 Then sj = 0 '实现字幕循环滚动
sj = sj + 1 'sj必须是全局变量,否则timer_tick无法保存每一次增量
Gl.glViewport(0, 0, Me.Width, Me.Width) '定义视口大小
Gl.glMatrixMode(Gl.GL_PROJECTION) '设置视图投影变换矩阵
Gl.glLoadIdentity() '加载单位矩阵
Gl.glOrtho(-100, 100, -100, 100, 0, -SimpleOpenGlControl1.Width) '创建平行投影区间,其中,远处物体与近处物体大小一致
Dim jc As Integer = 0, pzlx As Integer = 0, locx As Integer = 0, locy As Integer = 0, f As Integer = 0, time As Integer = 0, tx As Integer = 3600
Label4.Text = "V1"
Label5.Text = "V2"
End If
End Sub
Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton2.CheckedChanged
Gl.glClearColor(0.0F, 0.0F, 0.0F, 0.0F) '以全黑色消除颜色缓存,RGBA模式,各取值在0到1之间
பைடு நூலகம் SimpleOpenGlControl1.Width = Me.Width
SimpleOpenGlControl1.Height = Me.Height
Label8.Visible = 0
TextBox7.Visible = 0
Label9.Visible = 1
TextBox8.Visible = 1
Label10.Visible = 1
Dim str As String
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
SimpleOpenGlControl1.InitializeContexts() '初始化控件上下文
Label1.Text = Microsoft.VisualBasic.Mid(str, sj, 36) '字符串取中函数,对str字符串取从第sj开始36个字符
End Sub
Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged
If RadioButton6.Checked = True Then
Label4.Text = "V1"
Label5.Text = "V2"
Label8.Visible = 1
TextBox7.Visible = 1
RadioButton7.Visible = 1
Else
RadioButton6.Visible = 0
RadioButton7.Visible = 0
Label8.Visible = 0
Imports Tao.OpenGl '引入TAO命名空间,为使用OpenGL作准备
Public Class Form1
Dim sj As Integer = 0
Dim jl, jj, zl, t, v1x0, v2x0, v1y0, v2y0, v1x, v2x, v1y, v2y, m1, m2, r1, r2, x, y, x1, y1, e, p, q As Double
Label9.Visible = 0
TextBox8.Visible = 0
Label10.Visible = 0
TextBox9.Visible = 0
Else
Label4.Text = "V1x"
Label9.Visible = 0
TextBox8.Visible = 0
Label10.Visible = 1
TextBox9.Visible = 1
End If
End Sub
Private Sub RadioButton6_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton6.CheckedChanged
RadioButton3.Visible = 1
RadioButton4.Visible = 1
RadioButton5.Visible = 1
If RadioButton2.Checked = True Then
RadioButton6.Visible = 1
TextBox9.Visible = 1
End If
End Sub
Private Sub RadioButton7_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton7.CheckedChanged
TextBox8.Visible = 0
Label10.Visible = 0
TextBox9.Visible = 0
Else
Label4.Text = "V1x"
Label5.Text = "V2x"
TextBox7.Visible = 0
Label9.Visible = 0
TextBox8.Visible = 0
Label10.Visible = 0
TextBox9.Visible = 0
Label4.Text = "V1"
Label5.Text = "V2"
Label8.Visible = 1
TextBox7.Visible = 1
Label9.Visible = 0
Label5.Text = "V2x"
Label8.Visible = 0
TextBox7.Visible = 0
Label9.Visible = 1
TextBox8.Visible = 1
TabControl1.Height = Me.Height
GroupBox1.Width = Me.Width - 200