我有一个相机类,它被初始化如下:
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) 我已经开始在我的代码中使用GLM库.看起来很不错但我做不到这样的事情:
void foo (const glm :: vec3 & arg);
foo ({x, y, z});
Run Code Online (Sandbox Code Playgroud)
因为构造函数都是显式的.
这开始惹恼了我.我想不出有理由禁止隐含构造这种简单的值类型.作者是否盲目地遵循一些无关紧要的格言,或者他们知道我不知道的事情吗?
我想传递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) 通过查看GLM 0.9.7的最新版本,我在任何地方都看不到FindGLM.cmake文件,过去常常在CMAKE中包含GLM.我总是可以使用在网上找到它的旧版本,但下面的提交让我难过:
https://github.com/g-truc/glm/commit/62a7daddcf082f754000fc5e42d7bcdf93c895f7
提交消息是"删除过时的FindGLM".那么,开发人员只是转储它还是实际上有一种在CMAKE中查找库的新方法?
我正在尝试使用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) 最近我正在进行骨骼动画导入,所以我用一些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) 基本上我试图弄清楚为什么编译器抱怨缺少 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) 我想通过四元数进行一些旋转。
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”就可以进行旋转。
这让我很困惑。