球坐标系和旋转变换。在 c

问题描述 投票:0回答:1

我正在尝试将法线贴图应用于我的纹理。 我想找到法线贴图中每个向量的旋转角度,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,我期望结果与原始向量相同,但事实并非如此。此外,以其他角度旋转也不会产生预期的结果。

请帮我确定我可能缺少什么。

祝所有阅读本文的人新年快乐!”

c rotation raytracing spherical-coordinate
1个回答
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]
© www.soinside.com 2019 - 2024. All rights reserved.