标签: glm-math

使用GLM正确旋转Open GL相机

我有一个相机类,它被初始化如下:

CameraFP::CameraFP()  {
    this->aspect_ratio = 800.0f / 600.0f;
    this->fov = 45.0f;
    this->near_plane = 0.1f;
    this->far_plane = 1000.0f;
    this->position = glm::vec3(0, 0, 0);
    this->target = position + glm::vec3(0, 0, -1);
    this->up = glm::vec3(0, 1, 0);
    this->m_rotation = glm::mat4(1.0);

    m_view = glm::lookAt(position, target, up);
    m_projection = glm::perspective(fov, aspect_ratio, near_plane, far_plane);
}
Run Code Online (Sandbox Code Playgroud)

以下是导入的其他功能:

void CameraFP::update(sf::Window *app)  {
    process_keyboard(app);
    process_mouse(app);

    calculate_view();
}

void CameraFP::process_keyboard(sf::Window *app)  {
    const sf::Input *input = &app->GetInput();

    up = m_rotation * glm::vec3(0, 1, 0);

    glm::vec3 forward = glm::vec3(0, 0, -1); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl camera matrix glm-math

6
推荐指数
1
解决办法
1万
查看次数

如何在 glm 中创建广告牌矩阵

如何使用 glm 从空间中的一点创建广告牌翻译矩阵?

opengl glsl glm-math

6
推荐指数
2
解决办法
2719
查看次数

用于Java的OpenGL数学(GLM)端口

是否有GLM库的 Java端口?我正在使用LWJGL而我错过了一些很好的GLM功能.

我在这个答案中看到了关于端口的提及,但我不知道如何联系写答案的人(stackoverflow上没有消息,没有可能在已关闭的问题上添加评论).

java opengl lwjgl glm-math

6
推荐指数
1
解决办法
3623
查看次数

为什么GLM构造函数都是显式的?

我已经开始在我的代码中使用GLM库.看起来很不错但我做不到这样的事情:

void foo (const glm :: vec3 & arg);

foo ({x, y, z});
Run Code Online (Sandbox Code Playgroud)

因为构造函数都是显式的.

这开始惹恼了我.我想不出有理由禁止隐含构造这种简单的值类型.作者是否盲目地遵循一些无关紧要的格言,或者他们知道我不知道的事情吗?

c++ glm-math

6
推荐指数
1
解决办法
2349
查看次数

如何将glm :: vec4 <float>转换为GLfloat*?

我想传递glm::vec4<float>gl::ImmediateMode::glColor4fv(GLfloat*):

std::vector<glm::vec4> colors;
colors.push_back(vec4(1.0f, 0.0f, 0.0f, 1.0f));
glColor4fv(colors[0]);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

error: not matching function call to 'ImmediateMode::glColor4fv(const vec4&) const'
[...]
candidate is: [...] void gl::ImmediateMode::glColor4fv(GLfloat*) const
Run Code Online (Sandbox Code Playgroud)

显然,我必须将我的glm :: vec4转换为GLfloat数组.我通读了GLSLanguage规范,但找不到任何直接访问数据的方法.以下尝试有效:

GLfloat *c = new GLfloat[4];
c[0] = colors[0].r;
c[1] = colors[0].g;
c[2] = colors[0].b;
c[3] = colors[0].a;
glColor4fv(c);
Run Code Online (Sandbox Code Playgroud)

但我宁愿使用更优雅的东西.那么有没有办法访问glm :: vec4中的数据数组以允许访问如下所示?

glColor4fv(reinterpret_cast<GLfloat*>(colors[0].data())); 
// .data() would hand me a pointer to the float array of the vec4
Run Code Online (Sandbox Code Playgroud)

c++ opengl glm-math

6
推荐指数
2
解决办法
7889
查看次数

FindGLM.cmake不在glm 0.9.7中,它是一种在CMAKE中查找库的弃用方法吗?

通过查看GLM 0.9.7的最新版本,我在任何地方都看不到FindGLM.cmake文件,过去常常在CMAKE中包含GLM.我总是可以使用在网上找到它的旧版本,但下面的提交让我难过:

https://github.com/g-truc/glm/commit/62a7daddcf082f754000fc5e42d7bcdf93c895f7

提交消息是"删除过时的FindGLM".那么,开发人员只是转储它还是实际上有一种在CMAKE中查找库的新方法?

cmake glm-math

6
推荐指数
1
解决办法
1979
查看次数

OpenGL精灵以低质量绘制

我正在尝试使用opengl glsl和glm库渲染一个精灵.当我使用glBegin在遗留管道中渲染精灵时,glEnd一切都很好但是当我使用着色器时,旋转精灵后它的绘制质量非常差,如图所示:

http://sm.uploads.im/t/I3lpf.png

我的渲染代码:

GLuint p;
GLuint vertex_shader, fragment_shader;
GLuint VBO, VAO;
glm::mat4 projection_matrix = glm::ortho(0.0F, 640.0F, 480.0F, 0.0F, -1.0F, 1.0F);

void sprite_init()
{
    p = glCreateProgram();

    // LOAD VERTEX SHADER //
    std::ifstream vf("E:\\vertex.sh");
    std::stringstream vs;
    vs << vf.rdbuf();

    std::ifstream ff("E:\\fraqment.sh");
    std::stringstream fs;
    fs << ff.rdbuf();

    vertex_shader = glCreateShader(GL_VERTEX_SHADER);
    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);

    char* buffer = new char[vs.str().size() + 1];
    memcpy(buffer, vs.str().c_str(), vs.str().size() + 1);
    glShaderSource(vertex_shader, 1, &buffer, NULL);
    free(buffer);

    buffer = new char[fs.str().size() + 1];
    memcpy(buffer, fs.str().c_str(), fs.str().size() + 1); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glsl glm-math

6
推荐指数
1
解决办法
155
查看次数

Assimp动画骨骼转换

最近我正在进行骨骼动画导入,所以我用一些IK技术制作了一个类似3D的类似Minecraft的模型来测试Assimp动画导入.输出格式是COLLADA(*.dae),我使用的工具是Blender.在编程方面,我的环境是opengl/glm/assimp.我认为这些信息对我的问题来说已经足够了.有一件事,模型的动画,我只是记录了7个不移动关键帧来测试assimp动画.

首先,我猜我的变换除了局部变换部分是正确的,所以让函数只返回glm::mat4(1.0f),结果显示绑定姿势(不确定)模型.(见下图)

其次,回头值glm::mat4(1.0f)bone->localTransform = transform * scaling * glm::mat4(1.0f);,那么模型变形.(见下图)

在搅拌机中测试图像和模型: 测试和起源 (bone->localTransform = glm::mat4(1.0f) * scaling * rotate;:这张图片在地下:()

这里的代码:

void MeshModel::UpdateAnimations(float time, std::vector<Bone*>& bones)
{
    for each (Bone* bone in bones)
    {
        glm::mat4 rotate = GetInterpolateRotation(time, bone->rotationKeys);
        glm::mat4 transform = GetInterpolateTransform(time, bone->transformKeys);
        glm::mat4 scaling = GetInterpolateScaling(time, bone->scalingKeys);
        //bone->localTransform = transform * scaling * glm::mat4(1.0f);
        //bone->localTransform = glm::mat4(1.0f) * scaling * rotate;
        //bone->localTransform = glm::translate(glm::mat4(1.0f), glm::vec3(0.5f));
        bone->localTransform = glm::mat4(1.0f);
    }
}

void MeshModel::UpdateBone(Bone * …
Run Code Online (Sandbox Code Playgroud)

opengl animation glm-math assimp

6
推荐指数
1
解决办法
1142
查看次数

Mac - OpenGL - 未找到 glew

基本上我试图弄清楚为什么编译器抱怨缺少 glew-library:

fatal error: 'GL/glew.h' file not found
Run Code Online (Sandbox Code Playgroud)

我的设置:

酿造清单:

glew
glfw
glm
Run Code Online (Sandbox Code Playgroud)

在 /usr/local/include 目录中:

GL -> ../Cellar/glew/2.0.0/include/GL
GLFW -> ../Cellar/glfw/3.2.1/include/GLFW
glm -> ../Cellar/glm/0.9.8.3/include/glm
Run Code Online (Sandbox Code Playgroud)

和生成文件:

# OBJS specifies which files to compile as part of the project
OBJS = *.cpp

# CC specifies which compiler we're using
CC = g++

# INCLUDE_PATHS specifies the additional include paths we'll need
INCLUDE_PATHS = -I/usr/local/include -I/opt/X11/include

# LIBRARY_PATHS specifies the additional library paths we'll need
LIBRARY_PATHS = -L/usr/local/lib -I/opt/X11/lib

# COMPILER_FLAGS specifies …
Run Code Online (Sandbox Code Playgroud)

opengl glew makefile glfw glm-math

6
推荐指数
1
解决办法
1万
查看次数

关于glm四元数旋转

我想通过四元数进行一些旋转。

glm 库在这方面做得很好。

以下是我的代码:

vec3 v(0.0f, 0.0f, 1.0f);
float deg = 45.0f * 0.5f;
quat q(glm::cos(glm::radians(deg)), 0, glm::sin(glm::radians(deg)), 0);
vec3 newv = q*v;
printf("v %f %f %f \n", newv[0], newv[1], newv[2]);
Run Code Online (Sandbox Code Playgroud)

我的问题是,在许多文章中,四元数旋转的公式是

rotated_v = q*v*q_conj
Run Code Online (Sandbox Code Playgroud)

有点奇怪。在glm中,向量“v”只需乘以四元数“q”就可以进行旋转。

这让我很困惑。

opengl quaternions glm-math

6
推荐指数
1
解决办法
7981
查看次数

标签 统计

glm-math ×10

opengl ×8

c++ ×4

glsl ×2

animation ×1

assimp ×1

camera ×1

cmake ×1

glew ×1

glfw ×1

java ×1

lwjgl ×1

makefile ×1

matrix ×1

quaternions ×1