c - 点奇怪地旋转,我的计算有什么问题?

标签 c opengl rotation glsl trigonometry

这是我想要得到的: rotating square

这就是我得到的:

Wrongly rotating triangle

当我使用这个公式时:

formualae

或者,更准确地说,这个 GLSL 顶点着色器代码:

#version 330
layout (location = 0) in vec2 pos;
layout (location = 1) in vec3 clr;
uniform float sinr, cosr;
float x, y;
out vec3 color;
void main() {
    color = clr;
    x = pos.x * cosr - pos.y * sinr;
    y = pos.x * sinr + pos.y * cosr;
    gl_Position = vec4(x, y, 0.0, 1.0); }

我没主意了。我做了我的数学计算,我的代码应该正确旋转,但显然它没有。谁能告诉我为什么以及如何解决它?

编辑:设置/更新例程:

void tgle_rot(int i, float rad) {
    float *sin = &global.objs[i].sinr, *cos = &global.objs[i].cosr;
    *sin = *sin * cosf(rad) + *cos * sinf(rad);
    *cos = *cos * cosf(rad) - *sin * sinf(rad); }

void callback(void) {
    tgle_rot(0, 0.01); }

static void run_draw(void) {
    /* ... */
    for(int i = 0; i < global.num_objs; ++i) {
        /* ... */
        glUniform1f(global.shader.sinr, global.objs[i].sinr);
        glUniform1f(global.shader.cosr, global.objs[i].cosr);
        /* ... */ }
    /* ... */
    glfwSwapBuffers(global.window); }

编辑 2:问题不在 tgle_rot 内!我已经将其更改为

void tgle_rot(int i, float rad) {
    float *sin = &global.objs[i].sinr, *cos = &global.objs[i].cosr;
    static float rotation = 0;
    rotation += 0.01;
    *sin = sinf(rotation);
    *cos = cosf(rotation); }

并且程序行为没有改变!

编辑 3:这是单行旋转:

line rot

解决方案:原来问题出在转换的顺序上。我先缩放然后旋转。交换缩放和旋转解决了这个问题。我没有添加缩放部分,因为我认为这对问题并不重要。原来我错了。现在我正在弄清楚为什么。谢谢你的时间,我会根​​据你的建议修改我的tgle_rot函数。

实际上,没有。问题在于着色器

void main() {
        color = clr;
        x = x * cosr - y * sinr;
        y = x * sinr + y * cosr; // using modified x!!!
        gl_Position = vec4(x, y, 0.0, 1.0);

最佳答案

这是一个猜测,因为我无法尝试,但改变......

void tgle_rot(int i, float rad) {
    float *sin = &global.objs[i].sinr, *cos = &global.objs[i].cosr;
    *sin = *sin * cosf(rad) + *cos * sinf(rad);
    *cos = *cos * cosf(rad) - *sin * sinf(rad); }

到...

void tgle_rot(int i, float rad) {
    float *sin = &global.objs[i].sinr, *cos = &global.objs[i].cosr;
    float tmpSin = *sin, tmpCos = *cos;
    *sin = tmpSin * cosf(rad) + tmpCos * sinf(rad);
    *cos = tmpCos * cosf(rad) - tmpSin * sinf(rad); }

您在 Cos 计算中使用修改后的 Sin,因此临时变量避免了这种情况。

关于c - 点奇怪地旋转,我的计算有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32762669/

相关文章:

c - 如何将纹理存储在内存中并渲染其中的一小部分

java - 如何在不使用微 Controller 的情况下使用 Java/.net/c 旋转电机

c++ - OpenCV 计算相机位置和旋转

C - 如何将三个数字相加?

python - Blender 是用什么创建的?

c - 相等比较 DBL_MIN 或 DBL_MAX 是否安全?

c++ - glm 在简单翻译中返回 nan

jquery - 如何让 4 个元素围成一圈旋转?

c++ - 使用不同的字符编码

如果新尺寸更小,realloc 可以移动指针吗?