gpt4 book ai didi

c++ - OpenGL4 : Rotation looks all wrong

转载 作者:行者123 更新时间:2023-11-28 00:15:10 24 4
gpt4 key购买 nike

这是我正在绘制的四边形的顶点缓冲区信息:

static const GLfloat pv_quad[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
};

此四边形用于在屏幕上绘制二维帧作为图形用户界面的一部分。我用来执行此操作的类是 Mage::Interface::Frame。我将为您省去头文件定义,而是为您提供类的实现,因为它很小。这里有一些测试代码,所以忽略着色器是类的一部分这一事实。我知道它不应该在那里。

#include <Mage/Root.h>
#include <Mage/Interface/Frame.h>

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/transform.hpp>

using Mage::Interface::Frame;

Frame::Frame()
: width(300), height(200), position(0, 0), color(1.0, 1.0, 1.0), model(1.0), rotation(0) {
prog.compileFile("Data/Shaders/FrameVertex.glsl", Mage::ShaderType::VERTEX);
prog.compileFile("Data/Shaders/FrameFragment.glsl", Mage::ShaderType::FRAGMENT);
prog.link();

this->calcTransform();
}

void Frame::setSize(int w, int h) {
this->width = w;
this->height = h;
this->calcTransform();
}

void Frame::setColor(int r, int g, int b) {
this->color = glm::vec3(float(r) / 256, float(g) / 256, float(b) / 256);
}

void Frame::setRotation(float degrees) {
this->rotation = glm::radians(degrees);
this->calcTransform();
}

void Frame::calcTransform() {
this->model = glm::mat4(1.0f); // reset model to origin.
// 1280 and 720 are the viewport's size. This is only hard coded for tests.
this->model = glm::scale(this->model, glm::vec3(float(width) / 1280, float(height) / 720, 1.0f));
this->model = glm::rotate(this->model, this->rotation, glm::vec3(0.0f, 0.0f, 1.0f));
this->model = glm::translate(this->model, glm::vec3(position.x, position.y, 0.0f));
}

void Frame::draw() {
Mage::VertexObject obj = ROOT.getRenderWindow()->getVertexBufferObject()->getObject("PrimitiveQuad");

prog.use();
prog.setUniform("mvp", this->model);
prog.setUniform("fColor", this->color);

glEnableVertexAttribArray(0);
ROOT.getRenderWindow()->getVertexBufferObject()->bind();
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)obj.begin);
glDrawArrays(GL_TRIANGLE_STRIP, 0, obj.size);
glDisableVertexAttribArray(0);
}

这是每帧调用的绘图函数:

void RenderWindow::render() {
Mage::Interface::Frame F;

F.setSize(400, 200);
F.setRotation(0);

while (glfwWindowShouldClose(this->win) == 0) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

F.draw();

glfwSwapBuffers(this->win);
glfwPollEvents();
}
}

当我使用 setRotation(0) 时,生成的四边形确实是 400 像素宽和 200 像素高,正如您所期望的那样位于屏幕中央。

但是,如果我将旋转设置为 (90),那么,会发生这种情况:

enter image description here

如您所见,这根本不是接近 90 度的转弯。它应该是 400 像素高和 200 像素宽。

有人愿意解释这里发生了什么吗?

编辑: 一些尝试告诉我问题出在比例上,而不是旋转上。当我注释掉比例时,旋转似乎是正确的。

最佳答案

glm::rotate()angle 参数以弧度为单位,而不是度数:

m: Input matrix multiplied by this rotation matrix.

angle: Rotation angle expressed in radians.

axis: Rotation axis, recommanded [sic] to be normalized.

使用这个:

void Frame::setRotation(float degrees) {
this->rotation = glm::radians( degrees );
this->calcTransform();
}

关于c++ - OpenGL4 : Rotation looks all wrong,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30791589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com