OpenGL---箱子沿斜面下滑
来源:互联网 发布:it服务器 编辑:程序博客网 时间:2024/04/30 06:28
假设箱子只受重力。
#include <windows.h> #include <gl/Gl.h>#include <gl/Glu.h>#include <gl/glut.h>#include "math.h"#include "vector2.h"#pragma comment(lib, "glut.lib")const int windowWidth = 800;const int windowHeight = 600;const double rads_per_deg = 0.01745; //度换算成弧度const double pixels_per_meter = 10; //米换算成像素const double g = 9.81; //重力加速度 9,81 m/s^2double theta = 30; //坡度double mass = 1; //箱子的重量,1kgbool simulation_over = false; //箱子移动是否结束double box_pos = 0; //箱子的位置double box_vel = 0; //箱子的速度Vector2 force_grav; //箱子所受重力LARGE_INTEGER clock_freq; LARGE_INTEGER last_time;void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); //清屏 glColor3f( 1, 1, 1 ); //箱子所受重力 force_grav.x = mass * g * sin( theta * rads_per_deg ); force_grav.y = -mass * g * cos( theta * rads_per_deg ); LARGE_INTEGER i; QueryPerformanceCounter( &i ); double elapsed_time = double( i.QuadPart - last_time.QuadPart ) / clock_freq.QuadPart; last_time = i; if(! simulation_over ) { //F = ma -> a = F/m double acc = force_grav.x / mass; //加速度 box_vel += ( acc * elapsed_time ); //速度 box_pos += ( box_vel * pixels_per_meter ) * elapsed_time; //位置 } if( box_pos >= 600 ) { simulation_over = true; } //地面 glBegin( GL_LINES ); glVertex2i( 700, 100 ); glVertex2i( 100, 100 ); glEnd(); double dw = 600; //斜面,原始位置为(700,100) glPushMatrix(); //原点 glTranslatef( 700, 100, 0 ); glRotatef( -theta, 0, 0, 1); //斜坡 glBegin( GL_LINES ); glVertex2i( 0, 0 ); glVertex2i( -dw, 0 ); glEnd(); //箱子的位置 glTranslatef( box_pos-dw, 50, 0 ); //箱子 glBegin( GL_LINE_LOOP ); glVertex2i( -50, 50 ); glVertex2i( 50, 50 ); glVertex2i( 50, -50 ); glVertex2i( -50, -50 ); glEnd(); glPopMatrix(); glutSwapBuffers(); glutPostRedisplay();} void myInit(){ glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluOrtho2D( 0, windowWidth, 0, windowHeight ); glClearColor(0, 0, 0, 0); //背景颜色是黑色 glViewport(0, 0, windowWidth, windowHeight);}int main(int argc, char *argv[]) { if( QueryPerformanceFrequency( &clock_freq ) ) { QueryPerformanceCounter( &last_time ); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition(50, 50); glutInitWindowSize(windowWidth, windowHeight); glutCreateWindow("DEMO"); myInit(); glutDisplayFunc(myDisplay); } glutMainLoop(); return 0; }
vector2.h
#ifndef _Vector2_H#define _Vector2_H#include <cmath>#include <iostream>using namespace std;class Vector2 {public: // vars float x, y; // constructors Vector2() {} Vector2( float x1, float y1 ) : x(x1), y(y1) {} // vector ops void normalize() { float temp = 1 / length(); x *= temp; y *= temp; } inline double length() const { return( sqrt((x * x) + (y * y)) ); } Vector2 perp() const { return( Vector2( y, -x ) ); } // operators Vector2 operator + ( const Vector2 & rhs ) const { return( Vector2(x + rhs.x, y + rhs.y) ); } Vector2 operator - ( const Vector2 & rhs ) const { return( Vector2( x - rhs.x, y - rhs.y ) ); } Vector2 operator / ( float k ) const { return( Vector2(x / k, y / k) ); } float operator * ( const Vector2 & rhs ) const { // dot product return( (x * rhs.x) + (y * rhs.y) ); } Vector2 operator * ( const float & rhs ) const { // scale by scalar return( Vector2( x * rhs, y * rhs ) ); } bool operator == ( const Vector2 & rhs ) { return( rhs.x == x && rhs.y == y ); } friend Vector2 operator * ( const float & lhs, const Vector2 & rhs ) { // scale by scalar return( Vector2( rhs.x * lhs, rhs.y * lhs ) ); } friend istream & operator >> ( istream & i, Vector2 & v ) { i >> v.x >> v.y; return( i ); } friend ostream & operator << ( ostream & o, Vector2 & v ) { o << v.x << " " << v.y; return( o ); }}; // end class#endif // _Vector2_H
0 0
- OpenGL---箱子沿斜面下滑
- 滑块沿光滑不固定的斜面下滑,在到达斜面底端时的情况。
- 斜面地图 参考
- OpenGL 推箱子游戏 及其最短路径 3D版
- 下滑菜单
- 下滑菜单
- 箱子排序
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- 买箱子
- 箱子排序
- 推箱子
- 推箱子
- 叠放箱子
- 算法竞赛入门经典ch1_变量交换
- HBase单机模式下远程客户端访问无响应
- Android Studio 混淆打包及常见第三方依赖的混淆配置
- 数字图像处理 基于内容的图象与视频检索
- date 日期工具类
- OpenGL---箱子沿斜面下滑
- Canvas
- Python在web开发中简单服务器的搭建与运行问题
- swoole学习笔记三
- 基于DDD的.NET开发框架ABP实例,多租户 (Sass)应用程序,采用.NET MVC, Angularjs, EntityFramework-介绍
- revit之射线法查找特定元素
- 【Spring】Spring Framework Reference Documentation中文版10
- spring-boot+mybatis多数据源最简解决方案
- swoole学习笔记四