我正在尝试将法线贴图应用于我的纹理。 我想找到法线贴图中每个向量的旋转角度,theta 和 phi(球坐标)。 我计划相应地旋转现有对象的法线向量这些角度。
我创建了一个函数来按 theta 和 phi 角度旋转向量。然而,它并没有按预期工作。”
下面的函数接受要旋转的向量的参数、旋转角度(theta 和 phi),并返回旋转后的向量。”
#include <stdio.h>
#include <math.h>
typedef struct {
double x;
double y;
double z;
} t_p3;
void print_p3(const char *prefix, const t_p3 *p) {
printf("%s [%lf, %lf, %lf]\n", prefix, p->x, p->y, p->z);
}
t_p3 rotate_vector(const t_p3 *vector, double theta, double phi) {
t_p3 result;
double r = sqrt(vector->x * vector->x + vector->y * vector->y + vector->z * vector->z);
double current_theta = atan2(vector->y, vector->x);
double current_phi = acos(vector->z / r);
double new_theta = current_theta + theta;
double new_phi = current_phi + phi;
result.x = r * sin(new_theta) * cos(new_phi);
result.y = r * sin(new_theta) * sin(new_phi);
result.z = r * cos(new_theta);
return result;
}
int main() {
t_p3 original_vector = {1, 1, 0};
double theta = 0.0;
double phi = 0.0;
t_p3 rotated_vector = rotate_vector(&original_vector, theta, phi);
print_p3("Original Vector: ",&original_vector);
print_p3("Rotated Vector: ", &rotated_vector);
return 0;
}
原始向量:[1.000000, 1.000000, 0.000000]
旋转向量:[0.000000, 1.000000, 1.000000]
即使theta和phi都设置为0,我期望结果与原始向量相同,但事实并非如此。此外,以其他角度旋转也不会产生预期的结果。
请帮我确定我可能缺少什么。
祝所有阅读本文的人新年快乐!”
您的功能有
new_phi
和 new_theta
从后到前 rotate_vector()
。result.x = r * sin(new_phi) * cos(new_theta);
result.y = r * sin(new_phi) * sin(new_theta);
result.z = r * cos(new_phi);
程序输出如下
Original Vector: [1.000000, 1.000000, 0.000000]
Rotated Vector: [1.000000, 1.000000, 0.000000]