我在opengl中制作了一个android项目,它使用加速计来计算特定轴的变化,我的目标是旋转我的类似航天器的物体的运动矢量.问题是我无法理解旋转矩阵背后的数学.默认运动矢量为0,1,0,表示+ y,因此对象在开头向上看.而我正在尝试旋转它的运动矢量,这样我就可以移动它所指向的物体.我可以在手机中收集旋转变化.x轴:旋转[0],y轴:旋转[1],z轴:旋转[2].如何使用旋转矩阵旋转运动矢量?
首先,我必须问哪个国家哪个最好?例如,实时MMORPG服务器.如果我为每个客户端创建一个线程而不是使用非阻塞套接字怎么办?或者如果我使用一个包含所有非阻塞套接字的线程怎么办?你能解释一下这些优点吗?
感谢C++ 11,在与boost的长期关系之后,让我依赖它的最后一个组件是文件系统.根据链接:文件系统库, std :: filesystem似乎是实验性的
由于它模仿boost :: filesystem,我可以轻松地将我的项目调整为std并摆脱巨大的boost依赖.哪些编译器支持它并且使用它是否重要,即使它是实验性的,因为它模仿提升(因为它没有时间表来标准化)?
我已经使用glsl成功实现了一个cel着色器.但我的问题是关于概述所有内容,互联网上每个opengl的例子都很旧,与现有技术不匹配,所以技术速度慢......所以我无论如何都无法在glsl中找到它.我想到了一些想法,比如将最不密集的区域着色为黑色,但是对于gl_Vertex,gl_Position和眼睛位置甚至没有足够的解释.所以,由于每种技术都太老了,我终于决定向某人询问这个大纲问题.
我实现了一个带有软件皮肤的MD5 Loader.md5中的绑定姿势是最终的,绝对位置和旋转,你只需要对关节相关的权重进行计算.
我试图实现GPU皮肤,但我陷入了困境.由于这些坐标是最终的,为什么我不能将我的3d矢量和四元数转换为矩阵并将其上传到着色器?正如我在这里读到的:http://3dgep.com/?p = 1356,我需要将我的骨架与绑定姿势的倒数相乘.但我不明白这一部分,因为我一直认为我唯一需要做的就是将最终矩阵上传到GPU并计算其余部分(权重总和等等)
你能解释一下逆绑定姿势的行为吗?
我试图在OOP中为VBO编写一个包装器,它包含addVertex,addNormal .. addX,flush()和render()函数.首先,我在不同的向量中保存顶点,法线,索引,如:
std::vector<glm::vec4> vertexBuffer;
std::vector<glm::vec4> colorBuffer;
std::vector<glm::vec3> normalBuffer;
std::vector<glm::vec2> texCoordBuffer;
std::vector<unsigned int> indexBuffer;
Run Code Online (Sandbox Code Playgroud)
但是当我在某处读到时,为每个人保存不同的VBO ID是完全没有效率的,因此最好按照VertexNormalTexCoordColor - VNTC - VNTC ...的顺序打包它们,并将它们表示在一个VBO ID中.因此,上传到GPU时可以有效地使用缓冲区.所以这次我仍然将它们保存在向量中但是当我调用flush()时我想用结构包装它们,然后将该结构向量上传到GPU:
struct VBOData {
glm::vec4 vert;
glm::vec3 normal;
glm::vec4 color;
glm::vec2 texcoord;
};
std::vector<VBOData> vboBuffer;
Run Code Online (Sandbox Code Playgroud)
然后我上传flush()中的所有内容:
vboBuffer.reserve(vertexBuffer.size());
for (int i = 0; i < vertexBuffer.size(); ++i) {
VBOData data;
data.vert = vertexBuffer[i];
data.color = colorBuffer[i];
data.normal = normalBuffer[i];
data.texcoord = texCoordBuffer[i];
vboBuffer.push_back(data);
}
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vboBuffer.size() * sizeof(VBOData), (GLchar*) &vboBuffer[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
现在有这个问题,如果我的对象不包含颜色,法线或tex坐标并且只包含顶点怎么办?或者只关于顶点和法线?或者总是有顶点的不同数据组合?为了提高效率,我能否以V(N)(T)(C)顺序动态打包它们?
由于设计薄弱,我不得不重写我的整数数学库和与数学相关的事情.相反,我发现我可以使用GLM.如果你遇到我之前的问题,我一直在处理骨骼动画,所以我必须上传大量的mat4s,vec3,vec2s.这是我之前的顶点结构:
struct Vertex {
Vec3 pos;
Vec3 normal;
Vec2 uv;
Vec4 boneindex;
Vec4 weightbias;
};
Run Code Online (Sandbox Code Playgroud)
不幸的是我发现我的数学库不是POD,我试图上传整个结构,我确实得到了奇怪的结果.我的最终骨骼矩阵定义为:
Mat4 bones[numBones];
Run Code Online (Sandbox Code Playgroud)
我也尝试立即上传.
我只是想知道如果我用glm :: vec3,vec2,mat4替换我的Vec3s,Vec2s和Mat4s并直接上传整个Vertex结构(顶点次数)并使用以下方法为每个数据设置偏移量:
glBindBuffer(GL_ARRAY_BUFFER,everythingVBO);
glVertexAttribPointer(xx,xx,xx,xx, BUFFER_OFFSET(0)) // pos
glVertexAttribPointer(xx,xx,xx,xx, BUFFER_OFFSET(sizeof(glm::vec3)) // norm
..
..
same for matrix
glUniformMatrix4fv(xx, numBones, xx, glm::mat4 value)
Run Code Online (Sandbox Code Playgroud)
.
它会按预期工作吗?我只是不想重写整件事,这次我必须确保它有效,因为我不想再次面对另一个失败.
骨骼重量,骨骼影响,关节,偏移和局部矩阵用于什么?互联网上没有一篇文章可以很好地解释逻辑.我仍然不知道每个骨骼是否有一个不同的模型,后来与其他模型相结合.或者如何处理这些矩阵,如何设置骨骼,组合和修饰它们......如果你能在opengl中分享任何关于骨骼动画的文章或知识,我将很高兴.
我已经阅读了几个关于OpenGL骨架动画的教程,它们似乎都是单一的使用四元数进行旋转,3d矢量进行翻译,所以不是矩阵.
但是当它们进入顶点蒙皮过程时,它们将所有四元数和三维矢量组合成一个4x4矩阵,并上传矩阵以在着色器中执行其余的计算.4x4矩阵有16个元素,而四元数+ 3d向量只有7个.那么为什么我们要在上传之前将它们转换为4x4矩阵?
有人可以解释为什么我应该使用strstr或字符串find()?哪一个更快,在哪里?
在CMake中,有没有办法制作内置的Find脚本来确定我们指定的自定义目录的优先级?因为特别是在Windows中,模块查找脚本通常无法检测模块,例如visual studio目录.因此,我通常必须手动设置外部库的路径,这是非常累人的.相反,我希望这些脚本能够查看自定义目录,首先让我们在主项目中说"dependencies"文件夹,以便我可以直接将这些外部文件放在该文件夹中,这比将它们放入VC文件夹或手动设置更容易.路径.
我有一个4x4矩阵类,它将值保存为2d float array:float mat [4] [4]; 我重载了[]运算符
inline float *Matrix4::operator[](int row)
{
return mat[row];
}
我的着色器中有一个统一的mat4(统一的mat4 Bones [64];),我将上传我的数据.我将骨骼保存为Matrix4指针(Matrix4*finalBones),这是一个包含numJoints元素的矩阵数组.这就是我用来上传数据的方法:
glUniformMatrix4fv(shader.getLocation("Bones"),numJoints,false,finalBones[0][0]);
Run Code Online (Sandbox Code Playgroud)
我完全不确定将要发生什么,所以我需要问,如果这将起作用或我需要将所有内容提取到16*numJoints大小的浮点数组中,这对于每个tick来说似乎都很昂贵.
编辑这就是我所做的,每次绘制操作看起来都很贵
void MD5Loader::uploadToGPU()
{
float* finalmat=new float[16*numJoints];
for (int i=0; i < numJoints; i++)
for (int j=0; j < 4; j++)
for(int k=0; k < 4; k++)
finalmat[16*i + j*4 + k] = finalBones[i][j][k];
glUniformMatrix4fv(shader.getLocation("Bones"),numJoints,false,finalmat);
delete[] finalmat;
}
Run Code Online (Sandbox Code Playgroud) 我在 glBufferData 有随机崩溃,它只发生在 Windows 上。Mac OS 和 Linux 没有问题。那是我的上传功能,它将我保存在内存中的所有内容上传到 GPU。vertex是一个浮点向量数组,它是:
std::vector<float> vertex[MAX_VBO];
Run Code Online (Sandbox Code Playgroud)
并且代码在第一个 glBufferData 函数处随机崩溃,我调用它是随机的,因为它有时可以工作,但是当我的顶点数据很大时,它几乎肯定会崩溃。
void VertexBuffer::upload() {
glGenBuffers(5, vbo);
printf("VBO %d - %d - %d\n", vertex[vboPosition].size(), vertex[vboNormal].size(), indices.size());
if (vertex[vboPosition].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboPosition]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboPosition].size() * sizeof(float)*4, &vertex[vboPosition][0], GL_STATIC_DRAW);
}
if (vertex[vboNormal].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboNormal]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboNormal].size() * sizeof(float)*3, &vertex[vboNormal][0], GL_STATIC_DRAW);
}
if (vertex[vboColor].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboColor]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboColor].size() * sizeof(float)*4, &vertex[vboColor][0], GL_STATIC_DRAW);
}
if (vertex[vboUV].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboUV]); …Run Code Online (Sandbox Code Playgroud)