0

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

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')

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

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

3

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

在此处输入图像描述

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

在此处输入图像描述

这些向量由下式给出:

在此处输入图像描述

法线简单地由这两个向量的叉积给出(未归一化):

在此处输入图像描述

经过一些非常乏味的代数,我们得到:

在此处输入图像描述

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


编辑

看来我使用了θ(与 +Z 轴的角度)的传统定义,而不是 Matlab 的elev. 重新定义方程,这将给出:

在此处输入图像描述

ψ = ½π - θ海拔在哪里。

于 2018-02-26T01:50:37.740 回答