- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须为上大学做功课(用 OpenGL 画一只蝴蝶)。目前我正在研究蝴蝶的 body ,这是一个简单的椭圆(这将是一个 2D 游戏)。我必须用三角形绘制这个填充的椭圆,因为我们不能使用其他库(我假设有一个简单的 Circle() 或类似的函数)。
现在我可以画一个三角形了,但是从蝴蝶的 body 类创建一个三角形是行不通的。这是代码:
class Triangle {
unsigned int vao;
unsigned int vbo[2];
float phi;
float vertexCoords[6];
float vertexColors[9] = {1,0,0, 0,1,0, 0,0,1};
public:
Triangle(float x1,float y1,float x2,float y2,float x3, float y3) {
vertexCoords[0] = x1;
vertexCoords[1] = y1;
vertexCoords[2] = x2;
vertexCoords[3] = y2;
vertexCoords[4] = x3;
vertexCoords[5] = y3;
Animate(0);
}
void setTriangleColor(float r, float g, float b) {
for (int i = 0; i < 9; i+=3) {
vertexColors[i] = r;
vertexColors[i + 1] = g;
vertexColors[i + 2] = b;
}
Create();
}
void setPointColor(float r, float g, float b, int count) {
vertexColors[count * 3] = r;
vertexColors[count * 3 + 1] = g;
vertexColors[count * 3 + 2] = b;
Create();
}
void Create() {
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(2, &vbo[0]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertexCoords),vertexCoords,GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,2, GL_FLOAT,GL_FALSE,0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexColors), vertexColors, GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
}
void Animate(float t) { /*phi = t;*/ phi = 0; }
void Draw() {
mat4 ScaleSmaller(
0.01, 0 , 0 , 0,
0 , 0.01 , 0 , 0,
0 , 0 , 0.01 , 0,
0 , 0 , 0 , 1
);
mat4 MVPTransform1(1, 0, 0, 0,
0, cosf(phi), -sinf(phi), 0,
0, sinf(phi), cosf(phi), 0,
0, 0, 0, 1);
int location = glGetUniformLocation(shaderProgram, "MVP");
if (location >= 0) glUniformMatrix4fv(location, 1, GL_TRUE, (MVPTransform1*ScaleSmaller));
else printf("uniform MVP cannot be set\n");
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
};
struct Point {
float x, y;
Point(float x,float y):x(x),y(y){}
Point():x(0),y(0){}
};
class MyEllipse {
float width;
float height;
Point origo;
std::vector<Triangle> triangles = std::vector<Triangle>();
public:
MyEllipse() {}
MyEllipse(Point origo,float width, float height):origo(origo),width(width),height(height) {
float px = origo.x + (width / 2) * cosf(90);
float py = origo.y + (height / 2) * cosf(90);
float prevX = origo.x + (width / 2) * cosf(0);
float prevY = origo.y + (height / 2) * cosf(0);
Triangle elem1(origo.x, origo.y, px, py, prevX, prevY);
triangles.push_back(elem1);
}
void Create() {
for (Triangle value : triangles) {
value.Create();
}
}
void Draw() {
for (Triangle value : triangles) {
value.Draw();
}
}
};
在代码中,我在同一位置创建了一个具有相同参数的三角形和一个 MyEllipse。
float px = 10 + (50 / 2) * cosf(90);
float py = 10 + (50 / 2) * cosf(90);
float prevX = 10 + (50 / 2) * cosf(0);
float prevY = 10 + (50 / 2) * cosf(0);
Triangle triangle(10, 0, px, py, prevX, prevY);
MyEllipse test1 = MyEllipse(Point(10, 0), 50, 50);
(稍后我将向 vector 添加更多三角形,现在我只是在测试。)问题是我可以看到三角形,但是如果删除三角形创建线,我什么也看不到.我没有忘记在代码的另一部分添加适当的 Draw() 和 Create() 函数调用,当我调用 triangle.Create() 或 triangle.Draw() 时,我会立即调用 test1。 Create() 和 test1.Draw() 函数。
任何人都可以告诉我关于这个问题的任何信息,因为恐怕我不知道如何解决这个问题。
最佳答案
在方法 MyEllipse::Create
和 MyEllipse::Draw
中,迭代三角形时会创建每个三角形的拷贝:
for (Triangle value : triangles) // <- the "content" of "triangles" is copied to "value"
{
value.Create();
}
您必须使用对容器中三角形的引用
for (Triangle &value : triangles) {
.....
}
进一步cos
, cosf
, cosl
计算 arg 的余弦,以弧度为单位。
这意味着你必须使用
#define _USE_MATH_DEFINES
#include <math.h>
float angle_in_degree = ....;
cosf(angle_in_degree * M_PI/180.0f);
如果看不到三角形,那么可能就是这种情况,因为三角形的 2 个点几乎完全相同。更改多边形模式,绘制线而不是多边形(仅用于调试原因):
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
glDrawArrays(GL_TRIANGLES, 0, 3);
但是为每个三角形创建单独的顶点缓冲区和顶点数组对象是一个非常糟糕的主意。为网格创建一个顶点缓冲区和一个顶点数组对象。
我建议像这样创建顶点缓冲区和顶点数组对象:
float a = 0.2f;
float b = 0.5f;
int no_of_triangles = 20;
std::vector<float> varray{ 0.0f, 0.0f, 0.5f, 0.5f, 0.5f };
for ( int i = 0; i <= no_of_triangles; ++i )
{
float angle = (float)i/(float)no_of_triangles * 2.0f * M_PI;
float x = cos( angle );
float y = sin( angle );
varray.push_back( x * a );
varray.push_back( y * b );
varray.push_back( 0.5f - x * 0.5f );
varray.push_back( 0.5f - y * 0.5f );
varray.push_back( (0.5f*x+0.5f)*(0.5f*y+0.5f) );
}
GLuint vbo;
glGenBuffers( 1, &vbo );
glBindBuffer( GL_ARRAY_BUFFER, vbo );
glBufferData( GL_ARRAY_BUFFER, varray.size()*sizeof(*varray.data()), varray.data(), GL_STATIC_DRAW );
GLuint vao;
glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );
glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 5*sizeof(*varray.data()), 0 );
glEnableVertexAttribArray( 0 );
glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 5*sizeof(*varray.data()), (void*)(2*sizeof(*varray.data())) );
glEnableVertexAttribArray( 1 );
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glBindVertexArray( 0 );
由于顶点缓冲区包含中心点和椭圆周围点的列表,因此可以通过图元类型 GL_TRIANGLE_FAN
绘制网格:
glBindVertexArray( vao );
glDrawArrays( GL_TRIANGLE_FAN, 0, (GLsizei)varray.size()/5 );
glBindVertexArray( 0 );
预览:
关于c++ - 使用 openGL (c++) 将椭圆分解为三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49208552/
我正在尝试在 R 中计算任意 N x J 矩阵 S 的投影矩阵 P: P = S (S'S) ^ -1 S' 我一直在尝试使用以下函数来执行此操作: P 概述 solve 基于一般方阵的 LU 分解
所以我有一个包含数千行的非常旧的文件(我猜是手工生成的),我正试图将它们移动到一个 rdb 中,但是这些行没有转换为列的格式/模式。例如,文件中的行如下所示: blah blahsdfas
这实际上只是一个“最佳实践”问题...... 我发现在开发应用程序时,我经常会得到很多 View 。 将这些 View 分解为几个 View 文件是常见的做法吗?换句话说......而不只是有view
使用以下函数foo()作为简单示例,如果可能的话,我想将...中给出的值分配给两个不同的函数。 foo args(mapply) function (FUN, ..., MoreArgs = NUL
正面案例:可以进入列表 groovy> println GroovySystem.version groovy> final data1 = [[99,2] , [100,4]] groovy> d
省略素数计算方法和因式分解方法的详细信息。 为什么要进行因式分解? 它的应用是什么? 最佳答案 哇,这个线程里有这么多争斗。 具有讽刺意味的是,这个问题有一个主要的有效答案。 因式分解实际上在加密/解
术语“分解不良”和“重构”程序是什么意思?你能举一个简单的例子来理解基本的区别吗? 最佳答案 重构是一种通用技术,可以指代许多任务。它通常意味着清理代码、去除冗余、提高代码质量和可读性。 分解不良代码
我以前有,here ,表明 C++ 函数不容易在汇编中表示。现在我有兴趣以一种或另一种方式阅读它们,因为 Callgrind 是 Valgrind 的一部分,在组装时显示它们已损坏。 所以我想要么破坏
最初,我一直在打开并同时阅读两个文件,内容如下: with open(file1, 'r') as R1: with open(file2, 'r') as R2: ### m
我正在尝试摆脱 标签和标签内的内容使用 beatifulsoup。我去看了文档,似乎是一个非常简单的调用函数。有关该功能的更多信息是 here .这是我到目前为止解析的 html 页面的内容...
给定一个 float ,我想将它分成几个部分的总和,每个部分都有给定的位数。例如,给定 3.1415926535 并要求将其分成以 10 为基数的部分,每部分 4 位数字,它将返回 3.141 + 5
我的 JSF 项目被部署为一个 EAR 文件。它还包括一些 war 文件。我需要 EAR 的分解版本(包括分解的内部 WAR)。 有什么工具可以做到吗? 最佳答案 以编程方式还是手动? EAR 和 W
以下函数不使用行透视进行 LU 分解。 R 中是否有一个现有的函数可以使用行数据进行 LU 分解? > require(Matrix) > expand(lu(matrix(rnorm(16),4,4
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 7年前关闭。 Improve this
我正在使用登记数据进行病假研究。从登记册上,我只得到了每个人的病假开始日期和结束日期。但日期并没有逐年分割。例如,对于人 A,只有开始日期 (1-may-2016) 和结束日期 (14-feb-201
我发现以下 R 代码使用 qr 因式分解无法恢复原始矩阵。我不明白为什么。 a <- matrix(runif(180),ncol=6) a[,c(2,4)] <- 0 b <- qr(a) d <-
我正在尝试检测气候数据时间序列中的异常值,其中一些缺失的观测值。在网上搜索我发现了许多可用的方法。其中,STL 分解似乎很有吸引力,因为它去除了趋势和季节性成分并研究了其余部分。阅读 STL: A S
我想使用 javascript 分解数组中的 VIN,可能使用正则表达式,然后使用某种循环... 以下是读取 VIN 的方法: http://forum.cardekho.com/topic/600-
我正在研究 Databricks 示例。数据框的架构如下所示: > parquetDF.printSchema root |-- department: struct (nullable = true
我正在尝试简化我的代码并将其分解为多个文件。例如,我设法做到了: socket.once("disconnect", disconnectSocket); 然后有一个名为 disconnectSock
我是一名优秀的程序员,十分优秀!