试着做一个世界网格,我可以随意改变c++ OpenGL
Trying to make a world mesh that I can change at will c++ OpenGL
所以,我有一个项目,我试图建立。我的目标是拥有一个包含关卡结构的GL_QUADS列表。基本上,我希望能够从列表中添加和删除立方体,然后让OpenGL渲染它。
我的问题是数组似乎是不可扩展的。我已经写了一个代码,允许我按空格并创建一个立方体,但是我需要某种方式来创建创建立方体更长时间的点数组。所以基本上,如果有一种方法可以根据需要扩展数组,我将洗耳恭听。
下面是一些代码…你甚至不需要看它来回答这个问题。我已经把不相关的部分编码掉了。
#include <GLTools.h>
#include <GLMatrixStack.h>
#include <GLFrame.h>
#include <GLFrustum.h>
#include <GLBatch.h>
#include <GLGeometryTransform.h>
#include <math.h>
#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endif
// An assortment of needed classes
GLShaderManager shaderManager;
GLMatrixStack modelViewMatrix;
GLMatrixStack projectionMatrix;
GLFrame cameraFrame;
GLFrame objectFrame;
GLFrustum viewFrustum;
GLBatch triangleBatch;
GLBatch QuadStrip;
GLGeometryTransform transformPipeline;
M3DMatrix44f shadowMatrix;
GLfloat vGreen[] = { 0.5f, 1.0f, 0.0f, 1.0f };
GLfloat vPyramid[12][3] = { //COORDS};
//This function is triggered when space is pressed. It takes parameters passed to it to create the 8 points of the cube then makes a Quad_Strip mesh from it
void CreatePlat(float centerx, float centery, float centerz, float width, float length, float depth)
{
GLfloat vP1[3] = { (centerx - (width/2)), (centery), (centerz + (length/2))}; //top left
GLfloat vP2[3] = { (centerx + (width/2)), (centery), (centerz + (length/2))}; //top right
GLfloat vP3[3] = { (centerx + (width/2)), (centery),(centerz - (length/2))}; //bottom right
GLfloat vP4[3] = { (centerx - (width/2)), (centery), (centerz - (length/2))}; //bottom left
GLfloat vP5[3] = { (centerx - (width/2)), (centery - depth), (centerz + (length/2))};
GLfloat vP6[3] = { (centerx + (width/2)), (centery - depth), (centerz + (length/2))};
GLfloat vP7[3] = { (centerx + (width/2)), (centery - depth),(centerz - (length/2))};
GLfloat vP8[3] = { (centerx - (width/2)), (centery - depth), (centerz - (length/2))};
GLfloat vPlat[26][3] = {vP4[0], vP4[1], vP4[2],
//BLA BLA
vP2[0], vP2[1], vP2[2]};
QuadStrip.Begin(GL_QUAD_STRIP, 26);
QuadStrip.CopyVertexData3f(vPlat);
QuadStrip.End();
}
GLfloat size = 1.0;
void Update ()
{
//Controls
//Rotate controls
if(space)
CreatePlat(0.0, 0.0, 0.0, size, 1.0, 1.0);
if(W)
size += 1.0;
if(S)
size -= 1.0;
vPyramid[1][1] += 1.0;
}
void SetupRC()
{
triangleBatch.Begin(GL_TRIANGLES, 12);
triangleBatch.CopyVertexData3f(vPyramid);
triangleBatch.End();
}
void DrawWireFramedBatch(GLBatch* pBatch)
{
//Take a mesh and draw it WITH outlines
}
void RenderScene(void)
{
Update();
// Clear the window with current clearing color
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
modelViewMatrix.PushMatrix();
M3DMatrix44f mCamera;
cameraFrame.GetCameraMatrix(mCamera);
modelViewMatrix.MultMatrix(mCamera);
M3DMatrix44f mObjectFrame;
objectFrame.GetMatrix(mObjectFrame);
modelViewMatrix.MultMatrix(mObjectFrame);
shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);
DrawWireFramedBatch(&triangleBatch);
DrawWireFramedBatch(&QuadStrip);
modelViewMatrix.PopMatrix();
glutPostRedisplay();
// Flush drawing commands
glutSwapBuffers();
}
int main(int argc, char* argv[])
{
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
glutInitWindowSize(800, 600);
glutCreateWindow("GL_POINTS");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
//glutSpecialFunc(SpecialKeys);
GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "GLEW Error: %sn", glewGetErrorString(err));
return 1;
}
SetupRC();
glutMainLoop();
return 0;
}
正如您所看到的,一个理想的解决方案是在创建行之后在CreatePlat()函数中,将行添加到数组中,然后重建我的缓冲区以适应它。此外,您可能会注意到目前我正在使用Quad_Strip....我将使用GL_Quads。
边注我计划做一种基于速度的运动,我熟悉如何处理2D方向的数学,如果你试图添加不同数量的水平和垂直速度....然而在3D IDK!我将能够完美地设置一切,直到玩家旋转,这时事情变得复杂。这里面有math3d库吗?
我认为你应该使用VBO而不是QuadStrip并使用基本着色器程序渲染它。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 为什么我可以通过引用修改常量返回
- 我可以在 C++ 中的函数体之外进行操作吗?
- 我可以重新分配/覆盖std::字符串吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 为什么我可以使用比分配的内存更多的内存
- 在一个读写器队列中,我可以用volatile替换原子吗
- 我可以把基础班提升为儿童班吗
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 我可以使用什么来停止循环而不是"返回 0"?
- 我可以使用反向迭代器作为ForwardIt吗
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 我可以用矢量(OpenGL)构建我的网格吗?
- 试着做一个世界网格,我可以随意改变c++ OpenGL