可以参考之前的B样条曲线插值的方法。
要想利用控制点进行B样条曲面插值,前提是控制点不能是类似点云一样的无序点,一定要是分布在UV坐标空间中的栅格点。
方法就是首先对U方向进行B样条曲线插值,然后利用插值的结果再在V方向上进行B样条曲线插值即可。
下面用matlab自带的Peaks函数作为控制点为例编程。
matlab代码如下:
clear all;close all;clc; [x,y] = meshgrid(-3:0.3:3); z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ... - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ... - 1/3*exp(-(x+1).^2 - y.^2); plot3(x(:),y(:),z(:),'b.'); hold on; %%对行进行B样条插值 u = [];v = [];w = []; [H,~] = size(x); for k=1:H re=[]; for i=1:length(x(k,:))-2 for t=0:0.1:1 b0 = 1/2*(1-t)^2; b1 = 1/2*(-2*t^2+2*t+1); b2 = 1/2*t^2; x1=b0*x(k,i)+b1*x(k,i+1)+b2*x(k,i+2); y1=b0*y(k,i)+b1*y(k,i+1)+b2*y(k,i+2); z1=b0*z(k,i)+b1*z(k,i+1)+b2*z(k,i+2); re=[re [x1;y1;z1]]; end end u = [u ; re(1,:)]; v = [v ; re(2,:)]; w = [w ; re(3,:)]; end x = u;y = v;z = w; plot3(x(:),y(:),z(:),'g.'); %对列进行B样条插值 u=[];v=[];w=[]; [~,W] = size(x); for k=1:W re=[]; for i=1:length(x(:,k))-2 for t=0:0.1:1 b0 = 1/2*(1-t)^2; b1 = 1/2*(-2*t^2+2*t+1); b2 = 1/2*t^2; x1=b0*x(i,k)+b1*x(i+1,k)+b2*x(i+2,k); y1=b0*y(i,k)+b1*y(i+1,k)+b2*y(i+2,k); z1=b0*z(i,k)+b1*z(i+1,k)+b2*z(i+2,k); re=[re;x1 y1 z1]; end end u = [u re(:,1)]; v = [v re(:,2)]; w = [w re(:,3)]; end plot3(u(:),v(:),w(:),'r.');
结果如下:
其中蓝点为原始控制点,绿点为行方向插值结果,红点为列方向插值结果即最终结果。