c++ - (C++ 和 OpenGL)我试图在批处理渲染器中旋转一组顶点(它将模拟一个正方形),但它不是 100% 工作 :(

标签 c++ opengl glm-math indices vertex

我正在尝试旋转一个对象,或者批处理渲染器中的一组 4 个顶点(它是一个动态的,因此它可以随时更新它们的顶点和索引)。

我目前正在使用一种名为“Rodriguez Matrix”的方法,感谢 this StackExchange post,我学会了如何使用它

它工作得很好,但问题是批处理中所有对象的中心是 (0, 0, 0) 而不是它们自己的位置。 我在网上找不到解决方案,所以这是我第一次尝试在这里提问!

(我还使用一个名为 GLM 的库来转换对象)

所以这是代码,UpdateObject 方法由批处理在 for 循环中调用(因为那里有一组对象)所以我认为没有必要显示整个系统,但是是的“对象.cpp”,它保留了对象的所有信息(包含 Rodriguez 矩阵函数)

Object::Object(glm::vec3 pos, glm::vec3 rot, glm::vec3 sca)
        {
            position = pos;
            scale = sca;
            rotation = rot;
        }

        glm::mat3 rodriguesMatrix(const double degrees, const glm::vec3& axis) {
            glm::mat3 v = glm::mat3(
                axis.x * axis.x, axis.x * axis.y, axis.x * axis.z,
                axis.x * axis.y, axis.y * axis.y, axis.y * axis.z,
                axis.x * axis.z, axis.y * axis.z, axis.z * axis.z
            );

            glm::mat3 v2 = glm::mat3(
                0, -axis.z, axis.y,
                axis.z, 0, -axis.x,
                -axis.y, axis.x, 0
            );
            glm::mat3 cosMat(1.0f * cos(degrees * M_PI));
            v *= (1 - cos(degrees * M_PI));
            v2 *= sin(degrees * M_PI);

            glm::mat3 rotation = cosMat + v + v2;

            return rotation;
        }

        Vertex* Object::UpdateObject(Vertex* target)
        {
            glm::mat3 rotationMatrix;
            rotationMatrix = rodriguesMatrix(glm::radians(rotation.x), glm::vec3(1.f, 0.f, 0.f));
            rotationMatrix = rodriguesMatrix(glm::radians(rotation.y), glm::vec3(0.f, 1.f, 0.f));
            rotationMatrix = rodriguesMatrix(glm::radians(rotation.z), glm::vec3(0.f, 0.f, 1.f));


            float size = 1.0f;
            target->position = rotationMatrix * glm::vec3(position.x - 0.5f * scale.x, position.y + 0.5f * scale.y, position.z);
            target->color = glm::vec3(1.0f, 0.2f, 0.2f);
            target->texcoord = glm::vec2(0.0f, 1.0f);
            target++;

            target->position = rotationMatrix * glm::vec3(position.x - 0.5f * scale.x, position.y - 0.5f * scale.y, position.z);
            target->color = glm::vec3(0.2f, 1.0f, 0.2f);
            target->texcoord = glm::vec2(0.0f, 0.0f);
            target++;

            target->position = rotationMatrix * glm::vec3(position.x + 0.5f * scale.x, position.y - 0.5f * scale.y, position.z);
            target->color = glm::vec3(0.2f, 0.2f, 1.0f);
            target->texcoord = glm::vec2(1.0f, 0.0f);
            target++;

            target->position = rotationMatrix * glm::vec3(position.x + 0.5f * scale.x, position.y + 0.5f * scale.y, position.z);
            target->color = glm::vec3(1.0f, 1.0f, 0.2f);
            target->texcoord = glm::vec2(1.0f, 1.0f);
            target++;

            return target;
        }

顶点是一个包含 2 个“Vector3”的结构,一个用于位置,另一个用于颜色,还有一个用于纹理坐标的“Vector2”。

所以这就是问题所在,如果有人可以帮助我或给我一个答案,那就太好了:'D

最好的问候。纳乔:D

最佳答案

这是一个简单示例,说明如何使用平移和旋转矩阵围绕一个点旋转矩形。希望对您有所帮助:

#include <iostream>
#include <glm/glm.hpp>
#include <glm/ext.hpp>

void rotateRectangleAroundSomePoint(glm::vec3 vertices[4], float angle, glm::vec3 rotationCenter, glm::vec3 axis)
{
    const glm::mat4 translationMatrix = glm::translate(glm::identity<glm::mat4>(), -rotationCenter);
    const glm::mat4 rotationMatrix = glm::rotate(glm::identity<glm::mat4>(), angle, axis);
    const glm::mat4 reverseTranslationMatrix = glm::translate(glm::identity<glm::mat4>(), rotationCenter);

    for (size_t i = 0; i < 4; i++) {

        vertices[i] = glm::vec3(
                    reverseTranslationMatrix * rotationMatrix * translationMatrix * glm::vec4(vertices[i], 1.0f));
    }
}

int main()
{

    glm::vec3 rectangleVertices[4] =
    {
        glm::vec3(1.0f, 1.0f, 0.0f),
        glm::vec3(3.0f, 1.0f, 0.0f),
        glm::vec3(3.0f, 2.0f, 0.0f),
        glm::vec3(1.0f, 2.0f, 0.0f),
    };

    rotateRectangleAroundSomePoint(rectangleVertices,
                                   glm::radians(90.0f),
                                   glm::vec3(2.0f, 1.5f, 0.0),
                                   glm::vec3(0.0f, 0.0f ,1.0f));

    for (size_t i = 0; i < 4; i++) {
        std::cout
                << rectangleVertices[i].x << " , "
                << rectangleVertices[i].y << " , "
                << rectangleVertices[i].z << std::endl;
    }

    return 0;
}

关于c++ - (C++ 和 OpenGL)我试图在批处理渲染器中旋转一组顶点(它将模拟一个正方形),但它不是 100% 工作 :(,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63205847/

相关文章:

c++ - c++中static_cast是如何实现的?

c++ - 类中析构函数定义的 Collect2 错误

C++ 精确计时器 time.h boost::posix_time

c++ - 使用键旋转对象

c++ - 如何创建轮廓

C++ 类可以包含一组类中的一个,这些类都继承自一个公共(public)类

java - 模糊内核分离以进行两次渲染

c++ - 使用 Oculus SDK 渲染时出现黑屏

opengl - GL_DEPTH_TEST 和透明纹理的渲染故障

c++ - OpenGL 无缘无故地裁剪一个对象