사용자가 창을 클릭하여 클릭 할 때마다 정확한 커서 좌표로 점을 만들 수있는 OpenGL 프로그램을 만들려고합니다. 그 지점들을 통해 곡선을 그린다. 나는 그 부분을 구현하고 각 지점을 통해 직선을 그렸지만 이제는 catmull-rom을 사용하여 그 선을 곡선으로 만들어야합니다. 이 개념을 처음 접했고 함수 glm : catmullRom()이 어떻게 작동하는지 예제를 찾았지만 나머지 프로그램과 함께 곡선을 그리는 방법에 대한 예제는 찾을 수 없습니다. 나는 그것을 사용하려고 시도했지만, 이제 나는 창문에서 잘린 직선을 얻는다. 이 설치에 올바르게 접근하는 방법을 알아야합니다.주어진 제어점을 사용하여 Catmull-Rom 스플라인 그리기에 대한 도움이 필요합니다.
double* cursorX = new double;
double* cursorY = new double;
vector<GLfloat>controlPoints = {0.0, 0.0, 0.0}; // Default value (can't pass in an empty vector to VBO)
glm::vec3 point1;
glm::vec3 point2;
glm::vec3 point3;
glm::vec3 point4;
vector<glm::vec3>interpolatedPoints;
void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
{
if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS)
{
glfwGetCursorPos(window, cursorX, cursorY);
controlPoints.push_back(*cursorX); // X-coordinate
controlPoints.push_back(*cursorY); // Y-coordinate
controlPoints.push_back(0); // Z-coordinate (always fixed at 0)
}
}
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{
if (key == GLFW_KEY_ENTER && action == GLFW_PRESS)
{
// Test with 8 points, each point having X,Y, and Z, meaning 24 indices in total!
point1 = { controlPoints[1], controlPoints[2], controlPoints[3] };
point2 = { controlPoints[4], controlPoints[5], controlPoints[6] };
point3 = { controlPoints[7], controlPoints[8], controlPoints[9] };
point4 = { controlPoints[10], controlPoints[11], controlPoints[12] };
interpolatedPoints.push_back(glm::catmullRom(point1, point2, point3, point4, 0));
point1 = { controlPoints[13], controlPoints[14], controlPoints[15] };
point2 = { controlPoints[16], controlPoints[17], controlPoints[18] };
point3 = { controlPoints[19], controlPoints[20], controlPoints[21] };
point4 = { controlPoints[22], controlPoints[23], controlPoints[24] };
interpolatedPoints.push_back(glm::catmullRom(point1, point2, point3, point4, 0.5));
}
}
// Initialize VAO and VBO
GLuint VAO, VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
// Bind VAO
glBindVertexArray(VAO);
// Bind and implement VBO
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, controlPoints.size() * sizeof(GLfloat), &controlPoints.front(), GL_STATIC_DRAW);
// Connecting coordinates to shader
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
while (!glfwWindowShouldClose(window))
{
// Check if any events have been activated (key pressed, mouse moved etc.) and call corresponding response functions
glfwPollEvents();
// Render
// Clear the colorbuffer
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VAO);
// Update VBO
glBufferData(GL_ARRAY_BUFFER, interpolatedPoints.size() * sizeof(glm::vec3), &interpolatedPoints.front(), GL_STATIC_DRAW);
glDrawArrays(GL_LINE_STRIP, 0, interpolatedPoints.size() * sizeof(glm::vec3));
// ...
}
// ...
}
glBufferData 호출을 제외하고 제안하는 것이 좋습니다. controlPoint가 아닌 interpolatedPoints에서 데이터를 가져와야하지 않습니까? 두 개의 glBufferData 호출이 있음을 명심하십시오. 하나는 시작시 VBO를 바인딩하고, 다른 하나는 게임 루프에서 지속적으로 업데이트됩니다. 또한 내 glDrawArrays가 올바르게 호출됩니까? interpolatedPoints 또는 controlPoints의 크기를 사용하면 너무 확신 할 수 없습니다. 편집 : interpolatedPoints와 함께 glBufferBata를 사용할 때 점에 관계없이 직선을 얻습니다. controlPoints를 사용하면 선은 점을 통해 연결되지만 곡선은 연결되지 않습니다. – Jonathan