计算参数变形球体的顶点法线

Calculate vertex normals for parametrically morphed sphere

我想变形球体,使用以下等式:

R=1+k*(cos(4*elev)+sin(4*az)),

球坐标 elevaz 被传送为 gl_Vertex。问题是计算这种变形的法线。我可能会计算它们,只是稍微移动 azelev,获得 2 个更多的“虚拟”顶点并使用带有叉积的标准方法,但它看起来相当丑陋和昂贵的方法。

对于这种变形,他们有什么方法可以参数化地计算法线吗?

更新:

感谢@meowgoesthedog,但我仍然有问题。我对这个公式(下面的代码)的实现不起作用:

我说得对吗,应该是:

cos(theta)*(k*(cos(4*theta)+sin(4*phi))+1)cos(theta*(k*(cos(4*theta)+sin(4*phi))+1))?

法线是在笛卡尔坐标系中计算的吗?

我在 Matlab 中的代码:

close all
clear all
N=100;
phi_range=linspace(-pi,pi,N+2);
theta_range=linspace(-pi/2,pi/2,N);
phi_range([1,end])=[];
k=6;
% generate morphed sphere
PHI=repmat(phi_range,N,1);
THETA=repmat(theta_range',1,N);
R=1+k*cos(4*THETA)+k*sin(4*PHI);
% convert to cartesian coordinates
[X,Y,Z]=sph2cart(PHI,THETA,R);
%% meowgoesthedog formula
S=k.*(cos(4.*THETA)+sin(4.*PHI))+1;
V1_x = cos(PHI).*(cos(THETA).*S-4.*k.*sin(THETA).*sin(4.*THETA));
V1_y = sin(PHI).*(cos(THETA).*S-4.*k.*sin(THETA).*sin(4.*THETA));
V1_z = -sin(THETA).*S-4.*k.*sin(4.*THETA).*cos(THETA);

V2_x = sin(THETA).*(4.*k.*cos(PHI).*cos(4.*PHI)-sin(PHI).*S);
V2_y = sin(THETA).*(4.*k.*sin(PHI).*cos(4.*PHI)+cos(PHI).*S);
V2_z = 4.*k.*cos(THETA).*cos(4.*THETA);

V1=cat(3,V1_x,V1_y,V1_z);
V2=cat(3,V2_x,V2_y,V2_z);

Normals=cross(V1,V2);
% normalize
Normals=Normals./sqrt(sum(Normals.^2,3));
%% plot and compare results:
hold all
surfnorm(X,Y,Z,'EdgeAlpha',0.5)
quiver3(X,Y,Z,Normals(:,:,1),Normals(:,:,2),Normals(:,:,3),'m')

在红色下方的图形上 - 正确的法线,我计算的洋红色。

我们可以使用微分几何计算法线的解析表达式。先说一下笛卡尔参数坐标的形式:

在表面上的任何一点上,都有一个二维坐标系,单位向量在θφ增加的方向上跨越。

这些向量由:

法线由这两个向量 (un-normalized) 的 cross-product 给出:

经过一些非常繁琐的代数运算后,我们得到:

(公式变得太长,无法清晰地显示超过这一点,并且可能无法有效地评估。)


编辑

看来我使用了θ(与+Z轴的角度)的常规定义,而不是Matlab的elev。重新定义方程式:

其中 ψ = ½π - θ 是海拔高度。