[opengl]简单的opengl程序,实现四方体左右移动以及响应键盘运动

#ifndef GLUT_DISABLE_ATEXIT_HACK
#define GLUT_DISABLE_ATEXIT_HACK
#endif #define GLEW_STATIC
#include <GL/glew.h>
#include <GL/wglew.h>
#include <GL/freeglut.h>
#include <vector>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp> //for matrices
#include <glm/gtc/type_ptr.hpp>
//undefine if u want to use the default bending constraint of pbd
#include<iostream>
using namespace std;

GLfloat rtx = 0.0f, rty = 0.0f, rtz = 0.0f;
GLfloat step = 0.0005;
//float exp1 = 1e-3;

void init()
{
	glLoadIdentity();
	glClearColor(0.0, 0.0, 0.0, 0.0);
}

void draw(void)
{
	glClear(GL_COLOR_BUFFER_BIT);

	glPushMatrix();
	printf("%f %f %f\n", rtx, rty, rtz);
	glTranslatef(rtx, rty, rtz);

	glBegin(GL_QUADS);
		glColor3f(1.0f, 0.0f, 0.0f);
		glVertex2f(-0.5f, 0.5f);
		glColor3f(0.0f, 1.0f, 0.0f);
		glVertex2f(0.5f, 0.5f);
		glColor3f(0.0f, 0.0f, 1.0f);
		glVertex2f(0.5f, -0.5f);
		glColor3f(0.5f, 0.5f, 0.5f);
		glVertex2f(-0.5f, -0.5f);
	glEnd();

	glPopMatrix();
	glutSwapBuffers();
}


/* special key defined in glut
#define GLUT_KEY_F1			1
#define GLUT_KEY_F2			2
#define GLUT_KEY_F3			3
#define GLUT_KEY_F4			4
#define GLUT_KEY_F5			5
#define GLUT_KEY_F6			6
#define GLUT_KEY_F7			7
#define GLUT_KEY_F8			8
#define GLUT_KEY_F9			9
#define GLUT_KEY_F10			10
#define GLUT_KEY_F11			11
#define GLUT_KEY_F12			12

#define GLUT_KEY_LEFT			100
#define GLUT_KEY_UP			101
#define GLUT_KEY_RIGHT			102
#define GLUT_KEY_DOWN			103
#define GLUT_KEY_PAGE_UP		104
#define GLUT_KEY_PAGE_DOWN		105
#define GLUT_KEY_HOME			106
#define GLUT_KEY_END			107
#define GLUT_KEY_INSERT			108
*/
void processKeyBoard1(int key, int x, int y)
{
	switch (key)
	{
	case GLUT_KEY_LEFT:
		if (rtx - step > -0.53)rtx -= step;
		break;
	case GLUT_KEY_RIGHT:
		if (rtx + step < 0.53)rtx += step;
		break;
	case GLUT_KEY_UP:
		if (rty + step < 0.53)rty += step;
		break;
	case GLUT_KEY_DOWN:
		if (rty - step > -0.53)rty -= step;
		break;
	default:
		break;
	}

	glutPostRedisplay();
	return;
}

//float step = 0.001;
void move(){
    if(rtx+step>0.5||rtx+step<-0.5)step=-step;
    rtx+=step;
    glutPostRedisplay();
}

int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(600, 600);
	glutCreateWindow("test");

	init();

	glutDisplayFunc(draw);
//	glutIdleFunc(move);               //自动运动
	glutSpecialFunc(processKeyBoard1);//响应键盘
	glutMainLoop();
	return 0;
}

 参考 http://blog.csdn.net/iaccepted/article/details/43802347

 

绕y轴旋转

 

#ifndef GLUT_DISABLE_ATEXIT_HACK
#define GLUT_DISABLE_ATEXIT_HACK
#endif #define GLEW_STATIC
#include <GL/glew.h>
#include <GL/wglew.h>
#include <GL/freeglut.h>
#include <vector>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp> //for matrices
#include <glm/gtc/type_ptr.hpp>
//undefine if u want to use the default bending constraint of pbd
#include<iostream>
using namespace std;

GLfloat rtx = 0.0f, rty = 0.0f, rtz = 0.0f;
GLfloat step = 0.01;
//float exp1 = 1e-3;

void init()
{
	glLoadIdentity();
	glClearColor(0.0, 0.0, 0.0, 0.0);
}

float rquad  = 0;
void draw(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glPushMatrix();
	printf("%f %f %f\n", rtx, rty, rtz);
	glTranslatef(rtx, rty, rtz);

    glRotatef(rquad,0.0f,1.0f,0.0f);
	glBegin(GL_QUADS);
		glColor3f(1.0f, 0.0f, 0.0f);
		glVertex2f(-0.5f, 0.5f);
		glColor3f(0.0f, 1.0f, 0.0f);
		glVertex2f(0.5f, 0.5f);
		glColor3f(0.0f, 0.0f, 1.0f);
		glVertex2f(0.5f, -0.5f);
		glColor3f(0.5f, 0.5f, 0.5f);
		glVertex2f(-0.5f, -0.5f);
	glEnd();

	glPopMatrix();
	glutSwapBuffers();
}

//float step = 0.001;
void move(){
//    if(rtx+step>0.5||rtx+step<-0.5)step=-step;
//    rtx+=step;
    rquad += step;
    glutPostRedisplay();
}

int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(600, 600);
	glutCreateWindow("test");

	init();

	glutDisplayFunc(draw);
	glutIdleFunc(move);
//	glutSpecialFunc(processKeyBoard1);
	glutMainLoop();
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一段简单的根据IMU传感器读数来控制Gazebo中立方运动程序: 1. 首先,需要引入必要的库和模块,如`rospy`和`geometry_msgs`等。 2. 接着,需要定义一个ROS节点,并初始化它。 3. 然后,需要创建一个立方模型,并将其加载到Gazebo模拟器中。 4. 接下来,需要订阅IMU传感器的数据,并在回调函数中处理数据。 5. 在回调函数中,可以根据IMU传感器的读数来控制立方运动,例如根据加速度计读数来改变立方的速度或方向。 6. 最后,需要将立方运动指令发布到Gazebo中,以实现立方运动。 以下是一个示例代码: ```python import rospy from geometry_msgs.msg import Twist from sensor_msgs.msg import Imu class CubeControl: def __init__(self): rospy.init_node('cube_control') self.pub = rospy.Publisher('/cmd_vel', Twist, queue_size=1) rospy.Subscriber('/imu', Imu, self.imu_callback) def imu_callback(self, msg): # 处理IMU传感器数据 # 在这里根据IMU传感器的读数来控制立方运动 # 例如根据加速度计读数来改变立方的速度或方向 twist_msg = Twist() twist_msg.linear.x = msg.linear_acceleration.x twist_msg.linear.y = msg.linear_acceleration.y twist_msg.linear.z = msg.linear_acceleration.z self.pub.publish(twist_msg) if __name__ == '__main__': cube_control = CubeControl() rospy.spin() ``` 这个程序将订阅名为`/imu`的IMU传感器数据,并将其转换为运动指令发布到名为`/cmd_vel`的话题中。Gazebo模拟器将接收这些运动指令,并将立方相应地移动

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值