点奇怪地旋转,我的计算有什么问题?
Points rotate oddly, what's wrong with my calculations?
这就是我想要得到的:
这就是我得到的:
当我使用这个公式时:
或者,更准确地说,这个 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); }
我没主意了。我做了我的数学计算,我的代码应该正确旋转,但显然它没有。谁能告诉我为什么以及如何解决它?
编辑:set/update 例程:
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
功能。
实际上,没有。问题出在 着色器 .
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,因此临时变量避免了这种情况。
在这个函数中
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);
}
您计算 *sin
和 *cos
的新值。但是 *cos
计算使用的是 *sin
的新值而不是其原始值。我会这样做,使用临时变量:
void tgle_rot(int i, float rad) {
float *sin = &global.objs[i].sinr, *cos = &global.objs[i].cosr;
float sindash, cosdash;
sindash = *sin * cosf(rad) + *cos * sinf(rad);
cosdash = *cos * cosf(rad) - *sin * sinf(rad);
*sin = sindash;
*cos = cosdash;
}
这就是我想要得到的:
这就是我得到的:
当我使用这个公式时:
或者,更准确地说,这个 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); }
我没主意了。我做了我的数学计算,我的代码应该正确旋转,但显然它没有。谁能告诉我为什么以及如何解决它?
编辑:set/update 例程:
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
功能。
实际上,没有。问题出在 着色器 .
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,因此临时变量避免了这种情况。
在这个函数中
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);
}
您计算 *sin
和 *cos
的新值。但是 *cos
计算使用的是 *sin
的新值而不是其原始值。我会这样做,使用临时变量:
void tgle_rot(int i, float rad) {
float *sin = &global.objs[i].sinr, *cos = &global.objs[i].cosr;
float sindash, cosdash;
sindash = *sin * cosf(rad) + *cos * sinf(rad);
cosdash = *cos * cosf(rad) - *sin * sinf(rad);
*sin = sindash;
*cos = cosdash;
}