我想使用以下等式变形球体:
R=1+k*(cos(4*elev)+sin(4*az))
,
球坐标elev
和az
被转移为gl_Vertex
。问题是计算这种变形的法线。我可以计算它们,只是移动一点az
,elev
获得 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')
在红色下方的数字上 - 正确的法线,我计算的洋红色。