我们试着用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);
效果图如下

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

354

被折叠的 条评论
为什么被折叠?



