标签: glm-math

为什么glm :: vec将vec值表示为联合?

我在看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

c++ glm-math

14
推荐指数
2
解决办法
1116
查看次数

glm在Opengl中旋转使用

我正在渲染一个圆锥体,我想将它旋转,逆时针旋转90度,这样尖端朝西!我正在使用OpenGL 3+.

到目前为止,这是我在Cone.cpp中的代码:

//PROJECTION
    glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);

    //VIEW
    glm::mat4 View = glm::mat4(1.);
    View = glm::translate(View, glm::vec3(2.0f,4.0f, -25.0f));

    //MODEL
    glm::mat4 Model = glm::mat4(1.0);
    //Scale by factor 0.5
    Model = glm::scale(glm::mat4(1.0f),glm::vec3(0.5f));

    glm::mat4 MVP = Projection * View * Model;
    glUniformMatrix4fv(glGetUniformLocation(shaderprogram_spaceship, "MVP_matrix"), 1, GL_FALSE, glm::value_ptr(MVP));

    glClearColor(0.0, 0.0, 0.0, 1.0);

    glDrawArrays(GL_LINE_STRIP, start_cone, end_cone );
Run Code Online (Sandbox Code Playgroud)

并非所有代码都显示出来.

有人可以指导我完成轮换吗?我必须将View矩阵相乘吗?用"glm旋转"功能?

c++ opengl glm-math

13
推荐指数
3
解决办法
9万
查看次数

四元数 - >欧拉角 - >旋转矩阵故障(GLM)

我正在编写一个程序来加载包含场景描述的文件,然后使用OpenGL显示它.我正在使用GLM进行所有数学运算.场景文件中的旋转以四元数格式存储.我的场景管理系统以欧拉角的形式对物体进行旋转,然后在绘制时将这些角度转换为旋转矩阵.

因此,我的加载过程采用四元数旋转,将它们转换为欧拉角以存储在我的对象类中,然后将这些欧拉角转换为旋转矩阵以进行绘制.我正在使用glm :: eulerAngles和glm :: eulerAngleYXZ函数来执行这两个操作.

但是,我的结果不正确.例如,如果我理解正确,四元数{0.500 -0.500 0.500 0.500}(即WXYZ)应该描述从+ Z轴到+ Y轴的箭头旋转.但是,当我运行程序时,我得到的箭头指向+ X轴.

我认为我对四元数的理解存在一些缺陷,但我可以跳过中间的欧拉角形式来得到我预期的结果.通过使用glm :: toMat4将四元数直接转换为旋转矩阵,我得到一个将我的+ Z箭头指向+ Y的旋转.

考虑到两种方法看起来既简单又正确,我无法协调这两种不同的输出.为了简化我的问题,为什么这两个看似等效的方法会产生不同的结果:

glm::quat q(.5, -.5, .5, .5);
glm::vec3 euler = glm::eulerAngles(q) * 3.14159f / 180.f; // eulerAngleYXZ takes radians but eulerAngles returns degrees
glm::mat4 transform1 = glm::eulerAngleYXZ(euler.y, euler.x, euler.z);
// transform1 rotates a +Z arrow so that it points at +X

glm::quat q(.5, -.5, .5, .5);
glm::mat4 transform2 = glm::toMat4(q);
// transform2 rotates a +Z arrow so that it points at +Y
Run Code Online (Sandbox Code Playgroud)

c++ math quaternions euler-angles glm-math

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

麻烦包括/使用GLM库

我在c ++项目中正确地包含/使用glm数学库(http://glm.g-truc.net/)时遇到了麻烦.由于glm是一个"仅标题"库,我想我可以用这一行包含它:

#include "glm/glm.hpp"
Run Code Online (Sandbox Code Playgroud)

起初这似乎是有效的,因为我可以创建和使用矩阵和向量.但是,当我尝试使用该glm::translate(...)函数时,我收到此错误:

error: ‘translate’ is not a member of ‘glm’
Run Code Online (Sandbox Code Playgroud)

在GLM网站上,他们建议包含带三角括号的库,如下所示:

#include <glm/glm.hpp>
Run Code Online (Sandbox Code Playgroud)

...但是考虑到它在项目目录结构中,认为我可以以其他方式包含它是不正确的?

我已经设置了下面的测试来说明我遇到的问题.该glm文件夹位于testglm.cpp文件旁边.

#include <iostream>

#include "glm/glm.hpp"

using namespace std;

int main(void) {

    // works:
    glm::mat4 testMatrix1 = glm::mat4(5.0f) * glm::mat4(2.0f);

    cout << testMatrix1[0][0] << endl; // output: 10

    // doesn't work - (error: ‘translate’ is not a member of ‘glm’):
    glm::mat4 testMatrix2 = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f));

}
Run Code Online (Sandbox Code Playgroud)

我正在使用来自终端的这个构建命令在osx上构建此测试:

g++ -o bin/glm_test src/testglm.cpp
Run Code Online (Sandbox Code Playgroud)

我不确定我的问题是否与我如何包括库,我如何使用它,或者我是如何构建项目有关.谷歌没有给我任何关于该错误消息的点击,所以我想知道我是否做了一些根本错误的事情.建议将不胜感激.谢谢.

c++ glm-math

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

如何使用SSE或GLSL优化"u [0]*v [0] + u [2]*v [2]"代码行

我有以下功能(来自开源项目"重新导航"):

/// Derives the dot product of two vectors on the xz-plane. (@p u . @p v)
///  @param[in]     u       A vector [(x, y, z)]
///  @param[in]     v       A vector [(x, y, z)]
/// @return The dot product on the xz-plane.
///
/// The vectors are projected onto the xz-plane, so the y-values are ignored.
inline float dtVdot2D(const float* u, const float* v)
{
    return u[0]*v[0] + u[2]*v[2];
}
Run Code Online (Sandbox Code Playgroud)

我通过VS2010 CPU性能测试运行它,它告诉我,在所有重铸代码库中,此功能的代码行u[0]*v[0] + u[2]*v[2]是最热的CPU.

如何进行CPU优化(例如通过SSE或GLSL,如GLM(如果它更容易或更快,在这种情况下更合适)这一行? …

c c++ optimization sse glm-math

10
推荐指数
1
解决办法
1528
查看次数

OpenGL的GLM库是否没有幅度函数?

我是新手使用GLM库,但看起来它没有幅度函数.它是否正确?如果是这样,那么推理是什么?

c++ opengl glm-math

10
推荐指数
1
解决办法
9843
查看次数

如何通过glm :: mat4转换glm :: vec3

我想通过glm :: mat4(camera.rotationMatrix)转换glm :: vec3(camera.target).我尝试乘以这给我一个错误:错误:'originalTarget*((Camera*)this中的'operator*'不匹配 - > Camera :: rotationMatrix'.我想我不能乘以vec3*mat4.GLM有一些功能可以改变它吗?其他方式进行转换?

代码:

void Camera::Update(void)
{
// Aplicamos la rotacion sobre el target
glm::vec3 originalTarget = target;
glm::vec3 rotatedTarget = originalTarget * rotationMatrix;

// Aplicamos la rotacion sobre el Up
glm::vec3 originalUp = up;
glm::vec3 rotatedUp = originalUp * rotationMatrix;

// Establecemos las matrices de vista y proyeccion
view = lookAt(
position, //eye
rotatedTarget, //direction
rotatedUp //up
);
projection = perspective(
FOV,
(float) getParent()->getEngine()->GetCurrentWidth() / getParent()->getEngine()->GetCurrentWidth() ,
near_plane,
far_plane);
} 
Run Code Online (Sandbox Code Playgroud)

opengl transform glm-math

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

如何在3dsMax中实现摄像头平移?

实现3ds max中使用的摄像机平移效果有哪些必要的数学运算?

在3ds max中,光标和网格之间的距离在整个移动过程中始终保持相同(mouse_down + mouse_motion + mouse_up).

我的天真和失败的尝试一直试图通过使用dt(帧时间)乘以一些硬编码常量在平面XY上移动相机,结果真的很丑陋和不直观.

我到目前为止的代码是:

def glut_mouse(self, button, state, x, y):
    self.last_mouse_pos = vec2(x, y)
    self.mouse_down_pos = vec2(x, y)

def glut_motion(self, x, y):
    pos = vec2(x, y)
    move = self.last_mouse_pos - pos
    self.last_mouse_pos = pos
    self.pan(move)

def pan(self, delta):
    forward = vec3.normalize(self.target - self.eye)
    right = vec3.normalize(vec3.cross(forward, self.up))
    up = vec3.normalize(vec3.cross(forward, right))

    if delta.x:
        right = right*delta.x
    if delta.y:
        up = up*delta.y

    self.eye+=(right+up)
    self.target+=(right+up)
Run Code Online (Sandbox Code Playgroud)

你能解释一下3dsmax中摄像机平移的数学运算方式吗?

编辑:

我的问题最初已由@ Rabbid76回答,但仍有一种情况是他的算法无法正常工作.它没有正确处理从空白空间开始平移的情况(否则,当深度缓冲区值取远值= 1.0时).在3dsmax摄像机中,无论​​深度缓冲区的哪个值,都可以在所有情况下正确处理平移.

python opengl 3dsmax panning glm-math

9
推荐指数
2
解决办法
389
查看次数

如何在visual studio 2012中设置GLM库

我如何在visual studio 2012中设置GLM库

首先,我尝试将glm librar目录解压缩到我的VS 2012项目目录(包含glm库的目录名为glm-0.9.4.4).然后我试着添加glm-0.9.4.4

PROJECT - > properties - > VC++目录 - >包含目录

然后,当我尝试#include <glm/glm.hpp>在我的代码中使用包含时,我收到以下错误:

致命错误C1083:无法打开包含文件:'glm/glm.hpp':没有这样的文件或目录

如何正确设置GLM库以在我的代码中工作?

settings visual-studio glm-math

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

glm translate matrix不翻译矢量

我开始使用glm(在VS2010中)时遇到了一些非常简单的错误.我有这个简短的代码:

glm::mat4 translate = glm::translate(glm::mat4(1.f), glm::vec3(2.f, 0.f, 0.f));
glm::vec4 vector(1.f,1.f,1.f,0.f);
glm::vec4 transformedVector = translate * vector;
Run Code Online (Sandbox Code Playgroud)

transformedVector的结果与其原始值(1.f,1.f,1.f,0.f)相同.我不知道我在这里失踪了什么.我已经尝试了旋转矩阵,并且工作正常,点被正确转换.

glm::mat4 rotate = glm::rotate(glm::mat4(1.f), 90.f, glm::vec3(0.f, 0.f, 1.f));
glm::vec4 vector(1.f, 1.f, 1.f, 0.f);
glm::vec4 transformedVector = rotate * vector;
Run Code Online (Sandbox Code Playgroud)

好的,我发现了问题.我想翻译一个顶点而不是一个向量,在这种情况下我必须将w值设置为1.

c++ glm-math

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