点奇怪地旋转,我的计算出了什么问题?

用户名

这就是我想要得到的: 旋转方块

这就是我得到的:

错误旋转三角形

当我使用此公式时:

形式学

或者,更准确地说,此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:这是单行旋转:

线腐烂

解决方案:事实证明,问题在于转换的顺序。我先缩放,然后旋转。交换缩放比例和旋转可解决此问题。我没有添加缩放部分,因为我认为它对这个问题并不重要。原来我弄错了。现在,我正在找出原因。谢谢您的宝贵时间,我将tgle_rot根据您的建议更改功能。

实际上,不。问题是共享的-2.34365

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,因此临时变量可以避免这种情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我在python中找不到此圆跳动计算出了什么问题

来自分类Dev

我的AngularJS指令出了什么问题

来自分类Dev

我的清理功能出了什么问题?

来自分类Dev

我的循环内部出了什么问题?

来自分类Dev

我的查询出了什么问题

来自分类Dev

我的关系循环出了什么问题?

来自分类Dev

我的mysqli查询出了什么问题?

来自分类Dev

我的清洁功能出了什么问题?

来自分类Dev

我的更新查询出了什么问题

来自分类Dev

我的awk命令出了什么问题?

来自分类Dev

我的邮件功能出了什么问题?

来自分类Dev

Android:我的查询出了什么问题?

来自分类Dev

我的(密码)功能出了什么问题?

来自分类Dev

我的shell脚本出了什么问题

来自分类Dev

我的语法出了什么问题

来自分类Dev

我的Powershell脚本出了什么问题?

来自分类Dev

我的ffmpeg命令出了什么问题?

来自分类Dev

我的bash脚本出了什么问题?

来自分类Dev

我的grep命令出了什么问题?

来自分类Dev

我的查询出了什么问题?

来自分类Dev

up:我的配置出了什么问题?

来自分类Dev

我的SQLite查询出了什么问题?

来自分类Dev

我的bash脚本出了什么问题?

来自分类Dev

我的功能出了什么问题

来自分类Dev

我的排序算法出了什么问题?

来自分类Dev

我的js inarray()出了什么问题

来自分类Dev

lua regexp中发生了奇怪的事情,我的脚本出了什么问题?

来自分类Dev

我的记录器计算表达式出了什么问题?

来自分类Dev

我的记录器计算表达式出了什么问题?