- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 OpenGL 中编写 3D 金字塔,但我无法弄清楚为什么我的三角形在金字塔的侧面不重叠,以及我需要做什么才能获得实际的金字塔形状。
我尝试更新步幅、旋转,但我不知所措。我也尝试过将形状加倍的概念,但这也不起作用。
我希望任何人能够了解如何完成此代码以获得 3D 金字塔
我的代码:
#include <GLEW/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
//GLM library
#include <glm/glm.hpp>
#include<glm/gtc/matrix_transform.hpp>
#include<glm/gtc/type_ptr.hpp>
using namespace std;
int width, height; const double PI = 3.14159; const float toRadians =
PI / 180.0f;
// Draw Primitive(s) void draw() { GLenum mode = GL_TRIANGLES;
GLsizei indices = 6; glDrawElements(mode, indices,
GL_UNSIGNED_BYTE, nullptr);
}
// Create and Compile Shaders static GLuint CompileShader(const
string& source, GLuint shaderType) { // Create Shader object GLuint
shaderID = glCreateShader(shaderType); const char* src =
source.c_str();
// Attach source code to Shader object glShaderSource(shaderID, 1,
&src, nullptr);
// Compile Shader glCompileShader(shaderID);
// Return ID of Compiled shader return shaderID;
}
// Create Program Object static GLuint CreateShaderProgram(const
string& vertexShader, const string& fragmentShader) { // Compile
vertex shader GLuint vertexShaderComp = CompileShader(vertexShader,
GL_VERTEX_SHADER);
// Compile fragment shader GLuint fragmentShaderComp =
CompileShader(fragmentShader, GL_FRAGMENT_SHADER);
// Create program object GLuint shaderProgram = glCreateProgram();
// Attach vertex and fragment shaders to program object
glAttachShader(shaderProgram, vertexShaderComp);
glAttachShader(shaderProgram, fragmentShaderComp);
// Link shaders to create executable glLinkProgram(shaderProgram);
// Delete compiled vertex and fragment shaders
glDeleteShader(vertexShaderComp);
glDeleteShader(fragmentShaderComp);
// Return Shader Program return shaderProgram;
}
int main(void) { width = 640; height = 480;
GLFWwindow* window;
/* Initialize the library */ if (!glfwInit()) return -1;
/* Create a windowed mode window and its OpenGL context */ window =
glfwCreateWindow(width, height, "Main Window", NULL, NULL); if
(!window) { glfwTerminate(); return -1; }
/* Make the window's context current */
glfwMakeContextCurrent(window);
// Initialize GLEW if (glewInit() != GLEW_OK) cout << "Error!" <<
endl;
GLfloat vertices[] = {
// Triangle 1
0.0,1.0,0.0,
1.0,0.0,0.0,
-1.0,-1.0,1.0,
0.0,1.0,0.0,
1.0,-1.0,1.0,
0.0,0.0,1.0,
//Triangle 2
0.0,1.0,0.0,
1.0,0.0,0.0,
1.0,-1.0,1.0,
0.0,0.0,1.0,
1.0,-1.0,-1.0,
0.0,1.0,0.0,
//Triangle 3
0.0,1.0,0.0,
1.0,0.0,0.0,
1.0,-1.0,-1.0,
0.0,1.0,0.0,
-1.0,-1.0,-1.0,
0.0,0.0,1.0,
//Triangle 4
0.0,1.0,0.0,
1.0,0.0,0.0,
-1.0,-1.0,-1.0,
0.0,0.0,1.0,
-1.0,-1.0,1.0,
0.0,1.0,0.0
};
// Define element indices GLubyte indices[] = { 0, 1, 2, 1, 2,
3 };
//plane positions glm::vec3 planePositions[] = {
glm::vec3(0.0f,0.0f,0.5f), glm::vec3(0.5f,0.0f,0.0f),
glm::vec3(0.0f,0.0f,-0.5f), glm::vec3(-0.5f,0.0f,0.0f) };
//Plane rotations glm::float32 planeRotationsY[] = {
0.0f,80.0f, 10.0f, 90.f };
glm::float32 planeRotationsX[] = {
20.0f,-15.0f, 90.0f, 45.f };
//Enable Depth buffer
glEnable(GL_DEPTH_TEST);
//Wireframe mode
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
GLuint VBO, EBO, VAO;
glGenBuffers(1, &VBO); // Create VBO
glGenBuffers(1, &EBO); // Create EBO
glGenVertexArrays(1, &VAO); // Create VOA
glBindVertexArray(VAO);
// VBO and EBO Placed in User-Defined VAO
glBindBuffer(GL_ARRAY_BUFFER, VBO); // Select VBO
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); // Select EBO
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // Load vertex attributes
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); // Load indices
// Specify attribute location and layout to GPU
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glBindVertexArray(0); // Unbind VOA or close off (Must call VOA explicitly in loop)
// Vertex shader source code
string vertexShaderSource =
"#version 330 core\n"
"layout(location = 0) in vec4 vPosition;"
"layout(location = 1) in vec4 aColor;"
"out vec4 oColor;"
"uniform mat4 model;"
"uniform mat4 view;"
"uniform mat4 projection;"
"void main()\n"
"{\n"
"gl_Position = projection * view * model * vPosition;"
"oColor = aColor;"
"}\n";
// Fragment shader source code
string fragmentShaderSource =
"#version 330 core\n"
"in vec4 oColor;"
"out vec4 fragColor;"
"void main()\n"
"{\n"
"fragColor = oColor;"
"}\n";
// Creating Shader Program
GLuint shaderProgram = CreateShaderProgram(vertexShaderSource, fragmentShaderSource);
// Use Shader Program exe once
//glUseProgram(shaderProgram);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
// Resize window and graphics simultaneously
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
/* Render here */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Use Shader Program exe and select VAO before drawing
glUseProgram(shaderProgram); // Call Shader per-frame when updating attributes
//Declare identity matrix
glm::mat4 viewMatrix;
glm::mat4 projectionMatrix;
//Initialize transforms
//modelMatrix = glm::scale(modelMatrix, glm::vec3(0.5f, 0.5f, 0.5f));
viewMatrix = glm::translate(viewMatrix, glm::vec3(0.0f, 0.0f, -3.0f));
viewMatrix = glm::rotate(viewMatrix, 45.0f * toRadians, glm::vec3(1.0f, 0.0f, 0.0f));
projectionMatrix = glm::perspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
//Select uniform shader and variable
GLuint modelLoc = glGetUniformLocation(shaderProgram, "model");
GLuint viewLoc = glGetUniformLocation(shaderProgram, "view");
GLuint projectionLoc = glGetUniformLocation(shaderProgram, "projection");
//Pass transform to shader
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(viewMatrix));
glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projectionMatrix));
glBindVertexArray(VAO); // User-defined VAO must be called before draw.
for (GLuint i = 0; i< 4; i++)
{
glm::mat4 modelMatrix;
modelMatrix = glm::translate(modelMatrix, planePositions[i]);
modelMatrix = glm::rotate(modelMatrix, planeRotationsY[i] * toRadians, glm::vec3(0.0f, 1.0f, 0.0f));
modelMatrix = glm::rotate(modelMatrix, planeRotationsX[i] * toRadians, glm::vec3(1.0f, 0.0f, 0.0f));
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(modelMatrix));
// Draw primitive(s)
draw();
}
// Unbind Shader exe and VOA after drawing per frame
glBindVertexArray(0); //Incase different VAO wii be used after
glUseProgram(0); // Incase different shader will be used after
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
//Clear GPU resources
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteBuffers(1, &EBO);
glfwTerminate();
return 0;
}
最佳答案
似乎存在一些代码格式问题,但我看到了这一点:
// Define element indices
GLubyte indices[] = { 0, 1, 2, 1, 2, 3 };
这对我来说看起来不正确,顶点数据的注释方式看起来应该是这样的:
GLubyte indices[] = {
// First triangle
0, 1, 2,
// Second triangle
3, 4, 5,
// Third triangle
6, 7, 8,
// Fourth triangle
9, 10, 11,
};
然后你可以:
glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_BYTE, nullptr);
但是索引数组是不必要的。您可以完全删除它并只需使用:
glDrawArrays(GL_TRIANGLES, 0, 12);
关于c++ - 3D 金字塔与 OPENGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51777815/
我想简化/减少我的代码,所以我尝试将具有重复参数的类的初始化放在它们自己的扩展类中。这是一个基于 Pyramid & Cornice 的 REST API。 我如何初始化 pyramid.httpex
我正在尝试构建一个由 4 个 DIV 组成的金字塔。布局如下所示: ------ | #1 | ------ ---------------- | #2 | #3 | #
我是 3d 绘图的新手。我只想用 5 个点 build 一个金字塔,然后从中切出一个平面。我的问题是我不知道如何填充边。 points = np.array([[-1, -1, -1],
我需要创建金字塔 slider 。 正如您在我当前的实现中看到的那样,我需要有一个位于其余元素顶部的中心图像。它们形成金字塔结构。图像也被放置在彼此下面,这种效果打破了一切,因为我需要转换它们(中心图
我一直在玩我在这里找到的演示:http://codepen.io/singhiskng/pen/dqiGj 我正在尝试制作一个 4 边形金字塔。
在jsp中实现如图所示的金字塔, 代码如下: 大致思路如下: 1、先画出前5行。因为 i+空格数=总行数,所以第一行的空格数是 总行数-i(第几行),然后画出 *,*的数目=2*i-11;
我在尝试找出一种使用用户输入创建金字塔的方法时遇到了很大的麻烦。它应该是这样的。 Enter a number between 1 and 9: 4 O O O O OOOO OOOO OOOO OO
我一直在寻找解决厄运金字塔的办法。到目前为止,我得出的结论如下: router.use('/create', function(res,req,next) { try { v
我刚刚开始处理。因此,我想创建一个函数,允许任何用户输入边数来创建 3D 金字塔。我正在使用处理 3。我需要一些帮助。提前致谢。我编写了一段目前有效的代码,但我想概括它。任何建议/提示将不胜感激。提前
我使用 JavaScript 创建了一个金字塔以下是我迄今为止使用 for 循环尝试的代码: function showPyramid() { var rows = 5; var ou
我被告知数据库超时(连接、交互、等待)设置为 30 秒。该数据库上有一个网站,人们往往会闲置超过 30 秒。 使用sqlalchemy,我需要在继续查询之前检查mysql连接是否仍然有效,否则站点会出
另一个棘手的问题。你在这里看到的是我的物理金字塔,它由 3 个 LED 构成,在 1 个平面上形成一个三角形,另一个 LED 在中间中心,比其他 3 个高约 18 毫米。第 4 个使三角形成为金字塔。
目标: 我正在尝试生成类似于下面给出的格式的金字塔。这需要一个基本的 Java 程序来接受用户输入、将数字转换为字符串、使用嵌套循环并生成格式化输出。下面是使用 8 行的所需输出示例。 Enter t
我的数据是多维组合数据(所有维度总和为 1 或 100)。我已经学会了如何使用三个变量来创建二维三元图。 我想添加第四个维度,使我的情节看起来像这样。 我愿意使用 python 或 R。我现在正在使用
我的数据是多维组合数据(所有维度总和为 1 或 100)。我已经学会了如何使用三个变量来创建二维三元图。 我想添加第四个维度,使我的情节看起来像这样。 我愿意使用 python 或 R。我现在正在使用
我是一名优秀的程序员,十分优秀!