OpenGL做一个坐标系指示方位

本文介绍了如何使用OpenGL在3D场景中创建坐标系,帮助开发者理解模型位置和方向,通过实例展示了箭头、网格和纹理结合的技巧。

我们试着用OpengGL来画一个坐标系,方便我们知道我们的模型当前的位置和方向。做好的坐标系类似下面的效果(中间的停顿效果是因为绘图程序是用主程序的空余时间来画的,如果鼠标按住标题栏,标题栏重绘的时候,就不会处理绘图程序了)。

OpenGL除了能画3D模型,渲染外,也可以画线。下面是一段画坐标箭头的代码,供参考。

首先要加载数据到缓存区

//箭头数据,每两个点为一组,画一条线段    
glm::vec3 box[34] = {
		{ 0, 0, 0.f },
		{ 1, 0, 0.f },
		{ 1, 0, 0.f },
		{ 0.7, 0.1, 0.f },
		{ 1, 0, 0.f },
		{ 0.7, -0.1, 0.f },
        { 1.2, 0.1, 0.f },
        { 1.3, -0.1, 0.f },
        { 1.2, -0.1, 0.f },
        { 1.3, 0.1, 0.f },

		{ 0, 0, 0.f },
		{ 0, 1, 0.f },
		{ 0, 1, 0.f },
		{ 0.1, 0.7, 0.f },
		{ 0, 1, 0.f },
		{ -0.1, 0.7, 0.f },
		{ 0.05, 1.3, 0.f },
        { 0, 1.2, 0.f },
        { -0.05, 1.3, 0.f },
        { 0, 1.2, 0.f },
        { 0, 1.2, 0.f },
        { 0, 1.1, 0.f },

        { 0, 0, 0.0f },
		{ 0, 0, 1.0f },
		{ 0, 0, 1.0f },
		{ 0.1, 0.0, 0.7f },
		{ 0, 0, 1.0f },
		{ -0.1, 0.0, 0.7f },
		{ -0.05, 0, 1.2f },
		{ 0.05, 0, 1.2f },
		{ 0.05, 0, 1.2f },
		{ -0.05, 0.0, 1.1f },
		{ -0.05, 0, 1.1f },
		{ 0.05, 0.0, 1.1f }
	};
	std::vector<float> pvalues;
     for(int i=0;i<sizeof(box);i++)
    {
        pvalues.push_back(box[i][0]);
        pvalues.push_back(box[i][1]);
        pvalues.push_back(box[i][2]);
    }

    glGenVertexArrays(1,vao);
    glGenBuffers(1,vbo);
    //绑定到vao
    glBindVertexArray(vao[0]);
    glBindBuffer(GL_ARRAY_BUFFER,vbo[0]);
    //缓存数据
    glBufferData(GL_ARRAY_BUFFER,pvalues.size()*4,&pvalues[0],GL_STATIC_DRAW);
    //指定数据格式
    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0);
    glEnableVertexAttribArray(0);
    //松绑
    glBindVertexArray(0);

绘图代码如下:

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
glDepthFunc(GL_LEQUAL);
/获取统一变量地址
scene.mvLoc=glGetUniformLocation(renderingProgram,"mv_matrix");

    scene.vMat=glm::translate(glm::mat4(1.0f),glm::vec3(-camera.camerax,-camera.cameray,-camera.cameraz));               scene.mMat=glm::translate(glm::mat4(1.0f),glm::vec3(mytorus.locx,mytorus.locy,mytorus.locz));
    scene.mMat*= glm::rotate(glm::mat4(1.0f), (float)(mytorus.rotateangle),glm::vec3(1.0f,1.0f,0.0f));
    scene.mvMat=scene.vMat*scene.mMat;
glUniformMatrix4fv(scene.mvLoc,1,GL_FALSE,glm::value_ptr(scene.mvMat));

glBindVertexArray(vao[0]);
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glColor3f(0.f, 1.f, 1.f);
glLineWidth(5.0f);

glDrawArrays(GL_LINES, 0, 34);

glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glBindVertexArray(0);

效果图如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水滴与鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值