我正在学习OpenGL来学习OpenGL,在这个教程中他们使用glm::lookAt()函数来构建视图,但是我无法理解它的工作情况glm::lookAt(),显然,没有详细的GLM文档.谁能帮我理解参数和工作glm::lookAt()吗?
GLM文档说:
detail::tmat4x4<T> glm::gtc::matrix_transform::lookAt
(
detail::tvec3< T > const & eye,
detail::tvec3< T > const & center,
detail::tvec3< T > const & up
)
Run Code Online (Sandbox Code Playgroud)
我目前的理解是相机位于eye并面向center.(我不知道是什么up)
我有一个小的obj加载器,它需要两个参数并将它们传递回输入变量..但这是我第一次这样做,我不知道如何打印所述值现在.这是我测试加载器是否正常工作的主要功能.我有两个类型的向量glm::vec3来保存顶点和普通数据.
std::vector<glm::vec3> vertices;
std::vector<glm::vec3> normals;
int main() {
bool test = loadOBJ("cube.obj", vertices, normals);
for (int i = 0; i < vertices.size(); i++) {
std::cout << vertices[i] << std::endl; // problem line
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面评论的那条线是产生无用信息的原因.如果我这样离开并运行该程序,我会收到一堆错误(对于我来说太未格式化并且很长时间粘贴),如果我添加引用运算符,我会得到如下输出:
0x711ea0
0x711eac
0x711eb8
0x711ec4 // etc
Run Code Online (Sandbox Code Playgroud)
知道我做错了什么吗?
我正在使用OpenGL数学库(glm.g-truc.net),并希望glm::mat4使用float-array 初始化a .
float aaa[16];
glm::mat4 bbb(aaa);
Run Code Online (Sandbox Code Playgroud)
这不起作用.
我想这个解决方案很简单,但我不知道怎么做.我找不到关于glm的好文档.我会很感激一些有用的链接.
我试图了解以下代码的作用:
glm::mat4 Projection = glm::perspective(35.0f, 1.0f, 0.1f, 100.0f);
Run Code Online (Sandbox Code Playgroud)
它是否创建了投影矩阵?剪掉不在用户视图中的任何内容?我无法在API页面上找到任何内容,我在他们网站上的pdf中唯一能找到的是:
gluPerspective:
glm::mat4 perspective(float fovy, float aspect, float zNear,
float zFar);
glm::dmat4 perspective(
double fovy, double aspect, double zNear,
double zFar);
From GLM_GTC_matrix_transform extension: <glm/gtc/matrix_transform.hpp>
Run Code Online (Sandbox Code Playgroud)
但它没有解释参数.也许我错过了什么.
我对从左到右和从右到左的相关性的定义感到困惑.我也看到他们被称为左关联和右关联,并想知道哪个对应哪个.
我知道它与执行具有相同优先级的操作的顺序有关,如a = x*y*z是指a = x*(y*z)还是a =(x*y)*z.我不知道哪一个是从左到右的关联,哪个是从右到左的关联.
我已经尝试了谷歌它,但我能找到的是不同运算符在c ++中的相关性的表格.看看所有的例子让我更加困惑.
让我更进一步困惑的是:
glm::vec4 transformedVector = translationMatrix * rotationMatrix * scaleMatrix * originalVector;
Run Code Online (Sandbox Code Playgroud)
首先预先形成缩放矩阵乘法,然后是旋转矩阵,然后是平移.在这个例子中,矩阵都是glm :: mat4类型,向量是glm :: vec4类型.这是从左到右还是从右到左的关联性?这与正常乘法相同还是glm类型的乘法不同?
我有一个变换矩阵m,和一个向量,v.我想使用矩阵对矢量进行线性变换.我希望我能做到这样的事情:
glm::mat4 m(1.0);
glm::vec4 v(1.0);
glm::vec4 result = v * m;
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.在GLM中进行此类操作的正确方法是什么?
只是给遇到类似问题的人留言.GLM要求所有操作数使用相同的类型.不要试图乘以dvec4与mat4和期望它的工作,你需要一个vec4.
我正在尝试设置着色器制服的功能,但是当我尝试编译它时,我收到此错误:
错误2错误C2719:'value':带__declspec的形式参数(align('16'))将不对齐
这是功能代码:
void Shader::setUniform(std::string name, const glm::mat4 value){
GLint uniform = glGetUniformLocation(m_program, name.c_str());
glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat*)&value);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Visual Studio 2013.
如何将a转换glm::vec4为glm::vec3?
只有x,y,z须─该w组件可以被丢弃.
在GLSL中,可以使用.xyz[1] 来完成,但在glm中,这会导致编译错误:
error: 'glm::vec4' has no member named 'xyz'
Run Code Online (Sandbox Code Playgroud)
[1] http://en.wikibooks.org/wiki/GLSL_Programming/Vector_and_Matrix_Operations#Components
我最近认为从OpenGL提供的旧(已弃用)功能切换是一个好主意,例如矩阵运算和固定功能管道.
我使用GLM作为我的矩阵库来简化一些事情.问题是它可能导致了比简化更多的问题......
透视投影与我的着色器和设置工作正常,但当我尝试切换到正交时,一切都崩溃了.我的观点和简单的四边形不会显示.当我使用旧的OpenGL矩阵时,事情又开始了.
我把它缩小到投影矩阵.以下是我的称呼方式:
glm::mat4 projMat = glm::ortho( 0, 400, 0, 400, -1, 1 );
Run Code Online (Sandbox Code Playgroud)
我把它与opengl提供的那个进行比较一旦被称为"
glOrtho( 0, 400, 0, 400, -1, 1 );
Run Code Online (Sandbox Code Playgroud)
唯一的区别是[0] [0]元素和[1] [1]元素(据我所知,它们分别等于"2 /宽度"和"2 /高度").从OpenGL矩阵中,值就是这样!但是在glm矩阵上,值为0.
在我调用glm :: ortho后,我手动切换了glm矩阵中的值,一切都恢复了!
所以我的问题是:glm :: ortho()函数真的坏了,还是我只是用错了?
我在看vec4glm的源代码实现,我想知道为什么它们用union表示向量值,而不是像float或等原始数据类型int?
这是我在vec4实现中找到的代码:
union { T x, r, s; };
union { T y, g, t; };
union { T z, b, p; };
union { T w, a, q; };
Run Code Online (Sandbox Code Playgroud)
是什么,如果我们只是写的区别T x,T y,T z,T w?